Sıralı Konvoy düzeni

İlişkili iletileri bir kategori anahtarına göre gruplandırın ve her grubu sırayla, her seferinde bir ileti işleyerek farklı grupları paralel olarak işleyin.

Bu düzen, her mantıksal grup içinde ilk gelen ilk çıkar (FIFO) doğruluğunu koruma ile gruplar arasında eş zamanlı işlemenin ölçeğini genişletme arasındaki gerginliği giderir. Tasarım, sıralama kısıtlamalarının sistem genelinde bir darboğaz hâline gelmemesini sağlar.

Bağlam ve sorun

Uygulamaların genellikle artan yükü işlemek için ölçeği genişletirken ilgili iletileri geldikleri sırayla işlemesi gerekir. Dağıtılmış mimaride, çalışanlar iletileri paylaşılan bir kuyruktan bağımsız olarak çektiğinden bu gereksinimin sağlanması zordur. Birden çok çalışan, Rakip Tüketiciler düzeninde olduğu gibi iletiler için rekabet ettiğinde sıralama bozulur.

Sipariş oluşturma, işlem ekleme, geçmiş bir işlemi değiştirme ve siparişi silme gibi bir işlem akışı alan bir sipariş izleme sistemi düşünün. Her siparişin işlemleri FIFO sırasına göre işlenmelidir, çünkü bunların sırayla değil uygulanması siparişin durumunun bozulmasına neden olur. Ancak gelen kuyruk, işlemleri birçok sipariş arasında iç içe geçirir. Genel sıralamayı dayatan tek bir tüketici bir darboğaz hâline gelir ve birden fazla tüketici aynı siparişe ait işlemleri sıra dışında işleyebilir.

Bu soruna yönelik basit yaklaşımların her biri farklı bir şekilde yetersiz kalır:

  • Tek tüketici. Tek bir tüketici, aynı anda yalnızca bir ileti işlediği için ileti sırasını korur, ancak artan iş hacmini karşılayacak şekilde ölçeklenemez.

  • Birden çok rakip tüketici. Birden çok tüketici, iletileri paralel olarak çekerek aktarım hızını ölçeklendirir, ancak grup başına sipariş garantilerini kaybeder. İki çalışan aynı sipariş için ardışık iletileri çekip aynı anda veya sıra dışında işleyerek sipariş durumunu bozabilir.

Solution

Sıralı Konvoy deseni, ilişkili iletileri kategorilere ayırır ve kategoriler paralel olarak işlenirken her kategoriyi bir seferde bir ileti olacak şekilde ardışık olarak işler.

Desen, her iletiye ait olduğu grubu tanımlayan bir kategori anahtarı atayarak çalışır. İleti aracısı, iletileri mantıksal gruplara bölmek için bu anahtarı kullanır. Broker, her grup içinde FIFO sıralamasını uygular; böylece bir grubun kilidini alan tüketici, iletileri kuyruğa alındıkları sırayla alır. Farklı gruplar farklı tüketiciler tarafından aynı anda işlenebilir, bu nedenle sistem tek bir grup içinde sıralamadan ödün vermeden gruplar arasında yatay olarak ölçeklendirilir.

Azure Azure Service Bus ileti oturumları bu desenin yerleşik bir uygulamasını sağlar.

Aşağıdaki diyagramda genel Sıralı Konvoy düzeni gösterilmektedir.

Sıralı Konvoy deseninin diyagramı. Bir üreticiyi, merkezi bir kuyruğu ve üç tüketiciyi gösterir.

Kuyrukta, aşağıdaki diyagramda gösterildiği gibi farklı kategorilere yönelik iletiler araya eklenebilir.

Tek bir kuyrukta araya eklenmiş iletilerin dört kategorisini gösteren diyagram. Her kategori kendi yatay şeridini kaplar.

Bu desen birkaç temel avantaj sağlar:

  • Grup başına sıralı işleme. Her kategorideki iletiler, yarış koşullarını, sıra dışı durum mutasyonlarını ve geçici çözümleri yeniden sıralama gereksinimini önleyen sırayla işlenir.

  • Gruplar arasında yatay ölçek. Her kategori bağımsız bir eşzamanlılık birimidir. Tüketicilerin eklenmesi, sipariş garantilerini bozmadan aktarım hızını etkin kategori sayısına orantılı olarak artırır.

  • Üretici-tüketici ayrıştırma. Üreticiler, iletileri hangi tüketicinin ne zaman işleyeceklerini bilmeden sıraya alır. Tüketiciler bağımsız olarak ölçeklenebilir ve değiştirilebilir.

Sorunlar ve dikkat edilmesi gerekenler

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

  • Kategori ve ölçek birimi. Gelen iletilerinizin ölçeğini genişletebileceğiniz özelliği belirleyin. Kategori anahtarı paralellik birimini tanımlar: her ayrı anahtar değeri bağımsız olarak işlenebilir bir grup haline gelir. Sipariş izleme senaryosunda bu özellik sipariş kimliğidir. Çok kaba bir anahtar (örneğin, tüm siparişler için tek bir müşteri kimliği) seçmek paralelliği sınırlarken, çok iyi bir anahtar seçmek anlamlı bir sipariş avantajı sağlamaz.

  • Aktarım hızı sınırları. Hedef ileti aktarım hızınızı değerlendirin. Bu düzen her kategoride sıralı işlemeyi zorunlu kıldığından, kategori başına aktarım hızı tek bir iletinin işlenmesine kadar sınırlanır. Örneğin, zaman uyumsuz G/Ç kullanarak veya aşağı akış yazma işlemlerini toplu işleyerek ileti başına işleme süresini iyileştirin çünkü bu süre her kategori için en yüksek aktarım hızını doğrudan belirler. Genel aktarım hızı gereksiniminiz çok yüksekse, ileti yaşam döngüsünün tamamı için katı FIFO siparişinin gerekli olup olmadığını yeniden düşünün. Alternatifler arasında, bir dizinin başlangıcını ve sonunu belirlemek için başlangıç ve bitiş iletilerini zorunlu kılmak ya da iletileri bir toplu işleme penceresi içinde zaman damgasına göre sıralayıp ardından toplu işi paralel işleme göndermek yer alır.

  • Hizmet özellikleri. İleti aracısı seçiminizin kuyruktaki veya kuyruktaki bir kategorideki iletilerin tek seferde işlenmesini destekleyip desteklemediğini doğrulayın. Tüm mesajlaşma hizmetleri, bir bölüm içinde oturum düzeyinde kilitleme veya FIFO garantileri sağlamaz. Aracı yazılım bu yeteneği yerleşik olarak desteklemiyorsa, tüketicinin kendi koordinasyon mantığını uygulaması gerekir; bu da ek karmaşıklık yaratır ve yinelenen işleme, kaçırılan iletiler veya yanlış sırada yürütme riskini artırır. Oturum desteği, maliyeti etkileyen mesajlaşma katmanı veya SKU seçimini de kısıtlayabilir.

  • Geliştirilebilirlik. Sisteme yeni ileti kategorileri eklemeyi planlayın. Örüntü, tüketiciler tarafında yapısal değişiklik gerektirmeden kategori kardinalitesinin artmasını desteklemelidir. Örneğin, daha önce açıklanan kayıt defteri sisteminin bir müşteriye özgü olduğunu varsayalım. Yeni bir müşteri eklemeniz gerekiyorsa, kuyruk topolojisini yeniden tasarlamadan müşteri kimliği başına çalışmayı dağıtan bir kayıt defteri işlemcileri kümesi ekleyebilmeniz gerekir.

  • Sıra dışı ileti teslimi. İleti aracısının oturum sıralaması devreye girmeden önce, üretici ile ileti aracısı arasındaki değişken ağ gecikmesi nedeniyle iletiler sırasız gelebilir. Her kategoride sıralamayı doğrulamak için sıra numaralarını kullanmayı göz önünde bulundurun. Ayrıca, bir işlemin son iletisine bir sıra sonu bayrağı da ekleyebilirsiniz, böylece tüketiciler bir sıranın ne zaman tamam olduğunu algılayabilir.

  • Zehirli ileti işleme. Bu düzen katı ardışık sıralamayı zorunlu kıldığından, bir oturum içinde işlenmesi tekrar tekrar başarısız olan bir ileti, o oturumda kendisinden sonraki tüm iletileri engeller. Zehirli iletileri algılamak için, teslim denemesi sayılarını izlemek gibi bir strateji tasarlayın ve oturumdaki kalan iletilerin işlenmeye devam edebilmesi için bunları belirlenmiş bir yeniden deneme eşiğinden sonra teslim edilemeyen ileti kuyruğuna taşıyın.

  • Broker kullanılabilirliği. İleti aracısı tüm kategoriler için paylaşılan bir bağımlılıktır. Kullanılabilirliği ve dayanıklılığı, desenin güvenilirlik garantilerini doğrudan etkiler. Yüksek dayanıklılığa sahip yapılandırmalar genellikle maliyeti artırdığından, kullanılabilirlik alanları ve coğrafi olağanüstü durum kurtarma gibi aracı düzeyinde dayanıklılık özelliklerini iş yükünün kullanılabilirlik gereksinimlerine ve bütçesine göre değerlendirin.

  • Üretici anahtarı doğrulaması. Desen, üreticilerin kategori anahtarını (oturum kimliği) her iletide doğru şekilde ayarladığını varsayar. Üretici yanlışlıkla veya bir hata nedeniyle yanlış bir anahtar ayarlarsa, ileti yanlış oturuma yönlendirilir ve bu grubun durumunu bozar. Üreticilerin kategori anahtarlarını tutarlı biçimde atadığını doğrulayın ve yanlış yönlendirilen bir iletinin sonuçları ciddiyse, tüketici tarafında anahtar doğrulama mantığı eklemeyi değerlendirin.

  • operasyonel karmaşıklık. Oturum tabanlı işlemeyi izleme, standart kuyruk tüketiminin üzerine operasyonel ek yük ekler. Operatörlerin, geride kalan kategorileri belirlemek için oturum birikmeleri (aktif oturum sayısı ve her oturumda bekleyen mesaj sayısı) hakkında görünürlüğe sahip olması gerekir. Teslim edilemeyen oturumlar, başarısız iletileri araştırmak, kök nedeni çözmek ve düzeltilen iletileri yeniden oturumda yeniden oynatmak için ayrı bir izleme ve düzeltme iş akışı gerektirir.

  • Oturum kilidi çekişmesi ve gecikme süresi. Her tüketicinin iletileri işlemeden önce oturumda özel bir kilit alması gerektiğinden oturum kilitleme gecikme süresi ek yükü getirir. Bir tüketici oturum kilidine sahip olduğunda, tüketici yavaş olsa veya geçici olarak durmuş olsa bile başka hiçbir tüketici bu oturumdaki iletileri işleyemez. Kilit süresi çok kısaysa, kilidin süresinin dolması iletinin yeniden işlenmesine neden olabilir. Kilit süresi çok uzunsa, takılan bir tüketici kurtarma sürecini geciktirir. Oturum kilitleme süresini beklenen ileti işleme süresine göre ayarlayın ve daha uzun süre çalışan işlemler için kilit yenilemeyi uygulayın.

  • Tüketici ölçeğinde ölçeklendirme ve maliyet. Oturumlar arasındaki paralellik, eşzamanlı tüketici örneklerine karşılık gelir. Azure İşlevleri gibi sunucusuz bir modelde her etkin oturum eşzamanlı bir yürütmeye karşılık gelir ve ayrılmış bir modelde bir örneğe veya iş parçacığına karşılık gelir. Bu nedenle etkin oturum sayısı işlem maliyetini doğrudan etkiler. Aktarım hızını maliyetle dengelemek için tüketici ölçeklendirme sınırlarını ve eşzamanlılık denetimlerini planlayın.

Bu desen ne zaman kullanılır?

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

  • İletiler sırayla gelir ve aynı sırayla işlenmelidir.
  • her kategorinin sistem için bağımsız bir ölçek birimi haline gelmesi için iletiler kategorilere ayrılabilir.

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

  • FIFO gereksinimi sistemin başarabileceği ölçeklendirmeyi sınırladığı için son derece yüksek aktarım hızı senaryoları (dakikada milyonlarca ileti) beklersiniz.

  • Mesaj sıralaması gerekli değildir. İletiler herhangi bir sırayla bağımsız olarak işlenebildiğinde , Rakip Tüketiciler düzeni oturum kilitlemenin koordinasyon ek yükü olmadan daha basit bir yatay ölçeklendirme sağlar.

İş 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 Sıralı Konvoy'un 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 örüntü, yarış durumlarını, çekişmeye yatkın ileti işleme mantığını ve arızalara yol açabilen yanlış sıralanmış iletiler için kullanılan diğer geçici çözümleri ortadan kaldırmak üzere oturum tabanlı FIFO sıralaması kullanır.

- RE:02 Kritik akışlar
- RE:07 Arka plan işleri

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

Example

Azure Service Bus ileti oturumlarını kullanarak bu düzeni uygulayabilirsiniz. Tüketiciler için, Service Bus peek-lock bağlayıcısına sahip Azure Logic Apps'i veya Service Bus tetikleyicisine sahip Azure İşlevleri'ı kullanabilirsiniz.

Bir üretici bir iletide SessionId özelliğini ayarladığında, Service Bus aynı oturum kimliğini paylaşan tüm iletileri tek bir mantıksal oturum altında gruplandırır. Tüketici oturumu kabul eder ve özel bir kilit alır. Bu kilit, herhangi bir anda yalnızca bir tüketicinin bu oturum için iletileri işlemesini ve iletilerin FIFO sırasına göre gelmesini garanti eder. Diğer tüketiciler, gruplar arasında paralel aktarım hızı sağlayarak farklı oturumları aynı anda kabul edebilir ve işleyebilir.

Sipariş izleme örneğinde sistem, her kayıt defteri iletisini alındığı sırayla işler ve her işlemi kategorinin sipariş kimliğine ayarlandığı başka bir kuyruğa gönderir. Bir işlem bu senaryoda hiçbir zaman birden fazla siparişe yayılmaz, bu nedenle tüketiciler her kategoriyi paralel olarak ancak kategori içinde FIFO olarak işler.

Kayıt defteri işlemcisi, ilk kuyruktaki her iletinin içeriğini toplu işlemden çıkarıp tek tek ayırarak iletileri dağıtır:

Sıralı Konvoy örnek mimarisinin diyagramı. Bir üretici, bir kayıt defteri kuyruğu, bir kayıt defteri işlemcisi, bir işlemler kuyruğu ve üç sipariş işlemcisi gösterir.

Kayıt defteri işlemcisi üç adım gerçekleştirir:

  1. Kayıt defterinde bir kerede bir işlem gösterir.
  2. İletinin oturum kimliğini sipariş kimliğiyle eşleşecek şekilde ayarlar.
  3. Her kayıt defteri işlemini, oturum kimliği sipariş kimliği olarak ayarlanmış bir ikincil kuyruğa gönderir.

Tüketiciler ikincil kuyruğu izler ve aynı sipariş kimliğine sahip tüm iletileri FIFO sırasına göre işler. Tüketiciler peek-lock modunu kullanır.

Kayıt defteri kuyruğu bir seriden paralele geçiş noktasıdır: Oturum tabanlı paralel işlemeye geçmeden önce tüm işlemler sırayla geçer. Bu serileştirme aşaması, tüm aşağı akış işlem hattının aktarım hızını sınırladığı için temel ölçeklenebilirlik darboğazıdır. Ancak, kayıt defteri işlemcisi iletileri ikincil kuyruğa aktardıktan sonra tüketiciler oturumlar arasında sipariş kimliği başına bir tane olmak üzere bağımsız olarak ölçeklendirilebilir.

Destekleyici teknolojiler

  • Service Bus mesaj oturumları: Mesajları oturum kimliğine göre gruplandırır ve her oturum içinde FIFO işlenmesini zorunlu kılar. İleti oturumları, Sıralı Konvoy düzenini uygulamaya yönelik birincil Azure mekanizmasıdır.

  • Azure İşlevleri Service Bus tetikleyicisi: İşlev örneklerinin tek seferde tek bir oturumdan gelen iletileri işlemesine olanak sağlayan oturum tabanlı tetikleyicileri destekler.

  • Logic Apps Service Bus bağlayıcısı: İş akışı tabanlı işleme için, oturum özellikli kuyrukları işlemek üzere peek-lock desteğine sahip bir Service Bus bağlayıcısı sağlar.

Katkıda Bulunanlar

Microsoft bu makaleyi korur. Bu makaleyi aşağıdaki katkıda bulunanlar yazdı.

Asıl yazar:

Herkese açık olmayan LinkedIn profillerini görmek için LinkedIn'e oturum açın.

  • Rakip Tüketiciler düzeni: Birden çok tüketici paylaşılan kuyruktaki iletileri paralel olarak çeker ve bu da aktarım hızını artırır ancak ileti başına sipariş garantilerini kaldırır. Sıralı Konvoy düzeni, Rakip Tüketiciler tarafından ortaya konan sıralama açığını giderir. İletileri kategori anahtarlı oturumlara bölümleyerek ve her oturumu sırayla işleyerek bu boşluğu giderir.

  • Kuyruk Tabanlı Yük Düzeyleme deseni: Bir kuyruk, ani artışları karşılamak ve dengesiz yükü yumuşatmak için üreticiler ile tüketiciler arasında işi tamponlar. Sıralı Konvoy deseni, oturum tabanlı bölümlendirme ekleyerek bu arabelleğe alma yaklaşımını temel alır; böylece kuyruk hem yükü kategoriler arasında dengeler hem de her kategori içinde FIFO sıralamasını korur.

  • Öncelik Sırası düzeni: İletiler ayrı kuyruklara yönlendirilir veya daha yüksek öncelikli işlerin düşük öncelikli çalışmadan önce işlenmesi için bir kuyruk içinde öncelik verilir. Öncelik düzeyi içindeki sıralamanın da korunması gerektiğinde, Ardışık Konvoy deseni, öncelik anahtarına göre tanımlanmış her oturum içinde FIFO işlemeyi sağlamak için önceliklendirilmiş kuyruklama ile birleştirilebilir.

  • Peek-Lock Mesajı (Yıkıcı Olmayan Okuma): Bu işlem, işlenmek üzere bir kuyruk veya abonelikten bir mesajı atomik olarak alır ve kilitler.

  • Service Bus oturumları kullanılarak Logic Apps'te bağıntılı iletilerin teslimi için: Bu blog gönderisinde Sıralı Konvoy düzeni için Logic Apps desteği açıklanmaktadır.