System Design

Olay Kaynağını Ustalıkla Kullanma: Denetlenebilir ve Ölçeklenebilir Sistemler Oluşturma

Modern sistem tasarımında, geleneksel CRUD (Oluştur, Oku, Güncelle, Sil) paradigması, karmaşık iş alanlarıyla uğraşırken, sıkı yasal uyumluluk gereksinimleri veya yüksek ölçekli veri ihtiyaçları söz konusu olduğunda genellikle yetersiz kalır. İşte tam da burada Olay Kaynağı (Event Sourcing) ön plana çıkar. Uygulama durumunu değişmez olayların bir dizisi olarak ele alarak Olay Kaynağı, eksiksiz denetim kayıtları, zamansal sorgulama yetenekleri ve artırılmış ölçeklenebilirlik sağlayan sağlam bir alternatif sunar.

Olay Kaynağı Nedir?

Temelinde, Olay Kaynağı, bir uygulamanın durumundaki değişikliklerin bir olay dizisi olarak depolandığı bir mimari kalıptır. Verinin yalnızca mevcut durumunu (bir müşterinin adresi gibi) depolamak yerine, bu durumu değiştiren her olayı (örneğin, "Adres Güncellendi", "Adres Oluşturuldu") depolarsınız. Mevcut durumu yeniden oluşturmak için sistem, bu olayları baştan itibaren tekrar oynatır.

Bu yaklaşım, geleneksel kalıcılık katmanlarıyla keskin bir tezat oluşturur. Standart bir ilişkisel veritabanında, bir kullanıcının profilini güncellemek, önceki verilerin üzerine yazan bir UPDATE SQL ifadesi gibi görünebilir. Olay Kaynağı'nda ise aynı eylem, tarihsel kaydı bütünlüğü koruyarak yeni bir "KullanıcıProfiliGüncellendi" olayı oluşturur.

Kurumsal Sistemler İçin Temel Faydalar

Olay Kaynağı'nı benimsemek yalnızca teknik bir tercih değil, aynı zamanda işi kolaylaştıran bir faktördür. İşte temel avantajlar:

  • Eksiksiz Denetim Kaydı: Her değişiklik değişmez bir olay olduğundan, yerleşik bir denetim günlüğüne sahip olursunuz. Ne olduğunun, ne zaman gerçekleştiğinin ve kimin neden olduğunu tam olarak izleyebilirsiniz.
  • Zamansal Sorgulama: Alanınızın (domain) durumunu herhangi bir anda yeniden oluşturabilirsiniz. Bu, hata ayıklama, adli analiz ve tarihsel raporlar oluşturma için paha biçilmezdir.
  • Soyutlama (Decoupling): Olaylar diğer süreçleri tetikleyebilir. Bir "SiparişVerildi" olayı, sıkı bağlılık olmadan envanteri aynı anda güncelleyebilir, kargo departmanını bildirebilir ve bir onay e-postası gönderebilir.

Olay Kaynağı Uygulama: Pratik Bir Örnek

Java'da bir Olay Deposu'nu nasıl yapılandırabileceğinize bakalım. Tipik olarak özel bir olay deposu veritabanı (EventStoreDB veya Apache Kafka gibi) kullanırsınız, ancak kavramsal model aynı kalır: olayların bir deposu.


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

    // Durumu yeniden oluşturmak için olayları tekrar oynat
    public void replay(List historicalEvents) {
        historicalEvents.forEach(this::apply);
    }

    // Mevcut duruma yeni bir olay uygula
    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";
        }
        // Kalıcı hale getirilmek üzere yerel arabelleğe ekle
        events.add(event);
    }

    // Bekleyen olayları olay deposuna kaydet
    public void persist() {
        eventStore.save(events);
        events.clear();
    }
}

Bu örnekte, OrderAggregate durumunu yalnızca kalıcı değişkenlerde depolamaz. Bunun yerine, taahhüt edilmemiş olayların bir listesini tutar. İşlem tamamlandığında, bu olaylar olay deposuna kaydedilir. Daha sonra aggregate'ı yüklemek için sistem, sipariş kimliğiyle ilişkili tüm olayları getirir ve apply yöntemini kullanarak bunları tekrar oynatır.

Zorluklar ve Dikkat Edilmesi Gerekenler

Güçlü olmasına rağmen, Olay Kaynağı karmaşıklık getirir. Olaylar değişmez olsa da işleme mantığınız değişebileceğinden, olay geçişini (şema evrimi) dikkatli bir şekilde ele almalısınız. Ayrıca, basit bir okuma işlemi için milyonlarca olayı tekrar oynatmak işlemci açısından pahalı olduğundan, okuma modelleri genellikle sorguları verimli bir şekilde sunmak için ayrı depolama (Elasticsearch veya bir SQL veritabanı gibi) gerektirir.

Sonuç

Olay Kaynağı, her soruna çözüm sunan bir sihirli değnek değildir, ancak belirli kullanım durumları için dönüştürücü bir araçtır. Alanınız karmaşık iş mantığına dayanıyorsa, titiz denetim gerektiriyorsa veya tarihsel veri analizini desteklemesi gerekiyorsa, Olay Kaynağı, dayanıklı, ölçeklenebilir ve şeffaf sistemler oluşturmak için mimari temeli sağlar. Verinizin yalnızca mevcut anlık görüntüsünü değil, "hikayesini" benimseyerek kurumsal yazılım tasarımında yeni olanakların kilidini açarsınız.

Share: