Etkinlik kaynağı yalnızca yazma işlemleri nadir olduğunda mı yapılır?


9

Ben olay kaynak okuma okuyorum ve kendime sadece yazma çok nadir veya askeri düzeyde denetim gerekli egzotik durumlarda mantıklı olup olmadığını sormak durduramaz.

Önemli bir kullanımı olan istisnai olmayan bir sistem, günde yüzlerce ila binlerce yazma üretebilir, örneğin yılda bir milyon veya 2 yazma (dolayısıyla olaylar) anlamına gelir. Mevcut durumu almak için milyonlarca nesneyi (olayları) birleştirmek, geleneksel bir depolama biriminden gelen düz okumaya kıyasla gülünç bir teklif gibi geliyor. Yine de, olay kaynağı en performanslı sistemlerden bazılarının arkasındadır (LMAX'ı düşünün).

O zaman neyi özlüyorum? Durumu olay akışından geri yükleme yaygın olarak yapılmakta mıdır? Ya da bunu nadiren yapmak ve bunun yerine normal işlemler için tamamen farklı bir depolama alanı kullanmak (yani CQRS'den Sorgu depolamasını kullanmak) ve yalnızca istisnai durumlarda (çoğaltma, denetim vb.) Olaylardan geri yükleme fikri mi?

Yanıtlar:


6

O zaman neyi özlüyorum?

Bir tahminde bulunmak.

Eksik olabileceğiniz ilk şey, olayları yalnızca yeniden oluşturduğunuz durum için yeniden yüklemeniz gerektiğidir. İşlem sınırlarınızı temiz bir şekilde modelleyebiliyorsanız, her nesne kendi kimliğiyle etiketlenmiş olayları yazabilir ve yalnızca bu olaylarda tekrar okuyabilir. Olay depolama için ilişkisel bir veritabanı kullanıldığında, bu sorguyu hızlandırmak için dizinlenmiş bir kimlik sütunu olacaktır. EventStore kullanıldığında, her nesnenin kendi akışı olur.

Her işlemde yalnızca tek bir nesneyi değiştirdiğinizden emin olmak istediğiniz için, modelinizde bunu temiz bir şekilde yapmak biraz özen gösterir ve bu nedenle yapmaya çalıştığınız her bir değişkeni doğru bir şekilde izole ettiğinize dikkat etmeniz gerekir. zorlamak.

Bunun yeterince hızlı olmadığı durumlarda, durumunuzun anlık görüntülerini oluşturma (not alma) ve buna "geleneksel depolama" da devam etme olanağınız vardır. Her anlık görüntü, anlık görüntüyü oluşturmak için kullanılan son olayın sıra numarası ile etiketlenir; yeniden yükleme sırasında, depo ilk önce anlık görüntüyü yakalar, daha sonra ona daha yeni olaylar uygular. (Bu, daha yeni anlık görüntüleri almak için makul bir yol anlamına gelir - olaylar da sıra numarasıyla etiketlenir veya başlangıç ​​noktanıza ulaşıncaya kadar olay akışını geriye doğru okumak için etkili bir yolunuz vardır.)

Buradaki olağan yaklaşımdan hala bir avantaj var, anlık görüntülerinizin onlarla birleştirilmektense yazılarınıza paralel olarak oluşturulabilmesidir: sadece bir olay dinleyicisini başka bir iş parçacığına / sürece koyarsınız ve yazarken neşeyle izin verirsiniz herhangi bir programda makul görünüyor. Sonuçta, anlık görüntünün özellikle zamanında olması gerekmez - sadece yeni olayları yeniden uygulama çalışmasının SLA'nızı etkilememesi yeterlidir.

(Anlık görüntü çekimi taşımayı zorlaştırır; modelin seri hale getirilmesinde yapılan herhangi bir değişiklik anlık görüntü önbelleğini geçersiz kılacaktır. Elbette, yeni seri oluşturmayı taşıma işleminin bir parçası olarak kullanarak anlık görüntüleri yeniden oluşturabilir ve ardından değişiklikler yayınlandığında "yakalayabilirsiniz".)

Durumu olay akışından geri yükleme yaygın olarak yapılmakta mıdır?

Evet öyle. CQRS örneklerinde normal olarak gösterilen, Uygulama katmanının, gönderilen komutun iyi bir şekilde oluşturulduğundan emin olduktan sonra, uygulama katmanının etki alanı nesnesini bir depodan yükleyeceği ve burada yükün varsayılan bir kurucu olduğu ve ardından olay akışının bir tekrarlanacağı (veya eşdeğer olarak, olayların listesini içeren bir fabrikaya yapılan çağrı).

Diğer iki çelişkili düşünce.

  1. Havuz arayüzünün arkasında bir önbellek olabilir
  2. Önbellek geçersiz kılma iki zor sorundan biridir.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.