در معماری Event Driven بخش مهمی از ارتباط بین سرویس ها از طریق Message و در بستر Message Broker می باشد .
این Message ها ممکن است Event یا Command باشند .
ایونت ها از وقوع اتفاقی در گذشته خبر می دهند و کامندها برای اجرای دستور خاصی می باشند .
معمولا ایونت ها به صورت Broadcast ارسال می شوند (یک فرستنده و نامحدود گیرنده) و کامندها به صورت Direct (یک فرستنده و یک گیرنده مشخص) ارسال می شوند .
این مطلب در مورد ایونت هاست و راهکاری برای کاهش برخی از مشکلات این نوع پیام ارائه می دهد .
مثال :
برای ارسال ایونت ، یک مثال ساده می تواند این باشد که در یک ساختار میکروسرویس ، یکی از سرویس ها سرویس User می باشد و سایر سرویس ها بخشی از اطلاعات کاربران را با هدف کاهش وابستگی نزد خود نگه می دارند مثلا سرویس Comment اسم ، تصویر و آی دی کاربر را در دیتابیس خود نگه می دارد که هنگام نمایش لیست کامنت ها اسم کاربر را نیز نمایش دهد بدون اینکه نیاز به ارسال درخواست به سرویس User باشد .
در این مثال هر زمانی که کاربر جدیدی ثبت می شود یا نام کاربری تغییر می کند سرویس User یک ایونت برای سایر سرویس ها ارسال می کند که اطلاعات یوزر را بروزرسانی کنند .
برخی از مشکلاتی که ممکن است در این روش وجود داشته باشد :
راهکار پیشنهادی :
برای حل این مشکل می توان به ازای هر Type یک ایونت شامل id و UpdateTime داشت و سرویس های دریافت کننده ، صرفا یک Consumer دارند که به محض دریافت این ایونت ، اطلاعات فعلی را از سرویس اصلی دریافت کرده و پردازش مورد نیاز را انجام می دهند .
در مثال بالا ، سرویس User در زمان ایجاد کاربر جدید ، بروزرسانی اطلاعات کاربر و حذف کاربر ایونتی را ارسال خواهد کرد با نام UserChanged و شامل آی دی کاربر و زمان وقوع اتفاق .
هر سرویس دیگری (مانند سرویس کامنت) هنگام دریافت این ایونت ، Api سرویس User را صدا زده و کلیه اطلاعات کاربر را دریافت خواهد کرد و دیتای خود را بروزرسانی می کند .
چالش این راهکار ، نیاز به Api Call در زمان پردازش ایونت هاست که به دلایل زیر مشکلی ایجاد نمی کند :