Kuyruk Tabanlı Yük Dengeleme düzeni

Görev ile görevin çağırdığı hizmet arasında arabellek görevi gören bir kuyruk kullanın. Bu yaklaşım, hizmetin başarısız olmasına veya görevin zaman aşımına uğratmasına neden olabilecek aralıklı ağır yükleri düzeltir. Talep artışlarının görev ve hizmetin kullanılabilirliği ve yanıt verme hızı üzerindeki etkisini en aza indirmeye yardımcı olur.

Bağlam ve sorun

Buluttaki birçok çözüm, hizmetleri çağıran görevler çalıştırır. Bu ortamda, aralıklı ağır yükler bir hizmet için performans veya güvenilirlik sorunlarına neden olabilir.

Hizmet, onu kullanan görevlerle aynı çözümün parçası olabilir veya sık kullanılan kaynaklara erişim sağlayan bir iş ortağı hizmeti olabilir. Bu tür hizmetlere örnek olarak önbellek veya depolama hizmeti verilebilir. Birden çok görev eşzamanlı olarak çalıştırıldığında ve aynı hizmeti kullandığında, isteklerin hacmini istediğiniz zaman tahmin etmek zordur.

Bir hizmet, aşırı yükleyen ve hizmetin isteklere hızlı yanıt verememesine neden olan talep artışlarıyla karşılaşabilir. Bir hizmete çok sayıda eşzamanlı istek göndermek, hizmet bu isteklerin yarattığı yoğunluğu kaldıramıyorsa başarısız olmasına da neden olabilir.

Çözüm

Görevle hizmet arasına bir kuyruk yerleştirin. Görev ve hizmet eşzamansız olarak çalışır. Görev, hizmete gereken verileri içeren bir iletiyi kuyruğa gönderir. Kuyruk bir arabellek işlevi görür ve hizmet onu alana kadar iletiyi depolar. Hizmet, kuyruktan iletileri alır ve işler. Yüksek oranda değişken hızlarda oluşturulabilen birden çok görevden gelen istekler, aynı ileti kuyruğu üzerinden hizmete geçirilebilir. Aşağıdaki diyagramda kuyruğun hizmet üzerindeki yükü nasıl dengeleyebileceğiniz gösterilmektedir.

İleti kuyruğunun görevler ile bir hizmet arasında arabellek görevi gördüğünü gösteren diyagram.

Kuyruk, eşzamanlı görevler yüksek hacimli istekler oluşturduğunda bile hizmetin iletileri kendi hızıyla işleyebilmesi için görevleri hizmetten ayrıştırıyor. Ayrıca, kuyruğa ileti gönderirken hizmet kullanılamıyorsa görevler gecikmez.

Bu düzen aşağıdaki faydaları sağlar:

  • Hizmet gecikmeleri uygulamayı hemen ve doğrudan etkilemediğinden kullanılabilirliği en üst düzeye çıkarmaya yardımcı olur. Hizmet kullanılamadığında veya şu anda iletileri işlemediğinde bile uygulama kuyruğa ileti göndermeye devam edebilir.

  • Kuyruk sayısı ve hizmet sayısı talebi karşılamak için farklılık gösterebileceğinden ölçeklenebilirliği en üst düzeye çıkarmaya yardımcı olur.

  • Maliyetleri denetlemeye yardımcı olur çünkü en yüksek yük yerine ortalama yük gereksinimlerini karşılamak için yalnızca yeterli hizmet örneğine ihtiyacınız vardır.

Uyarı

Bazı hizmetler, talep sistem hatasına neden olabilecek bir eşiğe ulaştığında azaltma uygular. Kısıtlama, kullanılabilir işlevleri azaltabilir. Talebin bu eşiğe ulaşmadığından emin olmak için bu hizmetlere yük dengeleme uygulayın.

Sorunlar ve dikkat edilmesi gerekenler

Bu düzenin nasıl uygulaneceğine karar velarken aşağıdaki noktaları göz önünde bulundurun:

  • Hedef kaynağın aşırıya kaçmasını önlemek için hizmetlerin iletileri işleme hızını denetleyen uygulama mantığı uygulayın. İstek artışlarını sistemin sonraki aşamasına geçirmekten kaçının. Gerekli dengelemeyi sağladığından emin olmak için sistemi yük altında test edin. Gerekli dengelemeyi elde etmek için kuyruk sayısını ve iletileri işleyen hizmet örneklerinin sayısını ayarlayın.

  • İleti kuyrukları tek yönlü bir iletişim mekanizmasıdır. Bir görev hizmetten yanıt bekliyorsa, hizmetin yanıt göndermek için kullanabileceği bir mekanizma uygulamanız gerekebilir. Daha fazla bilgi için bkz. Azure'da zaman uyumsuz mesajlaşma seçenekleri.

  • Tüketicilerin toplam aşağı akış hızını sınırlamadan otomatik ölçeklendirme, aşırı yüklemeyi yalnızca aşağı akış bağımlılıklarına taşır. Bu aşırı yükleme, bu hizmetlerin paylaştığı kaynakların çekişmelerini artırabilir ve yükü dengelemek için kuyruğun verimliliğini azaltabilir.

  • Ortalama üretici oranınız tüketici oranını aşarsa kuyruk büyümeye devam eder ve gecikme süresi artar. Kuyruk derinliğini izleyin ve tüketicileri güvenli sınırlar içinde ölçeklendirin ya da yükü üretici tarafında azaltın.

  • Bu düzen, ileti kaybını önlemek için kuyruk dayanıklılığına bağlıdır. Aracı, iletileri kalıcı depolamaya yazmazsa bir çökme veya kapasite sınırına ulaşılması, kuyruğa alınan verilerin tüketiciler tarafından işlenmeden önce kaybolmasına neden olabilir. İletileri diskte veya çoğaltılmış depolamada kalıcı hale getiren bir kuyruk hizmeti seçin ve boyut kotalarını ve bekletme sınırlarını anlayın. İletilerin bölgesel hatalardan kurtulmasını gerektiren iş yükleri için coğrafi olağanüstü durum kurtarma seçeneklerini değerlendirin.

  • Çoğu kuyruk hizmeti, en az bir kez semantik içeren iletiler teslim eder ve bu da tüketicilerin aynı iletiyi birden çok kez alabileceği anlamına gelir. Tüketici mantığını, aynı mesajın birden çok kez işlenmesinin aynı sonucu üretmesini ve yinelenen kayıtlar veya tekrarlanan ücretlendirmeler gibi sorunları önlemesini sağlayacak şekilde idempotent olarak tasarlayın.

  • Hatalı biçimlendirilmiş veriler içerdiği, eksik kaynaklara başvurdıkları veya kalıcı hataları tetikledikleri için bazı iletiler işlenemiyor. Bu iletilerin süresiz olarak döngüde kalmasına ve kuyruğu engellemesine izin vermek yerine, bunları ölü harf kuyruğuna yönlendirin. Operasyon ekibinizin hataları araştırabilmesi, altta yatan sorunu düzeltebilmesi ve uygun olduğunda iletileri yeniden gönderebilmesi için ölü harf kuyruğu derinliğini izleyin.

  • Üretici ile tüketici arasında bir kuyruğun tanıtılması, özellikle birden çok tüketici iletileri paralel olarak işlediğinde özgün gönderim sırasını her koşulda korumaz. İş yükünüz katı bir sıralama gerektiriyorsa, Azure Service Bus message oturumları gibi özellikleri kullanın. Katı sıralama gerekli değilse, tüketicileri iletileri herhangi bir sırada işleyecek şekilde tasarlayarak ölçeklendirmeyi basitleştirin.

Bu desen ne zaman kullanılır?

Bu düzeni aşağıdaki durumlarda kullanın:

  • İş yükünüz, aşağı akış hizmetlerini zorlayabilecek zaman zaman yaşanan ani artışlar yaşar.

  • Dayanıklılığı ve maliyet kontrolünü iyileştirmek için istek alımını işleme kapasitesinden ayırmanız gerekir.

Bu düzen aşağıdaki durumlarda uygun olmayabilir:

  • Çağıran, düşük gecikme süreli, zaman uyumlu bir yanıt gerektirir.

  • İş yükü hacmi tahmin edilebilir düzeyde düşük ve kararlı olduğundan kuyruğa alma karmaşıklığının eklenmesi çok az avantaj sağlar.

İş yükü tasarımı

Azure Well-Architected Framework sütunlarında ele alınan hedef ve ilkeleri karşılamak amacıyla, iş yükü tasarımında Kuyruk Tabanlı Yük Dengeleme düzeninin nasıl kullanılacağını değerlendirin. Aşağıdaki tabloda, bu desenin her bir sütunun hedeflerini nasıl desteklediği hakkında rehberlik sağlanmaktadır.

Temel Bu desen sütun hedeflerini nasıl destekler?
Güvenilirlik tasarımı kararları, iş yükünüzün hatalı çalışmaya dayanıklı olmasına ve bir hata oluştuktan sonra tamamen çalışır duruma geldiğinden emin olmasına yardımcı olur. Bu düzenin açıkladığı yaklaşım, görevlerin gelişini işlenmelerinden ayrıştırarak talepteki ani ani artışlara karşı dayanıklılık sağlayabilir. Kuyruk işlemindeki arızaları izole ederek alımı etkilemelerini önleyebilir.

- RE:06 Ölçeklendirme
Maliyet İyileştirme, iş yükünüzün yatırım getirisinisürdürmeye ve geliştirmeye odaklanır. Yük işleme istekten veya görev alımından ayrılmış olduğundan, en yüksek yükü işlemek için fazla kaynak sağlama gereksinimini azaltmak için bu yaklaşımı kullanabilirsiniz.

