Rakip Tüketiciler düzeni

Azure Functions
Azure Service Bus

Tüketicilerin aynı ileti kanalı üzerinden alınan iletileri eşzamanlı olarak işlemesine olanak tanıyın. Birden çok eşzamanlı tüketici ile sistem, aktarım hızını iyileştirmek, ölçeklenebilirliği ve kullanılabilirliği geliştirmek ve iş yükünü dengelemek için birden çok iletiyi eşzamanlı olarak işleyebilir.

Bağlam ve sorun

Bulutta çalışan bir uygulamanın çok sayıda isteği işlemesi beklenir. Yaygın olarak kullanılan bir teknik, her isteğin zaman uyumlu olarak işlenmesi yerine uygulamanın bir mesajlaşma sistemi üzerinden bunları zaman uyumsuz olarak işleyen başka bir hizmete (bir tüketici hizmeti) geçirmesini sağlamaktır. Bu strateji, istekler işlenirken uygulamadaki iş mantığının engellenmemesini sağlamaya yardımcı olur.

İstek sayısı, birçok nedenden dolayı zaman içinde büyük ölçüde farklılık gösterebilir. Kullanıcı etkinliğinde veya birden çok kiracıdan gelen toplu isteklerde ani bir artış yaşanması, öngörülemeyen bir iş yüküne neden olabilir. Yoğun saatlerde bir sistemin saniyede yüzlerce isteği işlemesi gerekebilirken, bazen sayı çok küçük olabilir. Ayrıca, bu isteklerin işlenmesi için gerçekleştirilen işin yapısı yüksek oranda değişkenlik gösterebilir. Tüketici hizmetinin tek bir örneğini kullanarak bu örneğin isteklerle dolup taşmasına neden olabilirsiniz. Alternatif olarak, mesajlaşma sistemi uygulamadan gelen bir ileti akışı tarafından aşırı yüklenmiş olabilir. Sistem, bu dalgalanan iş yükünün altından kalkmak için tüketici hizmetinin birden çok sürümünü çalıştırabilir. Bununla birlikte, her mesajın yalnızca bir tüketiciye iletilmesi için bu tüketicilerin uyumlu çalışması sağlanmalıdır. Ayrıca, bir örneğin performans sorunu haline gelmesinin önlenmesi için iş yükünün tüketiciler arasında dengelenmesi gerekir.

Çözüm

Uygulama ile tüketici hizmetinin kurulumları arasındaki iletişim kanalını uygulamak için bir ileti kuyruğu kullanın. Uygulama, istekleri mesaj biçiminde kuyruğa gönderir ve tüketici hizmeti örnekleri kuyruktan mesajları alıp işler. Bu yaklaşım, aynı tüketici hizmeti örnekleri havuzu tarafından uygulamanın herhangi bir örneğinden gelen mesajların işlenmesine imkan tanır. Şekilde, işi bir hizmetin örneklerine dağıtmak için mesaj kuyruğu kullanımı gösterilmiştir.

İşi bir hizmetin örneklerine dağıtmak için mesaj kuyruğu kullanımı

Not

Bu iletilerin birden çok tüketicisi olsa da bu, Abone Ol deseni (pub/sub) ile aynı değildir. Rakip Tüketiciler yaklaşımıyla her ileti işlenmek üzere tek bir tüketiciye geçirilirken, Pub/Sub yaklaşımıyla tüm tüketicilere her ileti geçirilir.

