D
Engineering

Follow-up Scheduler

Redis + BullMQ queue followUpAi. Producer scheduler/workerService.js enqueue delayed job. Worker scheduler/worker/worker.js re-check order/payment sebelum kirim WhatsApp. Graceful degradation tanpa Redis.

Engine Bot menjadwalkan follow-up pesan WhatsApp via Redis + BullMQ. Producer mengenqueue delayed job, worker memproses dengan re-check order/payment sebelum mengirim.

Processes

Produksi membutuhkan dua process:

bash
node app.js                          # HTTP server + producer
node scheduler/worker/worker.js      # follow-up worker (consumer)

Redis dan BullMQ

KomponenNilai
Queue namefollowUpAi
Job namesend_message
Job ID${wa_customer}_${store_id}
Delaysending_time * 60 * 1000 (menit → ms)
Satuan sending_timemenit
Worker concurrency10

Producer

  • Path: scheduler/workerService.js
  • Job ID: ${wa_customer}_${store_id}
  • Satu delayed/waiting job per customer/store diganti oleh schedule baru — job lama di-overwrite.

Worker

  • Path: scheduler/worker/worker.js
  • Concurrency: 10
  • Re-check payment/proof sebelum pengiriman — bila order sudah paid atau cancelled, job dilewati.
  • Kirim text terlebih dahulu, lalu optional image.

Follow-up Configuration

Config berada di agents.followup (lihat Agents Schema):

text
call_to_order
ask_product_qty
ask_shipping_address
ask_shipping_method
ask_payment_method
confirm_order
payment_reminder

Setiap config memiliki:

FieldTipeFungsi
messagestringMustache template
is_generate_aibooleanoptional AI rewrite via gpt-4o-mini
sending_timenumberDelay dalam menit
imagestringoptional attachment URL
fileNamestringTemplate file reference

Graceful Degradation

Jika Redis tidak tersedia saat scheduling:

  • Core chatbot tetap berjalan.
  • MongoDB/order/payment flow tetap dapat berjalan.
  • Follow-up baru dilewati dan hanya dicatat di log.
  • Worker tidak memproses delayed jobs.

Producer dan worker berhenti retry setelah lebih dari tiga retry attempts. Redis health client tidak retry setelah initial failure. Automatic recovery tanpa process restart tidak dijamin.

Health Check

bash
curl http://localhost:1313/health

Response:

json
{
  "status": "ok",
  "service": "engine-bot",
  "redis": {
    "healthy": true,
    "message": "Redis is available - follow-up messages enabled",
    "timestamp": "..."
  },
  "timestamp": "..."
}

Failure Runbook

Redis Down

  1. Cek /health dan log [REDIS]/[WORKER].
  2. Pulihkan Redis service.
  3. Restart app dan worker karena retry memiliki batas.
  4. Verifikasi producer dapat menambah job dan worker menyelesaikannya.
  5. Cek pending orders yang kehilangan follow-up saat outage.

Worker Down

  1. Cek PM2 process worker-followupai (production) / worker-followupai-dev (staging).
  2. Restart worker sesuai environment.
  3. Cek queue delayed/waiting/failed di Redis.
  4. Verifikasi messaging API (BASE_URL_SEND_MESSAGE) reachable.

MongoDB Down

  1. Cek MongoDB langsung — /health tidak mendeteksinya.
  2. Pulihkan koneksi sebelum menerima traffic.
  3. Restart app jika startup sebelumnya gagal.
  4. Audit partial order writes karena checkout belum transactional.

DazoApp Payment Down

  1. Nonaktifkan instant_payment pada store settings bila outage panjang.
  2. Pertahankan metode lain yang aman dan aktif.
  3. Cek timeout/error log [INSTANT_PAYMENT].
  4. Rekonsiliasi order pending setelah DazoApp pulih.

Deployment Caveats

  • Workflow memakai npm install --legacy-peer-deps; lockfile saat ini di-ignore.
  • Step install workflow tidak menetapkan working-directory ke project deployment.
  • Automated tests belum tersedia.
  • Syntax check manual: node --check <file>.

Lihat CI/CD untuk detail workflow.

Langkah berikutnya