နားလည်ထားရမယ့် အချက်
Stream job queue ကို at-least-once delivery အဖြစ်ဒီဇိုင်းလုပ်ရပါတယ်။ Job payload သေးသေးနဲ့ immutable IDs ပို့၊ durable details ကို DB မှဖတ်၊ side effects ကို idempotency key ဖြင့်ကာကွယ်ရပါတယ်။ Retry count၊ exponential backoff၊ poison-message dead letter၊ pending reclaim နဲ့ retention လိုပါတယ်။
လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်
Email worker group တည်ဆောက်ပြီး `BLOCK` read၊ bounded concurrency၊ send success နောက် ACK လုပ်မယ်။ Failure count ကို metadata/hash ထဲတိုး၊ threshold ကျော်လျှင် dead-letter stream သို့ original ID/reason ထည့်ပြီး ACK လုပ်မယ်။ Shutdown တွင် new reads ရပ်၊ in-flight jobs finish/leave pending လုပ်မယ်။
အတူတူ စမ်းရေးကြည့်မယ်
const jobs = await redis.xReadGroup('emailers', workerId,
[{ key: 'stream:email', id: '>' }], { COUNT: 10, BLOCK: 5000 });
for (const job of jobs ?? []) {
await withIdempotency(job.id, () => sendEmail(job.message));
await redis.xAck('stream:email', 'emailers', job.id);
}Crash recovery လုပ်နိုင်ပြီး duplicate side effects ကိုကာကွယ်ထားသော worker ရမည်။၅ မိနစ် စမ်းကြည့်
Retry 3 ကြိမ်နောက် DLQ သို့ပို့သော flow နဲ့ operator replay checklist ရေးပါ။
သတိလေးတစ်ချက်
Stream trim ကို pending entries မစဉ်းစားဘဲ aggressive လုပ်ရင် recovery လို message data ပျောက်နိုင်ပါတယ်။
Redis — Streams — Redis