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
MONITORmenunjukkan blocking commands. - Retry spike karena job masuk ke state processing tapi tidak selesai.
- Redis blocking command seperti
BLPOPmenunggu terlalu lama atauSETNXdiulang 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 --latencysaat 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:
- Tambahkan correlation ID pada job payload.
- Log setiap panggilan
SETNX,GET,DELdengan nama job dan worker. - 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
DELdijalankan. - 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_latencydanworker_lock_wait_timelewat 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:
- Review queue backlog; identifikasi job yang gagal dan pastikan tidak diduplikasi.
- Periksa log Redis untuk operasi lock terakhir (
redis-cli MONITORatauSLOWLOG). - Tinjau retry policy—pastikan tidak mengulang job yang sudah berjalan lama.
- Evaluasi TTL lock: sesuaikan jika terlalu pendek/panjang.
- Perbarui dokumentasi observability dengan metrik baru dan thresholds.
- 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- hitungSET/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.
Komentar
0 komentar
Masuk ke akun kamu untuk ikut berkomentar.
Belum ada komentar
Jadilah yang pertama ikut berdiskusi!