Event Sourcing چیست ؟

راستش یکی از موضوعاتی که اخیرا درگیرم کرده بود همین event sourcing بود. که میخواستم بدونم دقیقا چی هست و چجوری پیاده سازی میشه و اصلا خود مفهوم (concept) چیه . حالا که یکم دانش بهتری نسبت به این قضیه پیدا کردم دوست داشتم با همه به اشتراک بگذارم .مارتین فاولر(Martin Fowler) میگه :Capture all changes to an application state as a sequence of events.کل event sourcing رو میشه در همین جمله خلاصه کرد ، حالا بریم که با هم ببینیم معنی و مفهوم همین یه جمله یعنی چی و میخواد چجوری توی اپلیکیشن ما نمود پیدا کنه؟ترجمه عبارت بالارو بهتره اینجوری بگیم که هدف از ایونت سورسینگ اینه که رفتار نرم افزار رو با وضعیت های مختلف ثبت کرد و به عبارت دیگه یعنی تمامی اطلاعتی که نرم افزار با رویداد های مختلف براش پیش میاد رو نگهداری کنیم و هر زمان که رویداد جدیدی اتفاق میفته باید اون رو به انتهای لیست تغییرات در طول زمانمون اضافه کنیم، باید بتونید تشخیص بدید که دقیقا در چه مرحله ای رفتار و عملکرد نرم افزار (یا همون اپلیکیشن) اشتباه و غیر قابل انتظار بوده. ایونت سورسینگ فواید زیادی داره که از جمله مهمترینش میشه به دیباگ کردن منطقی پروژه و کنترل کیفی و رفتاری پروژه اشاره کرد.به عنوان مثال، در سیستم های حسابداری که به طور مستقیم با حساب های شرکت و میزان بدهکاری و بستانکاری ارتباط دارن، پیاده سازی همچین مکانیسمی برای درست محاسبه کردن مقادیر مالی و کشف کسورات پولی در انتهای محاسبات و گزارشات بشدت حائز اهمیت هست. همچنین وقتی شما یک ورژن جدید از پروژه رو ارائه میکنید و طبیعتا انتظار دارید که در بعضی جاهاش که تغییرش دادید، این تغییرات رو در رفتار پروژه هم ببینید که با ایونت سورسینگ و مقایسه با دیتای ضبط شده سابق میشه به این مهم دست یافت.نرم افزار ها لیست رویداد ها رو در یک مخزن رویداد‌‌‌‌ها (event store) نگهداری میکنند که در واقع این مخزن رو یک پایگاه داده از رویداد های مختلف سیستممون هست (database of events) این پایگاه داده API و یا رابط نرم افزاری دارد که از طریق اون به ثبت و دریافت رویداد های مختلف یک قسمت از نرم افزار یا بیزینسمون میپردازیم .و این پایگاه داده در واقع همانند یک واسط پیام (Message Broker) عمل میکنه که API دیگری رو هم برای سرویس های دیگه آماده میکنه که به این ایونت خاص وصل بشن و هر وقت تغییر یا رویدادی در سیستم برای این قسمت اتفاق افتاد اون ها هم از این رویداد مطلع بشن و کار های خودشون رو بکنن.خوب شاید بهتر باشه با مطرح کردن یک مثال ایونت سورسینگ رو بهتر بفهمیم و اون رو بهتر درکش کنیم سیستمی رو در نظر بگیرید که شامل دو سرویس Customer , Order باشه ما میخوایم که ایونت سورسینگ رو در این سیستم پیاده سازی کنیم در این تصویر به راحتی میشه فهمید که ایونت سورسینگ دقیقا چی کار میخواد بکنه در این سیستم ما به جای این که برای هر وضعیت سفارش بیایم و یک سطر از دیتابیسمون رو آپدیت کنیم وضعیت های مختلف رو در یک event store ذخیره میکنیم و این طوری پس از هر تغییر وضعیت سرویس مشتری یا customer هم از وضعیت سفارش اون مشتری مطلع میشه و میتونه کار های خودشو نسبت به هر تغییر وضعیت سفارش جلو ببره امیدوارم دقیقا متوجه شده باشین که ایونت سورسینگ دقیقا میخواد چیکار بکنه بد نیست با هم مزایا و معایب این سیستم رو هم ببینیم مزایا و سودمندی هاایونت سورسینگ یکی از چالش های بزرگ سیستم های رویداد محور event driven رو حل کرده که اون هم این که ایونت ها پس از هر تغییری با اطمینان کامل در سیستم ثبت میشنیک تاریخچه (log) کامل رو برای ما به ارمغان میاره که میتونیم تغییرات یک قسمت از نرم افزارمون رو به راحتی مشاهده کنیم اگر شما در حال مهاجرت از معماری monolith به microservice هستین ایونت سورسینگ این مهاجرت رو برای شما راحت تر و شیرین تر میکنه مطابق با هر سیستمی ایونت سورسینگ هم معایب خودشو داره معایبایونت سورسینگ یک پترن خاص و نا آشناست و برای یادگیری و پیاده سازی و درک مفهمومش باید تلاش زیادی بکنید همین طور کویری زدن به یک event store اصلن کار ساده ای نیست و برای همین منظور شما باید از CQRS استفاده کنید که اندکی به پیچیدگی سیستمتون اضافه میکنهEvent sourcing with CQRS Implخلاصه از نگاه یک مدیر فنی یا یک مالک محصول، و یا از نگاه یک برنامه نویسی که نگاه وسیعی داره، استفاده از ایونت سورسینگ کیفیت و دقت پروژه رو خیلی ارتقاء میده و ضریب خطا و از دست داده دیتا رو به حداقل میرسونه. شایان ذکره که با استفاده از ایونت سورسینگ event sourcing بعد از یک مدتی میشه یک سری نمودارها و چارت های تحلیلی هم از رفتار و عملکرد بخش های مختلف پروژه ترسیم کرد که در یک نگاه مختصر دیتا و اطلاعات زیادی رو به ما میده و میتونه توی تصمیم گیری‌ها و اولیت بندی توسعه محصول بهمون کمک کنه.