Verileri mikro hizmetlerde senkronize etmenin uygun yolu nedir?


19

Mikro hizmet mimarisinde nispeten yeniyim. Orta büyüklükte bir web uygulamamız var ve şimdi ilerlediğimiz monolitik bir sistem yerine mikro hizmetlere ayırmanın artılarını ve eksilerini tartıyorum.

Anladığım kadarıyla, mikroservisleri Ave Bher birinin diğerinin sahip olduğu bir veri alt kümesine dayanan düşünün . Bir Aşey değiştiğini söyleyerek bir ileti gönderilirse , Bbu iletiyi Akullanabilir ve bilgilerinin yerel bir kopyasını çoğaltabilir ve bunu yapmak için ne Bgerekiyorsa yapın.

Ancak, ne Biner / başarısız olursa ve bir süre sonra tekrar ortaya çıkar. Bu kesinti süresi boyunca Aiki mesaj daha yayınladı. Nasıl gelmez Bonun yerel kopyasını güncelleştirmek bilen Abireyin bilgi?

Verilen, kuyruğun Btek tüketicisi ise A, tekrar çevrimiçi olduktan sonra okumaya başlayabilir, ancak bu kuyruğun başka tüketicileri varsa ve bu mesajlar tüketilirse?

Daha somut bir örnek olarak, bir Usershizmet bir Billingmikro hizmet kapalı iken e-posta adresini güncellerse , Billingmikro hizmet yeniden gelirse, e-postanın güncellendiğini nasıl bilebilir?

Mikro servisler geri geldiğinde, "Hey geri döndüm, bana şu anki tüm bilgilerinizi verin" yazan bir yayın yapıyor mu?

Genel olarak veri senkronizasyonu için en iyi endüstri uygulamaları nelerdir?


1
Mümkün olduğunca önlemek için.
Telastyn

1
Neden Ordershakkında bir şey bilmek gerekiyor Users?
kdgregory

Bu sadece bir örnek. İkisini, mantıklı olan istediğinizle değiştirin.
noblerare

bir fan çıkışı yönlendirme 'mesajınız başkası tarafından tüketilir' sorununuzu çözecektir. ama ne elde etmeye çalıştığınız gerçekten belli değil.
Ewan

@Ewan Sormaya çalıştığım şeyi daha iyi açıklamak için orijinal yayınımı güncelledim.
noblerare

Yanıtlar:


5

"Verileri diğer tüm mikro hizmetlere aktarma" fikrinize meydan okuyorum.

Genellikle, bir faturalandırma hizmetinin bir e-posta adresine ihtiyacı varsa, adres hizmetinden belirli bir müşterinin e-posta adresini ister. Tüm adres verilerinin bir kopyasını tutması veya herhangi bir değişiklik olması durumunda bilgilendirilmesi gerekmez. Sadece en yeni verilerden soruyor ve cevap alıyor.


Bence bu cevap kesinlikle doğru. Senkronizasyon ile ilgili birçok sorunu ortadan kaldırır. Aslında, farklı hizmetler bilgilerin kopyalarını tutuyor ve bu tür senkronizasyon sorunlarına sahip oldukları için şu anda bu tür sorunları olan koda bakıyorum.
DaveG

2
Cevabınız için teşekkürler. Öyleyse neden bir pub / sub model ve mesaj kuyruğuna ihtiyaç var? Verileri "aktarma" yerine "çekmeye" çalışırsak, hizmet gecikmesinden endişe duyarız.
noblerare

