Dağıtılmış hizmetlerde "yeniden deneme fırtınaları" nasıl önlenir?


11

İstemciler vazgeçmeden önce belirli sayıda yeniden denemek üzere yapılandırıldığında "yeniden deneme fırtınası" oluşur, bir hizmetin normal çalışmasında paket kaybı olacağından yeniden deneme ilkesi gerekir.

Bu örneği ele alalım:

Örnek Mimari

Örneğin, bir bütün olarak hizmetler saniyede 80.000 talebi destekleyecek ve kapasitenin yaklaşık% 80'inde çalışacak şekilde ölçeklendirilmişse, hizmetin saniyede 101.000 istek almasına neden olan trafikteki ani artış, bu taleplerin 1.000'inin başarısız olmasına neden olacaktır.

Yeniden deneme politikaları devreye girdiğinde, hizmeti saniyede 102.000 istekte bir bütün olarak iten hatanın nerede tespit edildiğine bağlı olarak 1000'den fazla istek ile sonuçlanırsınız - oradan hizmetiniz, sayıyı ikiye katlayan bir ölüm sarmalına girer saniyede başarısız istek.

Verimsiz olacağı öngörülen pik işlemin ötesinde hizmetlerin aşırı fazla sağlanması dışında. "Yeniden deneme fırtınalarını" önlemek için hangi stratejileri uygulayabilirsiniz?


100kQPS kapasitenin% 80'i ise, 101kQPS 1k arızalara neden olmamalıdır, sıfır arızaya neden olmalıdır - aşırı provizyon noktası değil mi?
Adrian

@ Hakkınızı sağlayın, noktayı açıklamak için tartışmalı bir örnekti - aşırı soyut olmadan noktayı netleştirecek kadar indirgeyici olmaya çalışıyordum. "100.000'i destekleyecek şekilde ölçeklendirildi" i "80.000'i destekleyecek şekilde ölçeklendirildi" olarak düzelttim.
Richard Slater

Yanıtlar:


8

Nelerden kaçınmaya çalıştığınıza bağlıdır.

Gerçekten kritik bir hizmet olan bir şeyin herhangi bir hizmet kesintisinden kaçınmaya çalışıyorsanız ("API çağrım uygun şekilde sunulmazsa insanlar ölecek" açısından düşünüyorum) büyük ölçüde adanmış kaynakların sağlanmasından kaynaklanmaktadır. Ve evet onlar adanmış olmak zorunda, bunların hiçbiri trafik sivri şeyler için izin, birden fazla hizmet sivri böylece bir kesintiye neden olur.

Gelen çok daha olası bir senaryo sen hizmet istemci ve sunucu taraftan hem sorunu çözmek için sakıncalı olacağını aşağı gidiyor o. Çok fazla trafik sorununu gerçekten çözmenin mantıklı olarak imkansız olduğunu belirtmekle birlikte, trafiği (kaynakları tüketen) işlemeden, yeniden denemenin doğru olup olmadığını bilemezsiniz, başarılı ancak yanlış işlenmiş bir istek için yeniden denemek o vb DDOS, var Ama eğer istemci tarafından, sen yapabilirsiniz etkisini azaltmak.

Olarak müşteri kodu , bir üst limit ve incelikle başarısız için bir mekanizma bulunur mantıklı yeniden deneme mantığı yazmak. Bu şekilde, kullanıcılarınızı sonsuz sayıda başarısız istek döngüsüne sokmazsınız ve kısa bir süre içinde yaptıklarını denemelerini söyleyen bir hata verirsiniz.

Sizin için sunucu tarafında altyapısı basit çözüm gaz etmektir. İstekler üzerindeki zor sınırlar, özellikle bunları özel kullanım durumunuza göre mantıklı bir şekilde dağıtabilirseniz (ör. Merkezi bir hizmetiniz varsa bazı zor kararlar alırsanız, iş parçacıklarının askıya alınmasına neden olabilecek coğrafi olarak uzak istekleri engellemeye başlamak ister misiniz? Yoksa kaçınılmaz ancak küçük kesintinizi eşit olarak mı dağıtmak istiyorsunuz? vb.) Temel olarak, 503'ü bir ağ geçidinden kasıtlı olarak döndürmenin, isteğin geçmesine ve 504 göndermekten çok daha ucuz olduğu gerçeğine dayanır. neyse. Temel olarak, istemcileri şu anda verebilecekleriniz doğrultusunda davranmaya zorlayın ve istemcilerin uygun şekilde tepki verebilmesi için doğru yanıtları sağlayın.


5

Bu yeniden deneme fırtınalarını önlemenin bir yolu, geri çekilme mekanizmaları kullanmaktır.

Gönderen yeniden deneme üzerinde geri çekilme uygulayın Google App Engine bölümünde Ölçeği için Tasarım rehberi:

İster Cloud Datastore gibi bir hizmeti ister URL Fetch'i veya Socket API'sını kullanarak harici bir hizmeti çağırarak kodunuz yeniden denenebilir. Bu durumlarda, gürleyen sürü probleminden kaçınmak için her zaman rasgele bir üstel geri çekilme politikası uygulamalısınız . Ayrıca, maksimum yeniden deneme sınırına ulaşıldıktan sonra toplam yeniden deneme sayısını ve işleme hatalarını da sınırlamalısınız.

GAE API'lerinin çoğunda zaten varsayılan olarak etkinleştirilmiş bu tür geri alma mekanizmaları / politikaları vardır.


Teşekkürler, geri çekilme mekanizmalarının uygulanması büyük tavsiyedir, genellikle Geçici Hata İşleme Uygulama Bloğunu kullanarak yapılandırılabilir üstel geri çekmeye giderim . Bununla birlikte, Azure'da hiper ölçekli uygulamaları çalıştıran 5 yıldan fazla operasyonel deneyim sayesinde, üstel geri çekmeler olsa bile "fırtınaları yeniden dene" hala oldukça sık oluyor - Onlardan kaçınmak için hiçbir zaman uygulanabilir bir strateji bulamadım.
Richard Slater
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.