System Design

تسلط بر Event Sourcing: ساخت سیستم‌های قابل حسابرسی و مقیاس‌پذیر

در دنیای طراحی سیستم‌های مدرن، پارادایم سنتی CRUD (ایجاد، خواندن، به‌روزرسانی، حذف) اغلب در مواجهه با حوزه‌های پیچیده کسب‌وکار، انطباق سخت‌گیرانه با مقررات یا نیازهای داده‌ای در مقیاس بالا ناتوان است. اینجاست که Event Sourcing درخشش می‌کند. با در نظر گرفتن وضعیت برنامه به عنوان سلسله‌ای از رویدادهای غیرقابل تغییر، Event Sourcing جایگزینی قدرتمند ارائه می‌دهد که ردیابی کامل حسابرسی، قابلیت‌های پرس‌وجوی زمانی و مقیاس‌پذیری بهبود یافته را فراهم می‌کند.

Event Sourcing چیست؟

در هسته خود، Event Sourcing یک الگوی معماری است که در آن تغییرات در وضعیت یک برنامه به صورت دنباله‌ای از رویدادها ذخیره می‌شوند. به جای ذخیره فقط وضعیت فعلی داده‌ها (مانند آدرس یک مشتری)، شما هر رویدادی که آن وضعیت را تغییر داده است ذخیره می‌کنید (برای مثال: «آدرس به‌روزرسانی شد»، «آدرس ایجاد شد»). برای بازسازی وضعیت فعلی، سیستم به سادگی این رویدادها را از ابتدا پخش مجدد (replay) می‌کند.

این رویکرد به شدت با لایه‌های ذخیره‌سازی سنتی متفاوت است. در یک پایگاه داده رابطه‌ای استاندارد، به‌روزرسانی پروفایل کاربر ممکن است شبیه یک دستور SQL UPDATE باشد که داده‌های قبلی را بازنویسی می‌کند. در Event Sourcing، همان عمل یک رویداد جدید «UserProfileUpdated» ایجاد می‌کند و سوابق تاریخی را دست‌نخورده باقی می‌گذارد.

مزایای کلیدی برای سیستم‌های سازمانی

پذیرش Event Sourcing تنها یک انتخاب فنی نیست؛ بلکه یک تسهیل‌گر کسب‌وکار است. در اینجا مزایای اصلی آورده شده است:

  • ردیابی حسابرسی کامل: از آنجا که هر تغییر یک رویداد غیرقابل تغییر است، شما یک لاگ حسابرسی داخلی دارید. می‌توانید دقیقاً پیگیری کنید که چه چیزی، چه زمانی و توسط چه کسی تغییر کرده است.
  • پرس‌وجوی زمانی: می‌توانید وضعیت حوزه کسب‌وکار خود را در هر نقطه از زمان بازسازی کنید. این امر برای عیب‌یابی، تحلیل‌های جنایی (forensic analysis) و تولید گزارش‌های تاریخی بی‌نظیر است.
  • جداسازی (Decoupling): رویدادها می‌توانند فرآیندهای دیگر را فعال کنند. یک رویداد «OrderPlaced» می‌تواند همزمان موجودی را به‌روزرسانی کند، واحد حمل‌ونقل را مطلع سازد و یک ایمیل تأییدیه ارسال کند، بدون اینکه وابستگی سفت و سختی ایجاد شود.

پیاده‌سازی Event Sourcing: یک مثال عملی

بیایید نگاهی بیندازیم که چگونه ممکن است یک Event Store را در جاوا ساختاردهی کنید. اگرچه معمولاً از یک پایگاه داده Event Store اختصاصی (مانند EventStoreDB یا Apache Kafka) استفاده می‌شود، اما مدل مفهومی همان است: یک مخزن از رویدادها.


public class OrderAggregate {
    private List events = new ArrayList<>();
    private BigDecimal totalAmount;
    private String status;

    // پخش مجدد رویدادها برای بازسازی وضعیت
    public void replay(List historicalEvents) {
        historicalEvents.forEach(this::apply);
    }

    // اعمال یک رویداد جدید به وضعیت فعلی
    public void apply(OrderEvent event) {
        if (event instanceof OrderCreatedEvent) {
            this.totalAmount = ((OrderCreatedEvent) event).getAmount();
            this.status = "CREATED";
        } else if (event instanceof OrderCancelledEvent) {
            this.status = "CANCELLED";
        }
        // افزودن به بافر محلی برای ذخیره‌سازی
        events.add(event);
    }

    // ذخیره رویدادهای در انتظار در Event Store
    public void persist() {
        eventStore.save(events);
        events.clear();
    }
}

در این مثال، OrderAggregate وضعیت خود را تنها در متغیرهای پایدار ذخیره نمی‌کند. در عوض، لیستی از رویدادهای انجام‌نشده را نگهداری می‌کند. وقتی تراکنش تکمیل می‌شود، این رویدادها در Event Store ذخیره می‌شوند. برای بارگذاری مجدد aggregate بعداً، سیستم تمام رویدادهای مرتبط با شناسه سفارش را دریافت کرده و آن‌ها را با استفاده از روش apply پخش مجدد می‌کند.

چالش‌ها و ملاحظات

اگرچه قدرتمند است، Event Sourcing پیچیدگی‌هایی را معرفی می‌کند. شما باید مهاجرت رویداد (تکامل طرحواره) را با دقت مدیریت کنید، زیرا رویدادها غیرقابل تغییر هستند اما منطق پردازش شما ممکن است تغییر کند. علاوه بر این، مدل‌های خواندن (read models) اغلب به ذخیره‌سازی جداگانه (مانند Elasticsearch یا یک پایگاه داده SQL) نیاز دارند تا پرس‌وجوها را به طور کارآمد پاسخ دهند، زیرا پخش مجدد میلیون‌ها رویداد برای یک عملیات خواندن ساده از نظر محاسباتی پرهزینه است.

نتیجه‌گیری

Event Sourcing یک راه‌حل جادویی نیست، اما ابزاری تحول‌آفرین برای موارد استفاده خاص است. اگر حوزه کسب‌وکار شما به شدت به منطق پیچیده کسب‌وکار متکی است، نیاز به حسابرسی دقیق دارد یا نیاز به پشتیبانی از تحلیل داده‌های تاریخی دارد، Event Sourcing پایه معماری لازم برای ساخت سیستم‌های مقاوم، مقیاس‌پذیر و شفاف را فراهم می‌کند. با پذیرش «داستان» داده‌های خود به جای فقط تصویر لحظه‌ای فعلی آن‌ها، شما امکانات جدیدی را برای طراحی نرم‌افزار سازمانی باز می‌کنید.

Share: