میتونید مشکل این کد رو پیدا کنید؟ 🧐
پیدا کردنش یه چیزه. چطور حلش میکنید؟
😈اینجا نقطهایه که همه چیز خراب میشه:
شما یک کاربر رو در دیتابیس ذخیره میکنید.
بعد یه ایمیل خوشآمدگویی میفرستید.
و بعد یه پیام رو برای یه سرویس دیگه منتشر میکنید.
اینها سه تا عملیات مجزا هستن و هر کدومشون ممکنه شکست بخوره.
حالا سیستم شما در یک وضعیت عجیب و ناسازگار (inconsistent) قرار میگیره:
• کاربر ذخیره شده، ولی ایمیل هرگز ارسال نشده.
• یا پیام در صف قرار نگرفته.
• یا عملیات رو دوباره تکرار کردید و همه چیز دو بار انجام شده!
وضعیت به سرعت بهمریخته و پیچیده میشه.
راه حل: الگوی Outbox 📬
الگوی Outbox به شما کمک میکنه از این مشکل جلوگیری کنید.
این الگو اینجوری کار میکنه:
1️⃣ یک تراکنش (transaction) دیتابیس رو شروع کنید.
2️⃣ کاربر رو ذخیره کنید.
3️⃣ قصدِ ارسال ایمیل و انتشار پیام رو در یک جدول به نام Outbox (صندوق خروجی) درج کنید.
4️⃣ تراکنش رو Commit کنید.
بعداً، یک سرویس پسزمینه (background service) این رکوردهای Outbox رو برمیداره و اونها رو به صورت قابل اطمینان و با مکانیزم تلاش مجدد (retry) پردازش میکنه.
✨️ نتیجه نهایی:
حالا، تمام این مراحل با هم موفق میشن، یا هیچکدومشون انجام نمیشن.
عملیات نوشتن در دیتابیس شما اتمیک (atomic) هست. دلیلی نداره که جریانهای کاری شما هم اتمیک نباشن.