Öncelikli Kuyruk düzeni

Bir iş yükünün yüksek öncelikli istekleri düşük öncelikli isteklerden daha hızlı işlemesi için hizmetlere gönderilen isteklerin önceliklerini belirleyin. Bu yaklaşım bir veya daha fazla kuyruğa gönderilen iletileri kullanır ve farklı istek türlerine veya müşterilere farklı hizmet düzeyleri veya hizmet düzeyi sözleşmeleri (SLA) sağlayan uygulamalar için yararlıdır.

Bağlam ve sorun

İş yüklerinin farklı önem düzeylerine ve aciliyet düzeylerine sahip görevleri yönetmesi ve işlemesi gerekebilir. Bazı görevlere hemen dikkat edilmesi gerekirken, diğerleri bekleyebilir. Yüksek öncelikli görevlerin ele alınamaması kullanıcı deneyimini etkileyebilir ve SLA'ları ihlal edebilir.

Görevleri önceliklerine göre verimli bir şekilde işlemek için iş yüklerinin görevleri uygun şekilde işlemek ve çalıştırmak için bir mekanizmaya ihtiyacı vardır. Varsayılan olarak, çoğu iş yükü görevleri ilk giriş, ilk çıkış (FIFO) kuyruk yapısını kullanarak geldikleri sırayla işler. Bu yaklaşım, değişen görev önem derecesini hesaba eklemez.

Çözüm

Öncelik kuyrukları, iş yüklerinin görevleri varış sırasına göre değil önceliklerine göre işlemesine olanak sağlar. İstek gönderen uygulama veya üretici iletiye bir öncelik değeri atar ve tüketiciler iletileri önceliğe göre işler. Öncelik Sırası düzeni aşağıdaki gereksinimleri karşılar:

  • Değişen aciliyet ve önem derecesine göre görevleri işler: Farklı aciliyet ve önem düzeylerine sahip görevleriniz vardır ve daha az kritik görevlerden önce daha kritik görevleri işlemenizi sağlamanız gerekir.

  • Farklı SLA'ları işler: Farklı müşterilere farklı SLA'lar sunarsınız ve yüksek öncelikli müşterilerin daha iyi performans ve kullanılabilirlik elde etmesini sağlamanız gerekir.

  • Farklı iş yükü yönetimi gereksinimlerini karşılar: Daha az acil görevler bekleyebilirken belirli görevleri hemen ele alması gereken bir iş yükünüz var.

Öncelik Sırası düzenini uygulamak için iki ana yaklaşım vardır:

  • Tek kuyruk: Her iletiye bir öncelik değeri atanır ve tüm iletiler aynı kuyruğu kullanır.

  • Birden çok kuyruk: Her iletiye bir öncelik değeri atanır ve farklı öncelikli iletiler ayrı kuyruklar kullanır.

Tek kuyruk

Tek bir kuyruk yaklaşımında, uygulama her iletiye bir öncelik atar ve tüm iletileri tek bir kuyruğa gönderir. Kuyruk, iletileri önceliğe göre sıralar ve tüketicilerin yüksek öncelikli iletileri düşük öncelikli iletilerden önce işlemesini sağlar.

İleti önceliklendirmeyi destekleyen bir kuyruğa alma mekanizmasını gösteren diyagram.

Birden çok kuyruk

Birden çok kuyruk iletileri önceliğe göre ayırır. Uygulama her iletiye bir öncelik atar ve iletiyi, tüketicilerin iletileri işlediği önceliğe karşılık gelen kuyruğa yönlendirir. Çok kuyruklu bir çözüm, tek bir tüketici havuzunu veya birden çok tüketici havuzunu kullanabilir.

Tek tüketici havuzu

Tek bir havuz kurulumunda tüm kuyruklar aynı tüketici havuzunu paylaşır. Tüketiciler en yüksek öncelikli kuyruktan gelen iletileri önce işler ve düşük öncelikli kuyruklardan gelen iletileri yalnızca daha fazla yüksek öncelikli ileti olmadığında işler. Sonuç olarak, tek tüketici havuzları her zaman düşük öncelikli iletilerden önce daha yüksek öncelikli iletileri işler. Bu kurulum, düşük öncelikli iletilerin sürekli olarak gecikmesine ve hiçbir zaman işlenmemesine neden olabilir.

Tüm öncelikler için tek bir tüketici havuzu kullanmayı gösteren diyagram.

Aşağıdaki nedenlerle tek bir tüketici havuzu kullanın:

  • Basit yönetim. Kolay kurulum ve bakım öncelikli olduğunda tek bir tüketici havuzu kullanın. Tek bir havuz yapılandırma ve izleme karmaşıklığını azaltır.

  • Birleşik işleme gereksinimleri. Gelen görevler türünde benzer olduğunda tek bir tüketici havuzu kullanın.

Birden çok tüketici havuzu

Birden çok tüketici havuzunda her kuyruğun ayrılmış bir tüketici havuzu vardır. Yüksek öncelikli kuyruklar, iletileri düşük öncelikli kuyruklardan daha hızlı işlemek için daha fazla tüketici veya daha yüksek performans katmanı kullanır.

Her öncelik için ayrı tüketici havuzları kullanmayı gösteren diyagram.

Aşağıdaki nedenlerle birden çok tüketici havuzu kullanın:

  • Katı performans gereksinimleri. Farklı görev öncelikleri bağımsız olarak karşılanması gereken katı performans gereksinimlerine sahip olduğunda birden çok tüketici havuzu kullanın.

  • Yüksek güvenilirlik gereksinimleri. Güvenilirlik ve hata yalıtımı kritik olduğunda ve bir kuyruktaki sorunların diğer kuyrukları etkilememesi gerektiğinde uygulamalar için birden çok tüketici havuzu kullanın.

  • Karmaşık uygulamalar. Farklı görevlerin farklı işleme özellikleri ve performans garantileri gerektirdiği karmaşık uygulamalar için birden çok tüketici havuzu kullanın.

Sorunlar ve dikkat edilmesi gerekenler

Bu deseni nasıl uygulayabileceğinize karar vermek için aşağıdaki noktaları göz önünde bulundurun:

Genel öneriler

  • Öncelikleri net bir şekilde tanımlayın. Çözümünüzle ilgili ayrı ve net öncelik düzeyleri oluşturun. Örneğin, yüksek öncelikli iletileri 10 saniye içinde işlenmesi gereken iletiler olarak tanımlayabilirsiniz. Yüksek öncelikli öğeleri işlemek için tüketici gereksinimlerini belirleyin ve gerekli kaynakları uygun şekilde ayırın.

  • Tüketici havuzlarını dinamik olarak ayarlayın. Tüketici havuzlarının boyutunu hizmet verdikleri kuyruğun uzunluğuna göre ölçeklendirin.

  • Kuyruk durumunu izleyin. Çalışmanızı etkilemeden önce kapsamları ve yavaşlamaları algılamak için kuyruk derinliğini, işleme gecikme süresini, teslim sayısını ve aktarım hızını izleyin.

  • Teslim edilemeyen ileti kuyruklarını kullanın. Hatalı bir iletinin öncelik yolunu engellememesi için, yapılandırılabilir sayıda teslim girişiminden sonra zehirli iletileri teslim edilemeyen bir kuyruğa taşıyın.

  • Hizmet düzeylerinin önceliklerini belirleyin. Önceliklendirilmiş kullanılabilirlik veya performans gerektiren iş gereksinimlerini karşılamak için öncelik kuyrukları uygulayın. Örneğin, yüksek öncelikli müşteriler daha yüksek bir hizmet düzeyi elde ederek daha iyi performans ve kullanılabilirlik elde edebilir.

  • Düşük öncelikli işlemeyi göz önünde bulundurun. Düşük öncelikli öğelerden önce tüm yüksek öncelikli öğelerin işlenip işlenmeyeceğine karar verin. Mümkünse, düşük öncelikli iletilerin sonunda işlenmesini sağlamak için eski iletilerin önceliğini dinamik olarak artırın.

  • Maliyetleri iyileştirin ve en aza indirin. Kritik görevleri anında mevcut olan tüketicilerle işleyin. Daha az meşgul zamanlarda daha az kritik arka plan görevleri zamanlayın.

    Tek bir kuyruk kullanıyorsanız, tüketici sayısını ölçeklendirerek maliyetleri iyileştirin. Yüksek öncelikli iletiler önce işlenir ancak büyük olasılıkla daha yavaş işlenirken, düşük öncelikli iletiler daha uzun gecikmelerle karşılaşabilir.

  • İşlemcileri talep artışlarından koruyun. Üreticinin varış oranı tüketicinin işleme kapasitesini aşabiliyorsa, bu düzeni Kuyruk Tabanlı Yük Düzeyleme düzeni ile birleştirin. Bu yaklaşım trafik artışlarını arabelleğe alır ve aşağı akış işleme kaynaklarının aşırı yüklenmesini önlemeye yardımcı olur.

Birden çok kuyruk önerisi

  • İşlem hızlarını izleyin. İletilerin beklenen hızlarda işlenmesini sağlamak için, yüksek ve düşük öncelikli kuyrukların işleme hızını sürekli olarak izleyin.

  • Önalım ve askıya alma işlemlerini uygulayın. Tek bir tüketici havuzuyla birden çok kuyruk kullanıyorsanız, düşük öncelikli kuyruklardan önce yüksek öncelikli kuyruklara her zaman hizmet sağlanmasını sağlayan bir algoritma uygulayın.

  • Kuyruk maliyetlerini göz önünde bulundurun. Kuyrukları denetleme ve işleme ile ilişkili finansal maliyetleri unutmayın. Bazı kuyruk hizmetleri iletileri göndermek, almak ve sorgulamak için ücret alır. Bu ücretler kuyruk sayısıyla artabilir.

Bu desen ne zaman kullanılır?

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

  • Premium veya standart müşteri istekleri gibi farklı iş sınıfları için farklı gecikme süresi veya hizmet düzeyi hedeflerini karşılamanız gerekir.

  • İş ani artışlarla gelir ve düşük öncelikli çalışmayı ertelerken önce yüksek öncelikli iletileri işleyerek kritik işlemleri korumanız gerekir.

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

  • Tüm iş öğelerinin iş önemi benzerdir ve sıkı FIFO işleme, öncelik tabanlı zamanlamadan daha önemlidir.

  • Görevlerin öncelik düzeylerinde güçlü sıralama bağımlılıkları vardır ve işi önceliğe göre yeniden sıralamak tutarsız sonuçlara neden olabilir veya karmaşık koordinasyon mantığı gerektirebilir.

İş yükü tasarımı

Azure Well-Architected Framework yapılarında ele alınan hedefleri ve ilkeleri ele almak için bir iş yükünün tasarımında Öncelik Sırası 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 arızaya karşı dayanıklı olmasına ve bir hata oluştuktan sonra tamamen çalışır duruma gelmesini sağlamaya yardımcı olur. Öğeleri iş önceliğine göre ayırmak, güvenilirlik çalışmalarını en kritik çalışmalara odaklamanıza olanak tanır.

- RE:02 Kritik akışlar
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. Öğeleri iş önceliğine göre ayırmak, performans çalışmalarını zamana en duyarlı çalışmalara odaklamanıza olanak tanır.

- PE:09 Kritik iş akışları

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

Örnek

GitHub'da Yer alan Öncelik Sırası düzeni örneği, Azure Service Bus konu başlıklarını ve abonelikleri kullanan Öncelik Sırası düzeninin bir uygulamasını gösterir. Örnek, gönderen ve tüketici işlevleri arasındaki iletişimi etkinleştirmek için güvenli bir depolama hesabı, izleme için Application Insights kaynağı ve Service Bus ad alanı dağıtır.

