ویرگول
ورودثبت نام
Saeid Noormohammadi
Saeid Noormohammadi
خواندن ۳ دقیقه·۸ روز پیش

مدیریت مطمئن رویدادها با استفاده از Outbox Pattern

پترن Outbox یکی از مهم ترین و کاربردی ترین پترن ها در سیستم های توزیع شده می باشد که به ما کمک می کند تا از دست رفتن رویدادها و عدم تطابق وضعیت در دیتابیس و پیام های ارسالی جلوگیری کنیم. خیلی از اوقات نیاز داریم که به صورت همزمان یک داده ای را در دیتابیس ذخیره کنیم و سپس یک رویداد را هم ارسال کنیم, خب حالا در این شرایط فکر کنید که شما داده را ذخیره کرده ولی موفق نشده اید رویداد را ارسال کنید یا رویداد را ارسال کرده و موفق نشده اید داده را ذخیره کنید. این باعث inconsistency و مشکلات دیگر در سیستم می شود.

برای مثال دیجی پی را در نظر بگیرید, وقتی کاربر با استفاده از آن یک تراکنشی را انجام می دهد, داده های مربوط به تراکنش باید به چندین سرویس دیگر مثل Finance, Notification و... ارسال شوند. بیایید ببینیم سناریو به چه شکل می باشد:
1- بعد از انجام تراکنش ابتدا اطلاعات مربوط به آن (مبلغ, زمان, مالیات) در دیتابیس ذخیره می شوند.
2- باید یک رویداد به سرویس های Finance و Notification ارسال شود.

حالا فرض کنید به هر دلیلی ارسال رویداد با مشکل مواجه شود! اینجاست که تراکنش انجام شده ولی سرویس Finance و Notification هیچ اطلاعی از تراکنش ندارند. این اتفاق باعث inconsistency, مشکلات مالی, عدم اطلاع رسانی و... می شود. در اینجا Outbox Pattern به کمک می آید:
1- زمانی که اطلاعات تراکنش داخل دیتابیس ذخیره می شود, رویداد مربوط به آن هم داخل یک تیبل (outbox) ذخیره می شود. این کار با به صورت اتمیک انجام می شود تا اگر عملیات ذخیره سازی تراکنش موفق بود رویداد هم ذخیره شود.
2- یک سرویس به صورت دوره ای تیبل outbox رو اسکن کرده و رویدادهای ذخیره شده را ارسال می کند. اگر ارسال موفق باشد آن را از تیبل حذف کرده یا تغییر وضعیت می دهد.

مزایا استفاده Outbox pattern در سناریو بالا
اتمیک بودن عملیات ها: داده های تراکنش و رویداد مربوط هر دو در یک تراکنش ذخیره می شوند. پس داده های ذخیره شده و رویدادهای ارسالی هماهنگ هستند.
مدیریت خطاها: اگر به هر دلیلی ارسال رویداد با مشکل مواجه شود, به دلیل ذخیره سازی رویداد در تیبل outbox, تا زمانی که مشکل ارسال برطرف نشود رویداد همچنان در دسترس می باشد.
قابلیت اطمینان بالا: با توجه به ذخیره سازی رویدادها تا زمان ارسال موفق, فرایندها بدون مشکل اجرا می شوند و هیچ رویدادی از دست نمیرود.

چالش ها
پیچیدگی: اضافه کردن این پترن نیاز به یک job یا service اضافی برای مدیریت رویدادها دارد که می تواند پیچیدگی سیستم را افزایش دهد.
مقیاس پذیری: در سیستم های بزرگ با حجم زیادی از رویدادها مواجه می باشیم که اگر به درستی مدیریت نشوند کارایی سیستم کاهش پیدا می کند.

جزئیات فنی
جزئیات تیبل Outbox: معمولا در یک ساختار ساده از فیلدهایی مانند event_id, payload, status, created_at, updated_at استفاده می شود.
تراکنش اتمیک: همانطور که بالاتر توضیح داده شد, عملیات ذخیره سازی دادها و رویدادها باید به شکل اتمیک انجام شود.
ارسال رویداد: نیاز به یک job داریم که به صورت دوره ای یا real-time رویدادها را ارسال کند. در صورت موفقیت آن را حذف کرده یا تغییر وضعیت دهد.

outbox pattern
شاید از این پست‌ها خوشتان بیاید