Locking pada worker queue yang memanfaatkan cache Redis membuat throughput turun dan job tertunda, bahkan saat worker berjalan secara normal. Artikel ini langsung menjawab gejala yang perlu dikenali, metrik serta tracing yang dapat digunakan untuk diagnosis, faktor konsistensi seperti visibility timeout, dan langkah mitigasi spesifik agar queue kembali stabil.

Gejala Umum Locking Worker Queue

Locking tidak selalu terlihat dari crash. Beberapa gejala yang perlu dipantau:

  • Job pending lama di dashboard queue padahal worker sehat.
  • Latensi eksekusi bertambah saat worker membaca cache; redis-cli MONITOR menunjukkan blocking commands.
  • Retry spike karena job masuk ke state processing tapi tidak selesai.
  • Redis blocking command seperti BLPOP menunggu terlalu lama atau SETNX diulang terus.

Gejala ini menunjukkan worker menunggu lock atau mengeksekusi job yang tidak selesai akibat state inconsistency.

Metrik dan Log untuk Diagnosis

Gunakan kombinasi metrik dan log untuk melihat locking.

Metrik Redis dan Queue

  • Blocked_clients di INFO: meningkat saat banyak lock.
  • Commands per second untuk SETNX/DEL/HGETALL: perubahan mendadak berarti locking retry.
  • Latency dari redis-cli --latency saat worker aktif.
  • Queue depth dan processing rate di sistem queue (Sidekiq, RabbitMQ, dll.).

Log Worker dan Cache

  • Timestamp saat job mulai/selesai, termasuk status lock request.
  • Trace ID di header job untuk mengaitkan log worker dengan operasi Redis.
  • Kesalahan timeout atau retry count di log Redis client.

Tracing Job yang Terlibat Lock

Tracing membantu menghubungkan job yang menunggu lock dengan proses yang memegangnya:

  1. Tambahkan correlation ID pada job payload.
  2. Log setiap panggilan SETNX, GET, DEL dengan nama job dan worker.
  3. Gunakan distributed tracing (OpenTelemetry/Jaeger) untuk melihat durasi Redis call.

Dengan tracing, bisa diketahui apakah job gagal menyelesaikan karena proses lain memegang lock terlalu lama.

Penyebab Konsistensi dan Visibility Timeout

Stuck job sering terkait visibility timeout yang tidak selaras dengan durasi eksekusi:

  • Visibility timeout terlalu pendek membuat worker dianggap gagal sebelum job selesai, memicu job baru mengambil lock padahal yang lama masih berjalan.
  • State lock tidak dilepas akibat exception sebelum DEL dijalankan.
  • Multiple worker menunggu lock yang tidak pernah dilepas karena TTL tidak diset saat SETNX.

Pastikan visibility timeout lebih panjang dari waktu eksekusi rata-rata plus margin, dan gunakan TTL untuk lock.

Mitigasi Langsung

Berikut langkah praktis untuk mengurangi locking:

1. Locking Redis dengan TTL

Gunakan pattern SET resource-name value NX PX timeout agar otomatis terlepas jika worker crash.

redis-cli SET worker:job:123 locked NX PX 30000

Terapkan script Lua untuk release aman:

redis-cli EVAL "if redis.call('GET',KEYS[1]) == ARGV[1] then return redis.call('DEL',KEYS[1]) else return 0 end" 1 worker:job:123 worker-1

2. Retry dan Backoff yang Terukur

Implementasikan retry dengan exponential backoff + jitter agar tidak membanjiri Redis. Pastikan job tidak langsung retry tanpa jeda jika lock gagal diperoleh.

3. Observability dan Alerta

  • Alert saat blocked clients > baseline.
  • Alert saat job queue depth meningkat > threshold.
  • Monitor redis_latency dan worker_lock_wait_time lewat APM.

4. TTL dan Watchdog

Jika job panjang, worker dapat memperpanjang TTL sebelum habis (watchdog). Pastikan ada pemeriksaan apakah job masih berlangsung sebelum refresh.

Checklist Pasca-Insiden

Setelah locking diatasi, lakukan langkah berikut:

  1. Review queue backlog; identifikasi job yang gagal dan pastikan tidak diduplikasi.
  2. Periksa log Redis untuk operasi lock terakhir (redis-cli MONITOR atau SLOWLOG).
  3. Tinjau retry policy—pastikan tidak mengulang job yang sudah berjalan lama.
  4. Evaluasi TTL lock: sesuaikan jika terlalu pendek/panjang.
  5. Perbarui dokumentasi observability dengan metrik baru dan thresholds.
  6. Jalankan post-mortem dengan timeline, akar masalah, dan tindakan perbaikan.

Checklist ini menjamin tidak hanya resolusi teknis tapi juga peningkatan proses.

Contoh Perintah redis-cli untuk Diagnosis

Beberapa perintah dasar untuk melihat status lock:

  • redis-cli INFO server - status instance.
  • redis-cli INFO commandstats - hitung SET/SETNX.
  • redis-cli CLIENT LIST - jumlah koneksi blocking.
  • redis-cli MONITOR - cek real-time command lock; hentikan setelah selesai.
  • redis-cli GET worker:job:123 - status lock spesifik.
  • redis-cli TTL worker:job:123 - sisa timeout lock.

Gunakan redis-cli EVAL script release lock jika worker gagal.