Replay Strategy

Replay Strategy #

Kenapa Penting, Masalah yang Diselesaikan, dan Best Practice Implementasinya

Dalam dunia distributed systems, kegagalan bukanlah kemungkinan — melainkan kepastian. Network timeout, service crash, message duplication, partial failure, hingga human error adalah bagian dari keseharian sistem modern. Di sinilah Replay Strategy memegang peran krusial.

Artikel ini akan membahas:

  1. Apa itu Replay Strategy
  2. Kenapa Replay Strategy penting
  3. Masalah nyata yang diselesaikan Replay Strategy
  4. Jenis-jenis Replay Strategy
  5. Best practice implementasi Replay Strategy
  6. Contoh kasus nyata di sistem produksi

Apa Itu Replay Strategy? #

Replay Strategy adalah pendekatan dalam sistem software untuk memproses ulang (replay) event, message, atau request yang gagal diproses, belum selesai, atau perlu diverifikasi ulang, tanpa menyebabkan efek samping yang tidak diinginkan.

Replay bisa terjadi pada:

  • Event (Kafka, Pub/Sub, EventBridge)
  • Message Queue (SQS, RabbitMQ)
  • HTTP request
  • Command dalam CQRS
  • Job async / background task

Intinya:

Replay Strategy memastikan sistem bisa “mengulang” proses dengan aman dan deterministik.


Kenapa Penting? #

Kegagalan Bersifat Inevitable #

Di sistem terdistribusi:

  • Network akan timeout
  • Service akan down
  • Database akan overload
  • Consumer akan crash

Tanpa replay, kegagalan berarti data hilang atau state rusak.


Menjamin Reliability dan Durability #

Replay memungkinkan:

  • Data tidak hilang meskipun consumer mati
  • Proses dapat dilanjutkan setelah crash
  • Recovery tanpa manual intervention

Ini adalah fondasi dari:

  • At-least-once delivery
  • Eventually consistent systems

Debugging & Incident Recovery #

Replay bukan hanya untuk error:

  • Reprocess event lama setelah bug fix
  • Audit ulang transaksi
  • Rebuild read model (CQRS)
  • Re-sync data antar sistem

Masalah yang Diselesaikan #

Tanpa Replay Strategy #

  • Event gagal → data hilang
  • Manual rerun script (riskan)
  • Duplicate processing → double charge
  • Tidak bisa recovery otomatis

Dengan Replay Strategy #

  • Event gagal → retry atau dead-letter
  • Duplicate → ditangani idempotency
  • Bisa reprocess kapan saja
  • Sistem lebih predictable

Jenis-Jenis #

Retry (Immediate Replay) #

Memproses ulang event secara langsung ketika gagal.

Contoh:

  • Retry 3x
  • Backoff 1s → 5s → 30s

⚠️ Risiko:

  • Retry storm
  • Membebani downstream service

Delayed Retry / Backoff Replay #

Replay dilakukan setelah delay tertentu.

Best practice:

  • Exponential backoff
  • Jitter (random delay)

Cocok untuk:

  • Transient failure
  • Rate limit issue

Dead Letter Queue (DLQ) #

Jika gagal terus, event dipindahkan ke DLQ.

Manfaat:

  • Tidak menghambat consumer utama
  • Bisa dianalisis manual
  • Bisa direplay secara selektif

Ini best practice wajib di sistem event-driven.


Manual Replay #

Event disimpan dan bisa diputar ulang secara manual:

  • Berdasarkan timestamp
  • Berdasarkan event ID
  • Berdasarkan partition / offset

Umum di:

  • Kafka
  • Event sourcing
  • Financial systems

Event Sourcing Replay #

Dalam event sourcing:

  • Replay = membangun ulang state
  • Event adalah source of truth

Digunakan untuk:

  • Rebuild projection
  • Migrasi schema
  • Bug fixing logic

Tantangan Utama #

Duplicate Processing #

Replay hampir selalu menyebabkan duplicate event.

Solusi:

  • Idempotency
  • Deduplication key
  • Exactly-once illusion (bukan real)

Ordering #

Replay bisa mengubah urutan event.

Solusi:

  • Partition key
  • Sequence number
  • Versioning

Side Effects #

Replay bisa:

  • Mengirim email ulang
  • Double charge payment
  • Trigger webhook lagi

Solusi:

  • Pisahkan command dan side effect
  • Gunakan state check

Best Practice #

Kombinasi Replay + Idempotency #

Replay tanpa idempotency = bencana.

Contoh idempotency key:

  • order_id
  • event_id
  • request_id

Pattern:

IF already_processed(event_id):
    skip
ELSE:
    process

Simpan Event Secara Durable #

  • Jangan hanya rely on memory
  • Gunakan persistent storage
  • Event harus bisa direplay kapan saja

Pisahkan Retry dan DLQ #

Rule umum:

  • Retry → untuk transient error
  • DLQ → untuk logical / permanent error

Replay Otomatis Tanpa Kontrol (❌) #

Replay massal bisa:

  • Overload system
  • Mengganggu live traffic

Gunakan:

  • Throttling
  • Batch replay
  • Feature flag

Logging dan Observability Wajib #

Replay tanpa visibility = blind operation.

Minimal:

  • Log replay reason
  • Metric retry count
  • Trace replayed event

Contoh Kasus Nyata #

Kasus: Payment Processing #

Flow:

  1. Order dibuat
  2. Event PaymentRequested
  3. Payment gateway timeout

Tanpa replay:

  • Order stuck
  • Customer bingung

Dengan replay:

  • Event masuk retry
  • Jika gagal → DLQ
  • Setelah gateway normal → replay DLQ
  • Idempotency memastikan tidak double charge

Replay Strategy ≠ Retry Saja #

Ini kesalahan umum engineer junior.

Replay Strategy adalah:

  • Design decision
  • Architectural concern
  • Operational tool

Bukan sekadar:

for i := 0; i < 3; i++ { retry() }

Penutup #

Replay Strategy adalah fondasi penting dalam sistem modern karena:

  • Kegagalan tidak bisa dihindari
  • Sistem harus bisa recovery
  • Data tidak boleh hilang
  • Operasional harus terkendali

Tanpa replay strategy:

Sistem Anda bukan “distributed system”, tapi “distributed failure”.

Dengan replay strategy yang baik:

  • Sistem lebih resilient
  • Debugging lebih mudah
  • Engineer lebih tenang 😄
About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact