Sıralı mesajlar, tüketicilerin mesajları tam olarak gönderildikleri sırayla işlemesine olanak tanır. ApsaraMQ for RocketMQ, sıralamayı kapsamak için mesaj gruplarını kullanır: aynı gruptaki mesajlar her zaman ardışık olarak iletilirken, farklı gruplardaki mesajlar bağımsız olarak işlenir.
Kullanım senaryoları
Aşağı akış sistemlerinin olayları, yukarı akışta gerçekleştiği tam sırayla işlemesi gerektiğinde sıralı mesajları kullanın:
-
Alım-satım eşleştirme -- Menkul kıymet ticaretinde, birden fazla teklif aynı fiyata sahip olduğunda ilk teklif ilk işlem kuralı geçerlidir. Sipariş işleme sistemi, teklifleri verildikleri tam sırayla ele almalıdır.

-
Artımlı veri senkronizasyonu -- Veritabanı değişikliklerini (eklemeler, güncellemeler, silmeler) bir mesaj kuyruğu aracılığıyla bir arama sistemine çoğaltırken, işlemler orijinal sırayla yeniden oynatılmalıdır. Sıra dışı yeniden oynatma tutarsız bir duruma yol açar.


Sıralamanın çalışma şekli
Uçtan uca mesaj sıralaması iki bölümden oluşur: üretim sırası (gönderen taraf) ve tüketim sırası (alan taraf). Katı first in, first out (FIFO) işleme için her ikisinin de sağlanması gerekir.
Üretim sırası
Üretim sırasını garanti altına almak için aşağıdaki üç koşulu da karşılayın:
Aynı mesaj grubu -- Birbirine göre sıralanması gereken tüm mesajlar için aynı mesaj grubunu ayarlayın. Farklı gruplardaki mesajların arasında herhangi bir sıralama ilişkisi yoktur.
Tek üretici -- İlgili tüm mesajları tek bir üreticiden gönderin. Aynı mesaj grubu kullanılsa bile, farklı sistemlerdeki farklı üreticilerden gelen mesajların kesin bir sırası yoktur.
Seri gönderim -- Mesajları tek bir iş parçacığından ardışık olarak gönderin. Üretici istemcisi çoklu iş parçacığı erişimini destekler ancak farklı iş parçacıklarından paralel olarak gönderilen mesajların kesin bir sırası yoktur.
Bu koşullar karşılandığında, aynı mesaj grubuna sahip mesajlar gönderim sırasına göre aynı kuyrukta depolanır.

Depolama davranışı:
Aynı gruptan gelen mesajlar, aynı kuyrukta ardışık olarak depolanır.
Farklı gruplardan gelen mesajlar aynı kuyrukta birlikte bulunabilir ancak bunların birbirine göre sırası garanti edilmez.
Yukarıdaki diyagramda, Mesaj Grubu 1 (G1-M1, G1-M2, G1-M3) ve Mesaj Grubu 4 (G4-M1, G4-M2) Kuyruk 1'i paylaşır. ApsaraMQ for RocketMQ, her bir grup içindeki sırayı garanti eder ancak gruplar arasındaki sırayı garanti etmez.
Tüketim sırası
Tüketim sırasını garanti etmek için iki mekanizma birlikte çalışır:
-
İletim sırası -- SDK ve sunucu protokolü, mesajları depolama sırasına göre iletir. Al-işle-onayla desenini sıkı bir şekilde izleyin. Eşzamanlı olmayan işleme, sıralama garantisini bozabilir.
ÖnemliPushConsumer ile mesajlar, depolama sırasına göre tek tek iletilir. SimpleConsumer ile tek bir çekmede birden fazla mesaj gelebilir; uygulamanız bunları ardışık olarak işlemeli ve aynı grup için tekrar
receiveçağrısı yapmadan önce her birini onaylamalıdır. Ayrıntılar için bkz. Tüketici türleri. -
Sınırlı yeniden denemeler -- Sıralı bir mesaj maksimum yeniden deneme sayısından sonra başarısız olursa, sonraki mesajların engellenmemesi için atlanır. Tüm grubu engelleme riski ile güvenilirlik arasında denge kuran bir yeniden deneme sayısı seçin. Bir mesaj grubu içindeki yeniden denemeler:
Sıralama garantisini bozmaz.
Diğer mesaj gruplarındaki mesajları etkilemez.
Geçerli mesaj çözümlenene kadar aynı gruptaki sonraki mesajları engeller.
ÖnemliBaşarısız bir sıralı mesaj yeniden denenirken, aynı gruptaki sonraki mesajlar engellenir. Bu mesajlar yalnızca geçerli mesaj başarılı olduktan veya yeniden denemelerini tükettikten sonra iletilir.
Üretim ve tüketim sırası kombinasyonları
Katı FIFO, hem üretim hem de tüketim sırası gerektirir. Ancak her tüketicinin sıralı iletime ihtiyacı yoktur. Aktarım hızı ve sıralama gereksinimlerine göre karıştırıp eşleştirin:
| Üretim sırası | Tüketim sırası | Sonuç |
|---|---|---|
| Mesaj grubu ayarlandı; seri gönderim | Sıralı | Her mesaj grubu içinde katı FIFO |
| Mesaj grubu ayarlandı; seri gönderim | Eşzamanlı | En iyi çaba kronolojik sıra; daha yüksek aktarım hızı |
| Mesaj grubu yok; sırasız gönderim | Sıralı | Kuyruk düzeyinde katı sıralama (depolama sırasıyla eşleşir, gönderim sırasıyla değil) |
| Mesaj grubu yok; sırasız gönderim | Eşzamanlı | En iyi çaba kronolojik sıra |
Mesaj yaşam döngüsü
Sıralı bir mesaj beş durumdan geçer:

Başlatıldı -- Üretici mesajı oluşturur ve göndermeye hazırlanır.
Hazır -- Mesaj aracıya ulaşır ve tüketiciler tarafından görünür hale gelir.
Aktif -- Bir tüketici mesajı alır ve işler. Aracı, zaman aşımı içinde herhangi bir onay almazsa iletimi yeniden dener. Ayrıntılar için bkz. Tüketim yeniden denemesi.
Onaylandı -- Tüketici sonucu taahhüt eder. Varsayılan olarak, ApsaraMQ for RocketMQ tüm mesajları saklar. Aracı, mesajı tüketildi olarak işaretler ancak hemen silmez.
Silindi -- Saklama süresi dolduktan veya depolama alanı azaldıktan sonra, aracı en eski mesajları yuvarlak temelli siler. Silme işleminden önce mesajlar yeniden tüketilebilir. Ayrıntılar için bkz. Mesaj depolama ve temizleme.
Yeniden denenmiş bir mesaj, yeni bir mesaj olarak değerlendirilir. Orijinal mesajın yaşam döngüsü sona erer.
Sıralı bir mesaj yeniden denenirken, aynı gruptaki sonraki mesajlar, geçerli mesaj başarılı olana kadar engellenir.
Sınırlamalar
Sıralı mesajlar yalnızca MessageType değeri FIFO olarak ayarlanmış konulara gönderilebilir. Mesaj türü, konu türüyle eşleşmelidir.
Bir tüketici grubu sıralı iletim için ayarlanırsa, bu grup tarafından tüketilen tüm mesajlar gerçek türlerinden bağımsız olarak sıralı mesajlar olarak faturalandırılır. Katı sıralama gerekmiyorsa, maliyetleri azaltmak için grubu eşzamanlı iletim olarak ayarlayın.
Ön koşullar
Başlamadan önce şunlara sahip olduğunuzdan emin olun:
MessageType değeri FIFO olarak ayarlanmış bir konu, ApsaraMQ for RocketMQ konsolu içinde oluşturuldu
Sıralı iletim için yapılandırılmış bir tüketici grubu (yalnızca sıralı tüketime ihtiyacınız varsa gereklidir)
Projenizde kurulu olan RocketMQ 5.x gRPC SDK
Sıralı mesajlar yalnızca MessageType değeri FIFO olarak ayarlanmış konulara gönderilebilir. Sıralı iletim moduna ayarlanmamış bir tüketici grubu, mesajları eşzamanlı olarak iletir. Herhangi bir kod yazmadan önce hem konu türünü hem de tüketici grubu iletim modunu doğrulayın.
Tüketim eşzamanlılığını optimize edin
RocketMQ 5.x gRPC SDK ile PushConsumer, aynı MessageQueue'deki mesajları mesaj gruplarına göre farklı iş parçacıklarına dağıtabilir. Mesaj grubu değerleriniz ne kadar çeşitli olursa, aktarım hızı kazancı o kadar büyük olur.
Desteklenen SDK sürümleri:
| SDK | Minimum sürüm |
|---|---|
| Java | 5.0.8 |
| C++ | 5.0.3 |
| Diğer SDK'lar | Desteklenmiyor |
Sıralı mesajları gönderin ve tüketin
Sıralı mesajlar, her gönderim çağrısında bir mesaj grubu gerektirir. Mesaj gruplarını işletmenizin izin verdiği en ince granülerlikle tasarlayın; örneğin, sipariş kimliği veya kullanıcı kimliği kullanın. Bu, varlık başına sıralamayı etkinleştirirken varlıklar arasındaki paralelliği en üst düzeye çıkarır.
Aşağıdaki tüm örnekler Java kullanır. Diğer dillerdeki eksiksiz SDK örnekleri için bkz. RocketMQ 5.x gRPC SDK.
Örnek kod
Tüketim yeniden denemelerini sorun giderin
PushConsumer için sıralı tüketim yeniden denemeleri istemci tarafında gerçekleşir; sunucu yeniden deneme ayrıntılarını günlüğe kaydetmez. Bir mesaj izlemesi failed teslimat sonucu gösteriyorsa, tüketici istemci günlüklerini kontrol edin.
İstemci günlük yolu için bkz. Günlük yapılandırması.
İstemci günlüklerinde şu anahtar sözcükleri arayın:
Message listener raised an exception while consuming messages
Failed to consume fifo message finally, run out of attempt times
En iyi uygulamalar
Mesajları toplu halde değil, seri olarak işleyin
Mesajları tek tek tüketin. Toplu tüketim, sıralamayı bozabilir.
Örnek: Mesajlar 1 -> 2 -> 3 -> 4 sırasıyla gönderilir. Toplu tüketim sırasında, 2 ve 3 numaralı mesajlar birlikte işlenir ve başarısız olur. Yeniden denemede, hem 2 hem de 3 yeniden teslim edilir; ancak 3 numaralı mesaj başka bir denemede zaten başarılı olmuşsa, 2 numaralı mesaj ondan sonra işlenebilir ve bu da sıra dışı tüketime neden olabilir.
Sıcak noktaları önlemek için mesaj gruplarını dağıtın
ApsaraMQ for RocketMQ, hangi sunucu tarafı kuyruğunun her mesajı depolayacağını belirlemek için mesaj grubu değerini kullanır. Aynı gruptaki tüm mesajlar aynı kuyruğa yönlendirilir. Çok sayıda mesajı birkaç grupta yoğunlaştırmak, bu kuyrukları aşırı yükleyerek depolama sıcak noktaları oluşturur ve ölçeklenebilirliği sınırlar.
Mesaj grupları olarak ince taneli anahtarlar kullanın; örneğin, sipariş kimlikleri veya kullanıcı kimlikleri. Mesaj grubu değerleriniz ne kadar çeşitli olursa, mesajlar kuyruklar arasında o kadar eşit dağıtılır. Bu, aynı varlık için mesajların sırasını korurken farklı varlıklar için yükü kuyruklara yayar.