تكرار السؤال: …
الإجابة المختصرة
بتخزين معرف الحدث الفريد (Event ID) في قاعدة بيانات بحقل فريد ضمن معاملة ذرية، للتأكد من أن معالجة الرسالة عدة مرات تنتج نفس النتيجة ولا تكرر التأثيرات.
الشرح
في أنظمة الرسائل مثل Kafka أو RabbitMQ أو Webhooks، تضمن المنظومة تسليم الرسالة 'مرة واحدة على الأقل' (At-least-once delivery). قد تؤدي إعادة المحاولة أو انقطاع الشبكة إلى استلام نفس الحدث مرتين. لتحقيق الـ Idempotency، يتم فحص جدول processed_events بواسطة معرف الرسالة قبل المعالجة؛ فإذا كان مسجلاً بالفعل، يتم تجاهل الرسالة بنجاح دون تنفيذ أي عمليات مالية أو تعديلات مكررة.
مثال بالكود
// نمط التحقق الذري من معرف الحدث
const processed = await db.query(
"INSERT INTO processed_events (event_id) VALUES ($1) ON CONFLICT DO NOTHING RETURNING event_id",
[eventId]
);
if (processed.rows.length === 0) {
return console.log("Event already handled, skipping");
}أخطاء شائعة
- الاعتماد على افتراض أن أنظمة الرسائل لن تسلم نفس الرسالة مطلقاً أكثر من مرة.