AFAIK, bir şey değiştiğinde (pub / sub'da olduğu gibi) hizmetinizin hemen tepki vermesi gerekmez, ancak bazen verilere ihtiyaç duyar. Sonra sadece çekerdim. Gecikme konusunda endişelenirseniz, verileri önbelleğe alabilirsiniz, ancak yine de verilerin güncel olup olmadığını bilmemenin maliyeti vardır. Dosyalarınız büyükse, tekrar bir şey çekmeden önce bir şeyin değişip değişmediğini de sorabilirsiniz.
J. Fabian Meier

Bu çözümün bağımlı hizmeti sıkı bir şekilde bağlamanın bir maliyeti olduğunu unutmayın; bu, kullanıcı hizmeti kullanılamadığında e-posta adresinin kullanılamayacağı anlamına gelir. Bağımsız olarak konuşlandırılabilecek, ölçeklendirilebilecek, vb. Olacak şekilde hizmetlerin başlatılmasına ilişkin ilk fikirlerden biri .. Tüm hizmetler önbellek veya yüksek kullanılabilirlik garantisi olmadan birbirleriyle doğrudan iletişim kuruyorsa, bir sistem kapatıldığında, hepsi aşağı in.
dukethrash

@dukethrash Sonra onları yüksek kullanılabilir hale getirin.
J. Fabian Meier

5

Biraz daha araştırma yaptıktan sonra, yapmak istediğim şey için (ve gelecekteki herhangi bir okuyucu için) yararlı olduğunu düşündüğüm bazı alıntılar çıkardığım bu makaleye tökezledim . Bu, zorunlu bir programlama modeli üzerinden reaktif bir programlama modeli benimsemenin bir yolunu sunar.

Olay kaynak

Buradaki fikir, her uygulamanın devlet geçişini değişmez bir olay biçiminde temsil etmektir. Olaylar daha sonra meydana geldiklerinde bir günlük veya günlük biçiminde saklanır ('olay deposu' olarak da adlandırılır). Ayrıca, uygulamanın durumunun bir bütün olarak zaman içinde nasıl geliştiğini temsil etmeyi amaçlayan süresiz olarak sorgulanabilir ve saklanabilir.

Bunun gerçekleştirilmesine yardımcı olan şey, bir mikro hizmetin çökmesi ve bununla ilgili diğer etkinliklerin yayınlanması ve söz konusu mikro hizmetin diğer örnekleri tarafından tüketilmesinin, bu mikro hizmetin geri gelmesi durumunda buna işaret edebilmesidir.event store tüm düştüğü dönemde kaçırdığı olaylar.

Etkinlik Brokeri olarak Apache Kafka

Saniyede binlerce olayı depolayıp gönderebilen ve yerleşik çoğaltma ve hata tolerans mekanizmalarına sahip Apache Kafka'nın kullanımını düşünün. Süresiz olarak diskte saklanabilen ve herhangi bir zamanda (Kafka'nın süslü kuyruğu) teslim edilen Konudan (ancak kaldırılmadan) tüketilebilen kalıcı bir olay deposuna sahiptir.

Olaylara daha sonra bunları Konu içinde tek tek tanımlayan ofsetler atanır - Kafka ofsetleri kendisi yönetebilir, kolayca "en fazla bir kez" veya "en az bir kez" teslim semantiği sağlayabilir, ancak bir etkinlik tüketicisi bir Konuya katıldığında da müzakere edilebilir mikro hizmetlerin zaman içinde herhangi bir keyfi yerden - genellikle tüketicinin kaldığı yerden - olayları tüketmeye başlamasına izin verir. Son tüketilen olay ofseti, 'başarıyla tamamlandığında' kullanıldığında hizmetlerin yerel depolamasında işlemsel olarak devam ederse, bu ofset "tam olarak bir" olay teslim semantiği elde etmek için kolayca kullanılabilir.

Aslında, tüketiciler kendilerini Kafka'ya tanıttıklarında, Kafka hangi tüketicilere hangi mesajların teslim edildiğini kaydedecek ve böylece tekrar hizmet vermeyecektir.

Sagalar

Farklı hizmetler arasındaki iletişimin gerçekten gerekli olduğu daha karmaşık kullanımlar için, kullanıcı tabanını bitirme sorumluluğu iyi bilinmelidir - kullanım alanı merkezi değildir ve yalnızca ilgili tüm hizmetler görevlerini başarıyla tamamlandığını kabul ettiğinde biter, aksi takdirde tüm kullanım hatası başarısız olmalıdır geçersiz yerel durumları geri almak için düzeltici tedbirler alınmalıdır.

İşte destan devreye giriyor. Destan, bir dizi yerel işlemdir. Her yerel işlem veritabanını günceller ve destandaki bir sonraki yerel işlemi tetiklemek için bir mesaj veya olay yayınlar. Yerel bir işlem, bir iş kuralını ihlal ettiği için başarısız olursa, destan, önceki yerel işlemler tarafından yapılan değişiklikleri geri alan bir dizi telafi işlemi yürütür. Daha fazla bilgi için bunu okuyun .


Hala neden bu kadar karmaşık bir yapı inşa etmek istediğinizi anlamıyorum. Her hizmetin yalnızca kendi verilerini tutması ve talep üzerine diğer hizmetlere vermesi genellikle çok daha kolaydır.
J. Fabian Meier