Bu çözümün şöyle avantajları vardır:

  • Uygulama örnekleri tarafından gönderilen isteklerin hacmindeki büyük değişikliklerle başa çıkabilen, yükü dengelenmiş bir sistem sağlar. Kuyruk, uygulama örnekleri ile tüketici hizmeti örnekleri arasında bir tampon görevi görür. Bu arabellek, hem uygulama hem de hizmet örnekleri için kullanılabilirlik ve yanıt hızı üzerindeki etkiyi en aza indirmeye yardımcı olabilir. Daha fazla bilgi için bkz . Kuyruk Tabanlı Yük Dengeleme düzeni. Uzun süre işlenmesi gereken bir mesajın işleme alınması, tüketici hizmetinin diğer örnekleri tarafından diğer mesajların eş zamanlı olarak işlenmesini engellemez.

  • Güvenilirliği artırır. Bir üretici bu düzeni kullanmak yerine doğrudan tüketici ile iletişim kuruyor ancak tüketiciyi izlemiyorsa, tüketicinin başarısız olması durumunda mesajların kaybolma veya işlenememe olasılığı yüksektir. Bu düzende mesajlar belirli bir hizmet örneğine gönderilmez. Başarısız olan hizmet örnekleri bir üreticiyi engellemez ve mesajlar çalışır durumdaki herhangi bir hizmet örneği tarafından işlenebilir.

  • Tüketiciler ya da üretici ile tüketici örnekleri arasında karmaşık bir uyumlu çalışma gereksinimi yoktur. Mesaj kuyruğu, her bir mesajın en az bir kere teslim edilmesini sağlar.

  • Ölçeklenebilirdir. Otomatik ölçeklendirme uyguladığınızda, ileti hacmi dalgalandığında sistem tüketici hizmetinin örnek sayısını dinamik olarak artırabilir veya azaltabilir.

  • Mesaj kuyruğu işlemsel okuma işlemleri sağlıyorsa dayanıklılığı artırabilir. Mesajı işlemsel bir işlem kapsamında okuyup işleyen bir tüketici hizmeti örneği başarısız olursa, bu düzen mesajın başka bir tüketici hizmeti örneği tarafından alınıp işlenmek üzere kuyruğa döndürülmesini sağlar. İletinin sürekli başarısız olması riskini azaltmak için, teslim edilemeyen ileti kuyruklarını kullanmanızı öneririz.

Sorunlar ve dikkat edilmesi gerekenler

Bu düzenin nasıl uygulanacağına karar verirken aşağıdaki noktaları göz önünde bulundurun:

  • Mesaj sıralama. Tüketici hizmeti örneklerinin mesajları hangi sırada alacağına ilişkin bir garanti yoktur ve bu sıralama her zaman mesajların oluşturulma sırasını yansıtmaz. Mesaj işlemenin bir kere etkili olması mesajların işlenme sırasına bağımlılığın ortadan kaldırılmasına yardımcı olacağından, sistemi bunu sağlayacak şekilde tasarlayın. Daha fazla bilgi için Jonathon Oliver'ın blogundaki Idempotency Patterns bölümüne bakın.

    Microsoft Azure Service Bus Kuyrukları, mesaj oturumları kullanılarak mesajların “ilk giren ilk çıkar” ilkesine göre sıralanmasının garanti edildiği bir model uygulayabilir. Daha fazla bilgi için bkz. Oturumları Kullanarak Mesajlaşma Düzenleri.

  • Hizmetleri dayanıklılık sağlayacak şekilde tasarlama. Sistem başarısız hizmet örneklerini algılayıp yeniden başlatacak şekilde tasarlanmışsa, tek bir mesajın birden çok kez alınıp işlenmesinden kaynaklanacak etkilerin en aza indirilmesi için hizmet örnekleri tarafından gerçekleştirilen işlemlerin bir kere etkili olacak işlemler şeklinde uygulanması gerekli olabilir.

  • Zehirli mesajları algılama. Hatalı biçimlendirilmiş bir ileti veya kullanılabilir durumda olmayan kaynaklara erişim gerektiren bir görev, bir hizmet örneğinin başarısız olmasına yol açabilir. Sistem tarafından böyle iletilerin kuyruğa döndürülmesi engellenmeli ve bunun yerine, gerektiğinde analiz edilebilmesi için bu iletilerin ayrıntıları yakalanıp depolanmalıdır.

  • Sonuçları işleme. Bir mesajı işleyen hizmet örneği, mesajı oluşturan uygulama mantığından tamamen bağımsızdır ve bu ikisi birbiriyle doğrudan iletişim kuramıyor olabilir. Hizmet örneği uygulama mantığına döndürülmesi gereken sonuçlar oluşturuyorsa, bu bilgilerin her ikisi tarafından erişilebilen bir konumda saklanması gerekir. Sistem, uygulama mantığının eksik veri almasını engellemek için işlemin tamamlandığını belirtmelidir.

    Azure kullanıyorsanız, bir çalışan işlemi adanmış bir mesaj yanıtlama kuyruğu kullanarak sonuçları uygulama mantığına döndürebilir. Uygulama mantığının bu sonuçları özgün mesajla ilişkilendirebilmesi gerekir. Bu senaryo, Zaman Uyumsuz Mesajlaşma Temel Bilgileri sayfasında daha ayrıntılı açıklanmıştır.

  • Mesajlaşma sistemini ölçeklendirme. Büyük ölçekli bir çözümde tek bir mesaj kuyruğu kullanılırsa bu kuyruk mesaj sayısı nedeniyle aşırı yüklenebilir ve sistemde performans sorunlarına yol açabilir. Bu durumda, mesajlaşma sistemini belirli üreticilerden belirli bir kuyruğa mesaj gönderecek şekilde bölümlemeyi veya mesajları birden çok mesaj kuyruğuna dağıtmak için yük dengeleme kullanmayı göz önünde bulundurun.

  • Mesajlaşma sisteminin güvenilir olmasını sağlama. Uygulama bir mesajı kuyruğa aldıktan sonra mesajın kaybolmamasının sağlanması için güvenilir bir mesajlaşma sistemi gerekir. Bu sistem, tüm iletilerin en az bir kez teslim edilmesini sağlamak için gereklidir.

Bu düzenin kullanılacağı durumlar

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

  • Bir uygulamanın iş yükü, zaman uyumsuz olarak çalışabilen görevlere bölünür.
  • Görevler birbirinden bağımsızdır ve paralel olarak çalıştırılabilir.
  • İş hacmi son derece değişken olduğundan, ölçeklenebilir bir çözüm gerektirir.
  • Çözümün yüksek kullanılabilirlik sağlaması ve bir görevin işlenmesinin başarısız olması durumunda dayanıklı olması gerekir.

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

  • Uygulama iş yükünün ayrı görevlere bölünmesinin kolay olmadığı veya görevler arasındaki bağımlılığın yüksek olduğu durumlar.
  • Görevlerin zaman uyumlu olarak gerçekleştirilmesini ve uygulama mantığının devam etmeden önce bir görevin tamamlanmasını beklemesini gerektiren durumlar.
  • Görevlerin belirli bir sırayla gerçekleştirilmesini gerektiren durumlar.

Bazı mesajlaşma sistemleri, bir üreticinin mesajları gruplandırmasına ve hepsinin aynı tüketici tarafından işlenmesini sağlamasına imkan tanıyan oturumları destekler. Bu mekanizma, bir üreticiden gelen mesajları tek bir tüketiciye sıralı olarak teslim eden bir tür mesaj sıralama sistemi uygulamak için öncelik verilen mesajlarla (destekleniyorsa) kullanılabilir.

İş yükü tasarımı

Bir mimar, Azure İyi Tasarlanmış Çerçeve yapılarında ele alınan hedefleri ve ilkeleri ele almak için Rakip Tüketiciler deseninin iş yükünün tasarımında nasıl kullanılabileceğini değerlendirmelidir. Örneğin:

Yapı Taşı Bu desen sütun hedeflerini nasıl destekler?
Güvenilirlik tasarımı kararları, iş yükünüzün arızaya karşı dayanıklı olmasına ve bir hata oluştuktan sonra tamamen çalışır duruma gelmesini sağlamaya yardımcı olur. Bu düzen, tüketicileri çoğaltma olarak değerlendirerek kuyruk işlemede yedeklilik oluşturur, bu nedenle örnek hatası diğer tüketicilerin kuyruk iletilerini işlemesini engellemez.

- RE:05 Yedeklilik
- RE:07 Arka plan işleri
Maliyet İyileştirme, iş yükünüzün yatırım getirisini sürdürmeye ve geliştirmeye odaklanır. Bu düzen, kuyruk boş olduğunda sıfıra inerek kuyruk derinliğine dayalı ölçeklendirmeyi etkinleştirerek maliyetleri iyileştirmenize yardımcı olabilir. Ayrıca en fazla eşzamanlı tüketici örneği sayısını sınırlamanıza olanak tanıyarak maliyetleri en iyi duruma getirebilir.

- CO:05 Hız iyileştirme
- CO:07 Bileşen 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. Yükün tüm tüketici düğümlerine dağıtılması, kuyruk derinliğine göre kullanımı ve dinamik ölçeklendirmeyi artırır. Aşırı sağlamayı en aza indirme.

- PE:05 Ölçeklendirme ve bölümleme
- PE:07 Kod ve altyapı

Herhangi bir tasarım kararında olduğu gibi, bu desenle ortaya konulabilecek diğer sütunların hedeflerine karşı herhangi bir dengeyi göz önünde bulundurun.

Örnek

Azure, bir araya getirildiğinde bu bulut tasarım deseninin doğrudan bir uygulaması olan Service Bus Kuyrukları ve Azure İşlev kuyruğu tetikleyicileri sağlar. Azure İşlevleri tetikleyiciler ve bağlamalar aracılığıyla Azure Service Bus ile tümleştirin. Service Bus ile tümleştirme, yayımcılar tarafından gönderilen kuyruk iletilerini kullanan işlevler oluşturmanıza olanak tanır. Yayımlama uygulamaları bir kuyruğa ileti gönderir ve Azure İşlevleri olarak uygulanan tüketiciler bu kuyruktan iletileri alabilir ve işleyebilir.

Dayanıklılık için Service Bus kuyruğu, tüketicinin kuyruktan bir ileti aldığında modu kullanmasına PeekLock olanak tanır; bu mod aslında iletiyi kaldırmaz, yalnızca diğer tüketicilerden gizler. Azure İşlevleri çalışma zamanı PeekLock modunda bir ileti alır; işlev başarıyla biterse iletide Complete çağrısında bulunur veya işlev başarısız olursa Abandon çağrısı yapabilir ve ileti yeniden görünür hale gelir ve başka bir tüketicinin bu iletiyi almasına olanak tanır. İşlev PeekLock zaman aşımından daha uzun bir süre boyunca çalışıyorsa, işlev çalıştığı sürece kilit otomatik olarak yenilenir.

Azure İşlevleri, kuyruğun derinliğine göre ölçeği genişletebilir/daraltabilir ve bunların tümü kuyruğun rakip tüketicileri olarak hareket eder. İşlevlerin birden çok örneği oluşturulursa, bunların tümü iletileri bağımsız olarak çekerek ve işleyerek rekabet eder.

Azure Service Bus kuyruklarını kullanma hakkında ayrıntılı bilgi için bkz. Service Bus kuyrukları, konuları ve abonelikleri.

Kuyruk tarafından tetiklenen Azure İşlevleri hakkında bilgi için bkz. Azure İşlevleri için Azure Service Bus tetikleyicisi.

Aşağıdaki kod, bir örneği kullanarak ServiceBusClient nasıl yeni bir ileti oluşturabileceğinizi ve service bus kuyruğuna nasıl gönderebileceğinizi gösterir.

private string serviceBusConnectionString = ...;
...

  public async Task SendMessagesAsync(CancellationToken  ct)
  {
   try
   {
    var msgNumber = 0;

    var serviceBusClient = new ServiceBusClient(serviceBusConnectionString);

    // create the sender
    ServiceBusSender sender = serviceBusClient.CreateSender("myqueue");

    while (!ct.IsCancellationRequested)
    {
     // Create a new message to send to the queue
     string messageBody = $"Message {msgNumber}";
     var message = new ServiceBusMessage(messageBody);

     // Write the body of the message to the console
     this._logger.LogInformation($"Sending message: {messageBody}");

     // Send the message to the queue
     await sender.SendMessageAsync(message);

     this._logger.LogInformation("Message successfully sent.");
     msgNumber++;
    }
   }
   catch (Exception exception)
   {
    this._logger.LogException(exception.Message);
   }
  }

Aşağıdaki kod örneği, ileti meta verilerini okuyan ve Service Bus Kuyruğu iletisini günlüğe kaydeden C# Azure İşlevi olarak yazılmış bir tüketiciyi gösterir. Özniteliğin ServiceBusTrigger service bus kuyruğuna bağlamak için nasıl kullanıldığını unutmayın.

[FunctionName("ProcessQueueMessage")]
public static void Run(
    [ServiceBusTrigger("myqueue", Connection = "ServiceBusConnectionString")]
    string myQueueItem,
    Int32 deliveryCount,
    DateTime enqueuedTimeUtc,
    string messageId,
    ILogger log)
{
    log.LogInformation($"C# ServiceBus queue trigger function consumed message: {myQueueItem}");
    log.LogInformation($"EnqueuedTimeUtc={enqueuedTimeUtc}");
    log.LogInformation($"DeliveryCount={deliveryCount}");
    log.LogInformation($"MessageId={messageId}");
}

Sonraki adımlar

  • Zaman Uyumsuz Mesajlaşma Temel Bilgileri. Mesaj kuyrukları zaman uyumsuz bir iletişim mekanizmasıdır. Bir tüketici hizmetinin bir uygulamaya yanıt göndermesi gerekiyorsa bir tür yanıt mesajlaşması uygulamak gerekebilir. Zaman Uyumsuz Mesajlaşma Temel Bilgileri sayfasında mesaj kuyrukları kullanılarak nasıl istek/yanıt mesajlaşması uygulanabileceği hakkında bilgi sağlanmaktadır.

  • Otomatik Ölçeklendirme Kılavuzu. Uygulamaların mesaj gönderdiği kuyruğun uzunluğu değişkenlik gösterdiğinden, bir tüketici hizmetinin örneklerini durdurmak ve başlatmak mümkün olabilir. Otomatik ölçeklendirme, en yüksek düzeyde işleme gerçekleştirildiği sırada aktarım hızının korunmasına yardımcı olabilir.

Bu düzen uygulanırken aşağıdaki düzenler ve yönergeler yararlı olabilir:

  • İşlem Kaynağı Birleştirme düzeni. Maliyetlerin ve yönetim yükünün azaltılması amacıyla bir tüketici hizmetinin birden çok örneğinin tek bir işlem altında birleştirilmesi mümkün olabilir. İşlem Kaynağı Birleştirme düzeni, bu yaklaşımı izlemenin avantajları ve kısıtlamaları hakkında bilgi sağlar.

  • Kuyruk Tabanlı Yük Dengeleme düzeni. Bir sisteme mesaj kuyruğu eklenmesi, hizmet örneklerinin uygulama örneklerinden gelen ve hacmi büyük oranda değişiklik gösteren istekleri işlemesine imkan tanıyarak dayanıklılığı artırabilir. Mesaj kuyruğu, yükü dengeleyen bir tampon görevi görür. Kuyruk Tabanlı Yük Dengeleme düzeninde bu senaryo daha ayrıntılı olarak açıklanmıştır.