Diğer ileti gruplarının işlenmesini engellemeden, birbiriyle ilgili bir dizi iletiyi tanımlı sırada işleyin.
Bağlam ve sorun
Uygulamaların genellikle bir dizi iletiyi geldikleri sırayla işlemesi gerekirken, artan yükü işlemek için ölçeği genişletebilmeleri gerekir. Dağıtılmış bir mimaride, çalışanlar rakip tüketiciler desenini kullanarak iletileri bağımsız olarak ölçeklendirebildiği ve genellikle bağımsız olarak çekebildiği için bu iletileri sırayla işlemek kolay değildir.
Örneğin, bir sipariş izleme sistemi siparişleri ve bu siparişlerdeki ilgili işlemleri içeren bir kayıt defteri alır. Bu işlemler bir sipariş oluşturmak, siparişe bir işlem eklemek, geçmiş bir işlemi değiştirmek veya bir siparişi silmek olabilir. Bu sistemde, işlemler yalnızca sipariş düzeyinde olmak üzere ilk çıkar (FIFO) şekilde gerçekleştirilmelidir. Ancak ilk kuyruk, birçok siparişin hareketlerini içeren bir kayıt defteri alır ve bu kayıt defteri birbirine eklenebilir.
Çözüm
İlgili iletileri kuyruğa alma sistemindeki kategorilere gönderin ve kuyruk dinleyicilerinin tek seferde bir ileti olmak üzere yalnızca bir kategoriden kilitlenmesini ve çekmesini sağlayın.
Genel Sıralı Konvoy düzeni şöyle görünür:
Kuyrukta, aşağıdaki diyagramda gösterildiği gibi farklı kategorilere yönelik iletiler araya eklenebilir:
Sorunlar ve dikkat edilmesi gerekenler
Bu düzenin nasıl uygulanacağına karar verirken aşağıdaki noktaları göz önünde bulundurun:
- Kategori/ölçek birimi. Gelen iletilerinizin hangi özelliğinin ölçeğini genişletebilirsiniz? Sipariş izleme senaryosunda bu özellik sipariş kimliğidir.
- Aktarım hızı. Hedef ileti aktarım hızınız nedir? Çok yüksekse FIFO gereksinimlerinizi yeniden düşünmeniz gerekebilir. Örneğin, başlangıç/bitiş iletisini zorunlu kılabilir, zamana göre sıralayabilir ve ardından işlenmek üzere bir toplu iş gönderebilir misiniz?
- Hizmet özellikleri. İleti veri yolu seçiminiz, kuyruktaki veya kuyruktaki bir kategorideki iletilerin tek seferde işlenmesine olanak sağlıyor mu?
- Geliştirilebilirlik. Sisteme nasıl yeni bir ileti kategorisi ekleyebilirsiniz? Örneğin, yukarıda açıklanan kayıt defteri sisteminin belirli bir müşteri olduğunu varsayalım. Yeni bir müşteri eklemeye ihtiyacınız varsa, müşteri kimliğine göre çalışmayı dağıtan bir kayıt defteri işlemcileri kümesine sahip olabilir misiniz?
- İleti gönderirken değişken ağ gecikme süresi nedeniyle tüketicilerin bir iletiyi sıra dışı alması mümkündür. Sıralamayı doğrulamak için sıra numaralarını kullanmayı göz önünde bulundurun. Ayrıca, bir işlemin son iletisine özel bir "sıra sonu" bayrağı da ekleyebilirsiniz. Spark veya Azure Stream Analytics gibi akış işleme teknolojileri, iletileri bir zaman aralığı içinde sırayla işleyebilir.
Bu düzenin kullanılacağı durumlar
Bu düzeni aşağıdaki durumlarda kullanın:
- Sırayla gelen ve aynı sırada işlenmesi gereken iletileriniz var.
- Gelen iletiler, kategorinin sistem için bir ölçek birimi haline gelecek şekilde "kategorilere ayrılmış" olması veya "kategorilere ayrılması" olabilir.
Bu desen aşağıdakiler için uygun olmayabilir:
- FIFO gereksinimi sistem tarafından gerçekleştirilebilecek ölçeklendirmeyi sınırladığı için son derece yüksek aktarım hızı senaryoları (milyonlarca ileti/dakika veya saniye).
İş yükü tasarımı
Bir mimar, Azure İyi Tasarlanmış Çerçeve yapılarında ele alınan hedefleri ve ilkeleri ele almak için Sıralı Konvoy düzeninin 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, sorun gidermesi zor olan yarış koşullarını, çekişen ileti işlemeyi veya hatalı arızalara yol açabilecek yanlış sıralanmış iletileri ele almak için diğer geçici çözümleri ortadan kaldırabilir. - RE:02 Kritik akışlar - RE:07 Arka plan işleri |
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'da bu düzen, Azure Service Bus ileti oturumları kullanılarak uygulanabilir. Tüketiciler için Logic Apps'i Service Bus peek-lock bağlayıcısıyla veya Service Bus tetikleyicisiyle Azure İşlevleri kullanabilirsiniz.
Önceki sipariş izleme örneği için, her kayıt defteri iletisini alındığı sırayla işleyin ve her işlemi kategorinin sipariş kimliğine ayarlandığı başka bir kuyruğa gönderin. Bu senaryoda bir işlem 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.
Led işlemci, ilk kuyruktaki her iletinin içeriğini toplu olarak kaldırarak iletileri çıkarır:
Kayıt defteri işlemcisi şu işlemle ilgilenir:
- Kayıt defterinde bir kerede bir işlem yürüme.
- İletinin oturum kimliğini sipariş kimliğiyle eşleşecek şekilde ayarlama.
- Her kayıt defteri işlemini, oturum kimliği sipariş kimliği olarak ayarlanmış bir ikincil kuyruğa gönderme.
Tüketiciler, kuyruktan sırasıyla eşleşen sipariş kimliklerine sahip tüm iletileri işledikleri ikincil kuyruğu dinler. Tüketiciler peek-lock modunu kullanır.
Ölçeklenebilirlik göz önünde bulundurulduğunda kayıt defteri kuyruğu birincil bir performans sorunudur. Kayıt defterine deftere nakledilmiş farklı hareketler aynı sipariş kimliğine başvurabilir. Ancak, iletiler kayıt defterinden sonra sunucusuz bir ortamdaki sipariş sayısına kadar yayılabilir.
Sonraki adımlar
Bu düzeni uygularken aşağıdaki bilgiler yararlı olabilir:
- İleti oturumları: ilk gelen, ilk çıkan (FIFO)
- İletiye Göz Atma-Kilitleme (Yıkıcı Olmayan Okuma)
- Service Bus oturumlarını kullanarak Logic Apps'te bağıntılı iletilerin teslimi için (MSDN blogu)