Dağıtım üç işlev uygulaması içerir: bir gönderen ve iki tüketici. Tüketici uygulamaları, ileti önceliklendirme simülasyonu yapmak için farklı maksimum örnek sayısı kullanır. funcPriorityQueueConsumerHigh İşlevin ölçeği 200 örneğe, işlev ise funcPriorityQueueConsumerLow 40 örnekle sınırlıdır. Tüm işlev uygulamaları Flex tüketim planını kullanır ve tanılama ve izleme için Application Insights'a bağlanır.

Rol atamaları, yönetilen kimlikleri kullanarak Service Bus ve depolamaya güvenli erişim sağlar. Tüm işlev uygulamaları aynı depolama hesabını ve Application Insights kaynağını paylaşır. Bu yapılandırma gözlemlenebilirliği ve günlüğe kaydetmeyi merkezileştirir.

Aşağıdaki diyagramda öncelik sırası mimarisi gösterilmektedir:

Service Bus kullanarak öncelik kuyruğunun nasıl uygulanacağını gösteren diyagram.

Yukarıdaki diyagramda:

  1. Uygulama (üretici). Uygulama PriorityQueueSender iletileri oluşturur, her iletiye adlı Priority özel bir uygulama özelliği atar ve değerini veya Lowolarak High ayarlarPriority.

  2. İleti aracısı ve konu başlığı. Service Bus ileti aracısı, adlı messagestek bir Service Bus konusuna ileti gönderir. Service Bus, her iletiyi değerine göre yüksek öncelikli veya düşük öncelikli aboneliğe yönlendirmek için SQL filtreleriniPriority kullanır.

  3. Birden çok tüketici havuzu. ve PriorityQueueConsumerLow tüketici havuzları, PriorityQueueConsumerHighAzure İşlevleri Service Bus tetikleyicilerini kullanarak yüksek öncelikli veya düşük öncelikli aboneliklerden gelen iletilere yanıt verir.

Örnekteki rol Örnekte Azure hizmeti Örnekteki ad
Uygulama (üretici) Azure İşlevleri uygulaması PriorityQueueSender
İleti aracısı Azure Hizmet Otobüsü <service bus ad alanınız>
İleti konusu Azure Service Bus konusu messages
İleti abonelikleri abonelikleri Azure Service Bus highPriority
lowPriority
Tüketiciler Azure İşlevleri uygulaması PriorityQueueConsumerHigh
PriorityQueueConsumerLow

Sonraki Adımlar

  • Kuyrukları, konuları ve abonelikleri Service Bus: Service Bus varlıklarını ve kuyruklarla konular arasındaki farkları gözden geçirin.
  • Yinelenen algılama: Service Bus gönderen belirsiz bir göndermeden sonra yeniden deneme yaparken yinelenen iletileri nasıl reddedebileceğini öğrenin.
  • Teslim edilemeyen ileti kuyrukları: Service Bus işlenemeyen iletileri araştırma veya yeniden işleme için teslim edilemeyen bir kuyruğa nasıl taşımayı öğrenin.
  • Azure Kuyruk Depolama nedir?: Azure Kuyruk Depolama temel kavramlarını gözden geçirerek Service Bus kuyruklarla karşılaştırın.

Bu deseni uyguladığınızda aşağıdaki desenler yararlı olabilir:

  • Queue-Based Yük Dengeleme düzeni: İstek alımı ve işleme arasında arabellek olarak bir kuyruk kullanın. Hem seri koruma hem de farklı işlemeye ihtiyaç duyduğunuzda Öncelik Sırası düzeniyle kullanın.

  • Rakip Tüketiciler düzeni: Aktarım hızını artırmak için aynı kuyruğu dinleyen ve görevleri paralel olarak işleyen birden çok tüketici uygulayın. Her iletiyi yalnızca bir tüketici işler.

  • Azaltma düzeni: İstek oranlarını yönetmek için kuyrukları kullanarak azaltmayı uygulayın. Kritik uygulamalardan veya yüksek değerli müşterilerden gelen istekleri daha az önemli olanlara göre önceliklendirmek için öncelikli mesajlaşmayı kullanın.