Rakip Tüketiciler düzeni

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 bir 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 iletileri eşzamanlı olarak işebilir.

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 uygulamanın iş mantığının engellenmemelerini 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 saniye başına yüzlerce isteği işlemesi gerekirken, diğer zamanlarda bu 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 taşmasına neden olabilirsiniz. Veya, uygulamadan gelen ileti akışı nedeniyle mesajlaşma sistemi 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 örnekleri arasındaki iletişim kanalını uygulamak için bir mesaj 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ı

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. Sistem, mesaj hacmindeki dalgalanmaya göre tüketici hizmeti örnek sayısını dinamik olarak artırıp 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.

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 blog'unda Yer Alan TekLik Düzenleri'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 teslimi 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.

Örnek

Azure, Service Bus zaman bu bulut tasarım desenini doğrudan uygulamaya alan kuyruklar ve Azure İşlevi kuyruğu tetikleyicileri sağlar. Azure İşlevleri ve bağlamalar aracılığıyla Azure Service Bus ile tümleştirin. Şirket Service Bus, yayımcılar tarafından gönderilen kuyruk iletilerini tüketen işlevler derlemeye olanak sağlar. Yayımlama uygulaması bir kuyruğa ileti yayımlar ve Azure İşlevleri olarak uygulanan tüketiciler bu kuyruktan iletileri alabilir ve işebilir.

Bir Service Bus kuyruğu, bir tüketicinin kuyruktan ileti alırken modu kullanmasını sağlar; bu mod iletiyi gerçekten kaldırmaz, yalnızca diğer tüketicilerden PeekLock gizler. Azure İşlevleri çalışma zamanı PeekLock modunda bir ileti alır, işlev başarıyla tamamlanırsa iletide Complete çağrısı yapar veya işlev başarısız olursa Abandon çağrısı yapar ve ileti yeniden görünür hale gelir ve başka bir tüketicinin bunu almasına izin verir. İşlev PeekLock zaman aşımından daha uzun bir süre boyunca çalışırsa, işlev çalıştırıldıklarında kilit otomatik olarak yenilenir.

Azure İşlevleri ölçeği, kuyruğun derinliğine göre uztar/in olabilir; bunların hepsi kuyruğun rakip tüketicileri olarak hareket ediyor olabilir. İşlevlerin birden çok örneği oluşturulursa, iletileri bağımsız olarak çekerek ve işerek bunların hepsi 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 sanal Azure İşlevleri için bkz. Service Bus için Azure Azure İşlevleri.

Aşağıdaki kod, bir örneği kullanarak yeni bir ileti oluşturma ve Service Bus Kuyruğuna gönderme adımları ServiceBusClient 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ğinde, C# Azure İşlevi olarak yazılmış, ileti meta verilerini yazan ve kuyruk iletisini günlüğe kaydeden Service Bus gösterir. Özniteliğin ServiceBusTrigger bir Service Bus Kuyruğuna bağlamak için nasıl Service Bus not.

[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}");
}

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

  • 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.

  • İş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.