Bu KG'ye geri gelmeye devam ediyorum. Ve mevcut cevapları yeterince incelikli bulamadım, bu yüzden bunu ekliyorum.
TL; DR. Etkinlik kaynağı kullanımınıza bağlı olarak Evet veya Hayır.
Farkında olduğum iki temel olay kaynaklı sistem vardır.
Akışaşağı olay işlemcileri = Evet
Bu tür bir sistemde, olaylar gerçek dünyada meydana gelir ve gerçekler olarak kaydedilir. Ürün paletlerini takip etmek için depo sistemi gibi. Temelde çelişen bir olay yoktur. Yanlış da olsa her şey zaten oldu. (Palet 123456, A kamyonuna konuldu, ancak B kamyonu için planlandı.) Daha sonra gerçekler, raporlama mekanizmaları yoluyla istisnalar için kontrol edilir. Kafka, bu tür aşağı akış, olay işleme uygulaması için çok uygun görünüyor.
Bu bağlamda Kafka halkının onu neden bir Olay Tedarik çözümü olarak savundukları anlaşılabilir. Örneğin, tıklama akışlarında zaten nasıl kullanıldığına oldukça benzer. Bununla birlikte, Etkinlik Sağlama terimini (Akış İşleme'nin aksine) kullanan kişiler muhtemelen ikinci kullanıma atıfta bulunmaktadır ...
Uygulama kontrollü gerçeğin kaynağı = Hayır
Bu tür bir uygulama, iş mantığından geçen kullanıcı istekleri sonucunda kendi olaylarını bildirir. Kafka bu durumda iki ana nedenden dolayı iyi çalışmıyor.
Varlık izolasyon eksikliği
Bu senaryo, belirli bir varlık için olay akışını yükleyebilmelidir. Bunun ortak nedeni, iş mantığının isteği işlemek için kullanması için geçici bir yazma modeli oluşturmaktır. Bunu yapmak Kafka'da pratik değildir. Varlık başına konu kullanmak buna izin verebilir, ancak bunun binlerce veya milyonlarca varlık olabileceği durumlarda başlatıcı olmamasıdır. Bu, Kafka / Zookeeper'daki teknik sınırlardan kaynaklanmaktadır.
Geçici bir yazma modelini bu şekilde kullanmanın ana nedenlerinden biri, iş mantığı değişikliklerini ucuz ve dağıtımı kolay hale getirmektir.
Bunun yerine Kafka için tür başına konu kullanılması önerilir, ancak bu, yalnızca tek bir varlığın etkinliklerini almak için bu türdeki her varlık için olayların yüklenmesini gerektirir . Hangi olayların hangi varlığa ait olduğunu günlük konumuna göre söyleyemeyeceğinizden. Bilinen bir günlük konumundan başlamak için Anlık Görüntüler'i kullansanız bile , bu kaybolacak önemli sayıda olay olabilir.
Çatışma tespiti eksikliği
İkinci olarak, kullanıcılar aynı varlığa karşı eşzamanlı istekler nedeniyle yarış koşulları oluşturabilir. Çatışan olayları kaydetmek ve olaydan sonra bunları çözmek oldukça istenmeyen bir durum olabilir. Bu nedenle, çelişen olayları önleyebilmek önemlidir. İstek yükünü ölçeklendirmek için, koşullu yazma işlemlerini kullanarak yazma çakışmalarını önlerken vatansız hizmetlerin kullanılması yaygındır (yalnızca son varlık etkinliği #x ise yazma). Aka İyimser Eşzamanlılık. Kafka iyimser eşzamanlılığı desteklemiyor. Konu düzeyinde desteklese bile, etkili olabilmek için varlık düzeyine kadar inmesi gerekir. Kafka'yı kullanmak ve çakışan olayları önlemek için, uygulama düzeyinde durum bilgisi olan, seri hale getirilmiş bir yazar kullanmanız gerekir. Bu önemli bir mimari gereklilik / kısıtlamadır.
Daha fazla bilgi
Yorum başına güncelleme
Yorum silindi, ancak soru şöyleydi: insanlar olay depolama için ne kullanıyor?
Çoğu insan kendi olay depolama uygulamasını mevcut bir veritabanının üzerine yuvarlıyor gibi görünüyor. Dahili arka uçlar veya bağımsız ürünler gibi dağıtılmamış senaryolar için, SQL tabanlı bir olay deposunun nasıl oluşturulacağı iyi belgelenmiştir . Ve çeşitli veri tabanlarının üstünde kütüphaneler mevcuttur. Bu amaçla inşa edilmiş EventStore da var .
Dağıtılmış senaryolarda, birkaç farklı uygulama gördüm. Jet Panther projesi dinleyicileri bilgilendirmek için Feed Değiştir özelliğiyle Azure CosmosDB'yi kullanır . AWS'de duyduğum bir diğer benzer uygulama, dinleyicileri bilgilendirmek için Akış özelliği ile DynamoDB'yi kullanmaktır. Bölüm anahtarı, muhtemelen en iyi veri dağıtımı için (aşırı sağlama miktarını azaltmak için) akış kimliği olmalıdır. Bununla birlikte, Dinamo'da akışlar arasında tam bir tekrar yapmak pahalıdır (okuma ve maliyet açısından). Bu impl, Dynamo Streams'in olayları S3'e dökmesi için de kuruldu. Yeni bir dinleyici çevrimiçi olduğunda veya mevcut bir dinleyici tam bir yeniden çalma istediğinde, ilk önce S3'ü okur.
Şu anki projem çok kiracılı bir senaryodur ve Postgres'in üzerine kendi senaryomu attım. Citus gibi bir şey ölçeklenebilirlik için uygun görünüyor ve tentant + akışı ile bölünüyor.
Kafka dağıtılmış senaryolarda hala çok faydalıdır. Her hizmetin olaylarını diğer hizmetlere göstermek önemsiz bir sorundur. Bir etkinlik mağazası genellikle bunun için inşa edilmemiştir, ancak tam olarak Kafka'nın yaptığı şey budur. Her hizmetin kendi iç gerçeği vardır (olay depolama veya başka türlü olabilir), ancak Kafka'yı "dışarıda" neler olduğunu bilmek için dinler. Hizmet ayrıca Kafka'ya hizmetin yaptığı ilginç şeylerin "dışını" bildirmek için etkinlikler de gönderebilir.