^ Ancak sistemin kullanılabilirliğini azaltacaktır. Yüksek esneklik gerekirse karmaşık yapı garanti edilebilir.
avmohan

1

Geç kalsam bile, 2 sentimi tartışmaya koyarım çünkü olay odaklı bir mikro hizmet mimarisini tasarlamak istediğinizde bunun önemli bir nokta olduğunu düşünüyorum. Her bir mikro hizmet, durumunu etkileyen olayların hangileri olduğunu tam olarak bilir ve onları bekleyebilir. Mikro hizmet kullanılabilir olmadığında, başarısız mikro hizmetten gereken iletileri "tüketemeyene" kadar saklayan bir bileşen olmalıdır. Aslında bu bir "üretici / tüketici" modelidir ve "yayınla / abone ol" modeli değildir. Message Brokers (Kafka, RabbitMQ, ActiveMQ vb.) Genellikle kalıcı kuyruklar ve ack / nack mekanizması sağlayan (olay kaynağı gibi farklı bir şey uygulamadığınız sürece) bu davranışı elde etmenin en iyi yoludur.

Şimdi mikro hizmet, bir iletinin sonunda teslim edildiğini biliyor, ancak yeterli değil: tek bir iletinin teslimini beklemenin yolu nedir? aynı olay bildiriminin birden fazla kopyasının dağıtımını yönetebilir mi? Bu teslim anlamsaldır (en az bir kez, tam olarak bir kez)

Son düşünceler):

  1. Mimarinize başkalarından etkinlik tüketmesi gereken bir mikro hizmet eklediğinizde, ilk eşitlemeyi yapmanız gerekir

  2. Aracı bile başarısız olabilir, bu durumda mesajlar kaybolur

her iki senaryo için de, mikro hizmet durumunu yeniden hidratlamak için basit mekanizmalara sahip olmak yararlı olacaktır. Bir REST API veya mesaj gönderen bir komut dosyası olabilir, ancak en önemli şey bazı bakım görevleri yapmak için araçlara sahip olmaktır


0

Normal bir olay kuyruğunu, Ahizmetin T veB mikro hizmet türlerinin aynı konuya abone olacağı değiştirebilirsiniz.

İdeal Bolarak durum bilgisi olmayan bir hizmet olacaktır ve bağımsız bir kalıcılık hizmeti kullanacak, böylece başarısız bir Bhizmet örneği B, aynı paylaşılan kalıcılık hizmetinden okuyarak çalışmasına devam etmek için bir veya daha fazla hizmet örneği oluşturarak değiştirilecektir.


0

A tarafından bir şeyin değiştiğini söyleyen bir mesaj gönderilirse, B bu mesajı kullanabilir ve A bilgisinin yerel bir kopyasını çoğaltabilir ve bunu B'nin yapması gereken her şeyi yapmak için kullanabilir.

B'nin A'nın dahili verilerine erişmesini istiyorsanız, yalnızca A'nın dahili veritabanlarına erişmesine izin vermeniz daha iyi olur.

Ancak bunu yapmamalısınız, bir hizmet odaklı mimarinin tüm amacı, B hizmetinin A hizmetinin dahili durumunu görememesi ve REST API'leri aracılığıyla istekte bulunmakla sınırlı olmasıdır (ve tersi).

Sizin durumunuzda, tüm kullanıcı verilerini saklama sorumluluğu olan bir kullanıcı veri servisine sahip olabilirsiniz. Bu verileri kullanmak isteyen diğer hizmetler yalnızca ihtiyaç duyduklarında bunu talep eder ve yerel bir kopyasını tutmaz (bu btw., GDPR uyumluluğunu düşünüyorsanız gerçekten yararlıdır). Kullanıcı Verileri hizmeti, "Yeni kullanıcı oluştur" veya "user_id 23 için adı değiştir" gibi basit CRUD işlemlerini destekleyebilir veya daha karmaşık işlemlere sahip olabilir "Önümüzdeki 2 hafta içinde doğum günü olan tüm standart kullanıcıları bulun ve onlara verin premium deneme durumu ". Artık Faturalandırma hizmetinizin 42 numaralı kullanıcıya e-posta göndermesi gerektiğinde, Kullanıcı Verileri hizmetine "user_id 42 için e-posta adresi nedir?" Sorusunu soracak, e-postayı oluşturmak için tüm fatura bilgileriyle birlikte dahili verilerini kullanacak ve daha sonra bir e-posta adresi ve gövdesi

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.