CodeShot
Seniorسختی 4 از ۵· در 20٪ مصاحبه‌های این حوزه پرسیده شده

چرا پردازش پیام باید Idempotent باشد؟

نشان کردن

پاسخ کوتاه

چون اکثر Message Broker ها تضمین At-least-once می‌دهند، یعنی ممکن است یک پیام بیش از یک‌بار تحویل داده شود.

پاسخ کامل

اگر Consumer یک پیام را دوبار پردازش کند و عملیات Idempotent نباشد (مثلاً دوبار کسر موجودی)، داده خراب می‌شود. راه‌حل رایج، ذخیرهٔ شناسهٔ پیام‌های پردازش‌شده و رد‌کردن پیام‌های تکراری است.

مثال کد

csharp\nif (await db.ProcessedMessages.AnyAsync(m => m.Id == msg.Id)) return;\n

نکته مهم

فرض این‌که Message Broker تضمین Exactly-once می‌دهد؛ اکثر آن‌ها فقط At-least-once تضمین می‌کنند.