Bunlardan biri başarısız olursa, birkaç mikro servisi güncelleyen yazılımınızı nasıl tasarlarsınız?


12

Diğerleri sabitken, aşağı veya aşağı giden hizmetlere yardımcı olmak için kullanabileceğim bir tasarım deseni veya uygulaması var mı?

Ya üç mikro hizmetim varsa ve ikisi iyi ise ve biri POST'un tam ortasında ölürse ne olur? İki POST alacak ve bir alacak. İşlem yapabileceğimi sanmıyorum çünkü bir hizmete olan taleplerimi gönderiyorum.

Bunun için nasıl tasarım yapabilirim? Çeşitli veritabanlarında yetim veri istemiyorum.


6
Çözmek basit bir sorun değil. Hizmetlerin kuyruğa (nihai tutarlılık) uygulandığını gördüm, çünkü büyük olasılıkla, hizmet (ler) i kontrol etmemeniz ve işlem yöneticilerini veya işlem yeteneklerini empoze etmeniz en iyi ihtimalle saçmalıktır ve muhtemelen iyi bir fikir değildir. bir SOA ortamında. Bunu çoğunlukla, hedefinizle bağlantı kurabileceğiniz veya bağlayamayacağınız mobil push etrafında gördüm.
Mike

mikro servisler üzerindeki asit çatlamak için zor bir somundur, başka bir seçenek de redis yayınlama / abone olma veya kuyruk tasarımı ve gelen kanaldan bir kez gönderme kullanarak bir tür veriyolu olabilir, ardından abone hizmetleriniz veya hizmet proxy'leriniz hedeflere iter ve başarıyı bildirir hatası. Arızaları izlemeniz ve bunun için de bir akışınız olması gerekir. Ayrıca işlemin bir hizmette geçerli değil, diğer iki hizmette geçerli olduğu ancak ele almanız gereken başka bir başarısızlık akışının olduğu hatalarınız da olabilir.
Tim Cederquist

"Sıra yöneticisi" gibi bir şey kullanmaz mıydım, Redis bir darboğaz neden olacağını tahmin ediyorum? Ya da en azından yüksek potansiyele sahip mi? Senin de tarif ettiğinden başka bir yol bilmiyorum.
johnny

Veri akışının hacmine bağlı olarak, başarı bildirilene kadar iletimleri yeniden deneyen veya başarısız bir bildirim gönderen ve kesinti hakkında bir SMS uyarısı gönderen bir kuyruk yöneticisi uyguladım. Sanırım biraz da beklenen kesinti penceresine bağlı (ne kadar süre).
htm11h

Rabbitmq gibi bir şey bu mu?
johnny

Yanıtlar:


9

Bazı seçenekler.

Kalıcı bir iletişim kanalı kullanın

HTTP yerine, iletileri yüksek oranda kullanılabilir ve kalıcı olan bir sıraya bırakın. Örneğin Kafka. Hedef sunucu bir noktada kullanılabilir olduğu sürece iletiyi alır.

Artık karmaşık bir alt sistemi (kuyruk) sağlama ve yönetme dengesine sahipsiniz. Bu yüzden bunun değerli olup olmadığını analiz ettiğinizden emin olun.

Geri çekil ve tekrar dene

Arayanın başarısız isteği (muhtemelen diskte kalmaya devam etmesini) sağlayın ve periyodik olarak tekrar deneyin. Bu durumda, hizmetin çökmesine neden olan bir çökmeye neden olan isteğinizi ayırt etmek önemlidir. Birincisi muhtemelen bir hatadan kaynaklanmaktadır ve günlüğe kaydedilmelidir ... yeniden denemeler muhtemelen bir düzeltme yapılana kadar bir fark yaratmaz.

Algıla ve telafi et

Periyodik bir görev, mikro hizmetler arasındaki tutarlılık koşullarını kontrol eder. Örneğin, başarısızlık, API sorgularını gerektiği gibi yönlendirmek için tamamen günlüğe kaydeder. Bir sorun bulursa (örneğin, bir sipariş var ancak gönderim hiç alınmadı ambalaj listesi), tazminat adımları uygulayın. Bu adımlar, manuel düzeltme için bir destek bileti oluşturmak veya birine veya başka bir şekilde e-posta göndermek olabilir.

Tasarım alternatiflerini göz önünde bulundurun

Böyle bir durum, etkilenen mikro hizmetlere yapılan çağrıları yönetmek için muhtemelen bir API ağ geçidi gerektirir. Bu şekilde, bu sorunu azaltmak için hangi taktiklerin kullanılacağını kontrol edersiniz. Muhtemelen müşterilere bu uygulama ayrıntılarını yüklemek istemezsiniz. Bkz. Devre kesici düzeni .

Mikro hizmetler bağımsız olduğundan, her zaman tutarsızlığa neden olabilecek bir hata durumu vardır. Bunlar ortaya çıktığında manuel düzeltmeler yapmaya hazır olmalısınız.

Güçlü bir tutarlılığa ihtiyacınız varsa, mikro hizmetler iyi bir uyum olmayacaktır. Hala ölçeklenebilirliğe ihtiyaç duyuyorsanız , tutarlılık garantileri için ilgili verilerin aynı kırıkta birlikte yerleştirilebileceği parçalara bakmak isteyebilirsiniz . Parçalar ekleyerek IO'yu ölçeklendirebilirsiniz.

Güçlü bir tutarlılığa ihtiyacınız varsa ve ölçeklenebilirlik sorunlarınız yoksa, sadece yekpare hizmetleri kullanın. Endişeleri ayırmak için kütüphaneleri başvurunuzda sınır olarak kullanın.


RabbitMQ bunun için mi?
johnny

RabbitMQ sorunuzun cevabı mı? Hayır. Bu, ihtiyaçlarınızı karşılayan bir çözümün bir parçası olabilir, ancak sorununuzu tek başına çözmeyecektir.
Kasey Speakman

Sadece bir not. Sanırım RabbitMQ mesajlara devam etmiyor. Sıradan tüketilir ve kaldırılır, bu yüzden HAYIR. Kalıcılığa ve yeniden denemeye ihtiyacınız varsa, RabbitMQ yardımcı olmaz.
LAIV

2

Açıkladığınız şeyin fikir birliği sorunu olduğunu düşünüyorum: dağıtılmış işlemdeki her katılımcı işlemin başarılı olduğunu söylemedikçe işlem yapmak istemezsiniz. Bunun basit çözümü İki Aşamalı Taahhüttür. Esasen, her sistemdeki işlemi, evrelemenin başarılı olduğunu bildirene kadar aşamalandırır (Aşama 1). İşlemdeki her katılımcı başarılı olursa, her birine taahhütte bulunması söylenir; bunlardan herhangi biri bunun yerine bir hata döndürürse, bir geri alma yapılır (Aşama 2). Sizi daha karmaşık Üç Fazlı Taahhüt çözümüne götüren bir kırışıklık var. Her birinin daha iyi bir açıklamasını buradan okuyabilirsiniz:

http://the-paper-trail.org/blog/consensus-protocols-two-phase-commit/

http://the-paper-trail.org/blog/consensus-protocols-three-phase-commit/

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.