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 تضمین میکنند.
