مرا اسکن کن!

معماری Event Sourcing چیست

معماری Event Sourcing چیست



Event Sourcing چیست ؟

 

مارتین فاولر(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 بعد از یک مدتی میشه یک سری نمودارها و چارت های تحلیلی هم از رفتار و عملکرد بخش های مختلف پروژه ترسیم کرد که در یک نگاه مختصر دیتا و اطلاعات زیادی رو به ما میده و میتونه توی تصمیم گیری‌ها و اولیت بندی توسعه محصول بهمون کمک کنه.


 

به بیان ساده Event sourcing راهکاری برای ذخیره سازی حالت یک شی بر اساس رخداد هایی است که از زمان ایجاد برای آن اتفاق افتاده است. در این صورت قادر خواهیم بود حالت هر شی در هر لحظه از زمان را با بازسازی این رخدادها، ایجاد کنیم. هر چند فواید بسیاری بر این روش مترتب است، نباید از جان مایه آن که توجه به رفتار به جای حالت  است غافل شد.  سایر مزایای استفاده از این روش عبارتند از :

 

  • تغییر در سازوکار ذخیره سازی، تغییری در برنامه ایجاد نمی کند.
  • به خاطر سادگی ذخیره سازی رخدادها، کارایی بهبود می یابد.
  • عدم نیاز به لایه orm  برای ذخیره سازی.
  • نگهداری تاریخچه رخدادهایی که در سیستم اتفاق افتاده است.
  • سادگی تجمیع  با سایر زیر سیستم ها.
  • سیر در گذشته و پیش بینی آینده.
  • خطایابی سیستم که در حال کار است با تکرار رخداد هایی که منجر به خطا شده اند.

سناریوی اصلی پیاده سازی این الگوی معماری در قطعه کد زیر نشان داده شده است. با هر درخواست در لایه application service، شناسه aggregate root ای که برای پاسخ گویی به این درخواست وظیفه ای برعهده دارد مشخص می شود. سپس رخدادهایی که تا این لحظه برای این شی اتفاق افتاده است از منبع ذخیره سازی رخداد ها  دریافت می شود. با دریافت این رخدادها و اعمال آنها به شی مورد نظر، این شی به حالتی قبل از ورود درخواست می رسد. سپس بر اساس درخواست ورودی، متدی روی شی مورد نظر فراخوانی می شود. در پاسخ به این متد فراخوانی شده، دنباله ای از رخداد ها اتفاق می افتد که شی مورد نظر این دنباله را در اختیار دارد. در ادامه رخدادهای اتفاق افتاده در منبع ذخیره سازی رخدادها ذخیره می شود و پاسخ درخواست ورودی، ارسال می شود.


 

خلاصه Event Sourcing

معماری Event Sourcing یا ES بصورت کوتاه ،  یک روش متفاوت برای Data storage میباشد.

اکثرا ما از Datastore‌هایی که مدلی از دیتا را انعکاس می‌دهند استفاده میکنیم. ES از برنامه نویسان میخواهد که مدل سنتی CRUD را فراموش کرده و بجای آن تغییراتی را که روی دیتا صورت گرفته، نیز درج نمایند. اینکار به وسیله‌ی یک دیتابیس Append-only انجام میشود که به نام Event Store شناخته میشود.

در این معماری ما همه‌ی تغییرات روی دیتا را به صورت Serialize Event ذخیره میکنیم که میتواند دوباره در هر زمانی اجرا شده و current state هر objectی را در اختیار بگذارد.

این روش به ما کمک بزرگی میکند تا وضعیت یک object را در گذشته به راحتی پیدا کنیم و از آن میتوان به غیر از فوایدی که دارد، به عنوان یک Logger نیز استفاده نمود. به دلیل اینکه جزء به جزء تغییرات بر روی state سیستم، در آن ثبت شده است. از آنجاییکه دیتا بصورت serialize ذخیره میشود، بارگزاری آن نیز با سرعت بالایی انجام خواهد شد.

 


نوشته شده توسط :

وحید صمدیان وحید صمدیان



یکشنبه, 13 تیر 1400

تعداد بازديد : 823

برچسب ها : معماری نرم افزار

3.0 ستاره