- CO:12 Ölçeklendirme maliyetleri
Performans Verimliliği , ölçeklendirme, veri ve kod iyileştirmeleri aracılığıyla iş yükünüzün talepleri verimli bir şekilde karşılamasını sağlar. İstek alımının işleme hızıyla bağıntıya ihtiyacı olmadığından bu yaklaşım aktarım hızı performansı için kasıtlı tasarım sağlar.

- PE:05 Ölçeklendirme ve bölümleme

Bu model bir sütun içinde dengeleri ortaya çıkartıyorsa, bunları diğer sütunların hedeflerine karşı değerlendirin.

Example

Web uygulaması bir dış veri deposuna veri yazar. Web uygulamasının birkaç örneği eşzamanlı olarak çalıştırılırsa, veri deposu isteklere yeterince hızlı yanıt vermeyebilir ve bu da isteklerin zaman aşımına, kısıtlanmasına veya başka bir şekilde başarısız olmasına neden olabilir. Aşağıdaki diyagramda, bir uygulamanın örneklerinden gelen eşzamanlı istekler tarafından aşırı yüklenmiş bir veri deposu gösterilmektedir.

Bir hizmeti zorlayan bir web uygulamasının örneklerinden gelen birkaç eşzamanlı isteği gösteren diyagram.

Bu sorunu çözmek için, uygulama örnekleriyle veri deposu arasındaki yükü dengelemek için bir kuyruk kullanın. Azure İşlevleri uygulaması, Service Bus kuyruğundaki iletileri okur ve veri deposuna okuma/yazma isteklerini gerçekleştirir. Azure İşlevleri, yapılandırdığınız ölçeklendirme sınırları içinde, hedef tabanlı ölçeklendirme kullanarak Service Bus birikmesine göre örnek sayısını ölçeklendirebilir. Veri depolarını korumak için tetikleyici eşzamanlılık ayarlarını da ayarlayabilirsiniz. Uygulama yönergeleri için bkz.: Hedef tabanlı ölçeklendirme ve Yatay ölçeklendirmeyi sınırlama. Bu ince ayar yapılmadan, worker katmanı arka uçta yeniden çekişmeye yol açabilir.

Yükü dengelemek için kuyruk ve işlev uygulamasının nasıl kullanılacağını gösteren diyagram.

Teknoloji varyasyonu olarak, Azure İşlevleri yerine Azure Container Apps kullanarak aynı deseni uygulayabilirsiniz. Bu yaklaşımda kapsayıcılı çalışan, Service Bus'dan gelen iletileri tüketir ve veri deposuna yazar. Container Apps, kuyrukla ilgili ölçek kurallarına göre çalışanı yapılandırılan en düşük ve en yüksek çoğaltmalar arasında ölçeklendirir. Olay kaynağı olarak Azure Kuyruk Depolama kullanarak da aynı yaklaşımı uygulayabilirsiniz. Uygulama kılavuzu için bkz. Container Apps'te ölçeklendirme kuralları ayarlama ve Container Appskullanarak olay odaklı bir iş dağıtma.

Sonraki Adımlar

Bu düzeni uygularken aşağıdaki yönergeler de yararlı olabilir:

  • Azure içindeki zaman uyumsuz mesajlaşma seçenekleri: İleti kuyrukları doğal olarak zaman uyumsuzdur. Doğrudan bir hizmetle iletişim kurarsa görevin uygulama mantığını yeniden tasarlamanız gerekebilir. Benzer şekilde, bir hizmeti ileti kuyruğundan gelen istekleri kabul etmek için yeniden düzenlemeniz gerekebilir.

  • Azure mesajlaşma hizmetleri arasında geçiş yapın: Azure uygulamalarında mesajlaşma ve kuyruğa alma mekanizması seçmenize yardımcı olacak daha fazla bilgi edinin.

  • Arka plan işleri geliştirme önerileri: Uygulama yüksek yükle karşılaştığında ileti kuyruklarının arka plan görevlerine yönelik istekleri depolaması için bu düzeni arka plan işlerine uygulayın.

  • Web-Queue-Worker mimari stili: Hem web hem de işleyici durumsuzdur. Oturum durumu dağıtılmış bir önbellekte depolanabilir. İşleyici, uzun süren işleri eşzamansız olarak gerçekleştirir ve kuyruktaki iletilerle tetiklenebilir veya toplu işleme için belirli bir zamanlamaya göre çalıştırılabilir.

  • Rakip Tüketiciler düzeni: Her biri yük dengeleme kuyruğundan ileti tüketicisi olarak davranan birden çok hizmet örneği çalıştırılabilir. İletilen alınma ve bir hizmete geçirilme hızını ayarlamak için bu yaklaşımı kullanabilirsiniz.

  • Azaltma düzeni: Bir hizmette azaltma uygulamanın basit bir yolu, kuyruk tabanlı yük dengelemeyi kullanmak ve tüm istekleri bir ileti kuyruğu aracılığıyla bir hizmete yönlendirmektir. Hizmet, istekleri ihtiyaç duyduğu kaynakları tüketmemesini ve olası çekişme miktarını azaltmasını sağlayan bir hızda işleyebilir.