IBM MQ ve Sıralı Teslim — Gerçekleşme, Emirden Önce Nasıl İşlendi?
Önce şunu oku: Servisler Arası İletişim Desenleri
30 saniyede özet
Kuyruk mesajları sırayla verir, ama birden çok tüketici aynı anda alınca işlenme sırası bozulur. Tek tüketici sırayı korur ama her şeyi tek sıraya sokar. Sıra gereken mesajları bir anahtara göre bölmek ikisini birden sağlar.
Bir aile bankaya üç fişle geliyor: hesap aç, para yatır, para çek. Fişler doğru sırada. Ama üç gişe fişleri aynı anda alırsa, hesap açılmadan para çekilmeye çalışılabilir.
-
Bayt: Emir mesajları IBM MQ kuyruğunda sırayla duruyor. Ama işleme yavaş, kuyruk birikiyor.
-
Sen: Tüketici sayısını üçe çıkardım. Kuyruk eridi!
-
Bayt: Loglarda garip hatalar var: 'emir bulunamadı'. Emir sonra geliyor!
-
Bayt: Kuyruk sırayı korumuş olmalı. Bozulan şey, onu aynı anda alan üç el olabilir mi?
Kuyruk sırayla verir
IBM MQ gibi bir mesaj kuyruğu, aynı öncelikteki mesajları geldikleri sırayla verir. Java’da bu kuyruklarla çoğu zaman JMSJakarta Messaging (eski adıyla Java Message Service): Java'da IBM MQ gibi mesaj kuyruklarıyla konuşmak için standart arayüz.Sözlükte gör → arayüzü üzerinden konuşulur.
Tek bir tüketici mesajları teker teker alıp işlerse, işlenme sırası da kuyruktaki sıradır. Emir önce açılır, sonra gerçekleşir, sonra kapanır.
Kafam karıştı, daha basit anlat
Kuyruk sırayla verir. Tek tüketici sırayla işler.
Bir mesaj kuyruğu aynı öncelikteki mesajları hangi sırayla verir?
Tek tüketici bir kuyruğu okuyorsa işlenme sırası nedir?
Üç tüketici, bozulan sıra
Kuyrukta sırayla A:yeni, B:yeni, A:gerçekleşme var. Üç tüketici bu üç mesajı aynı anda aldı. A:gerçekleşme, A:yeni'den önce işlenebilir mi? Cevabı göster
Evet. Kuyruk mesajları sırayla verdi, ama işleme süreleri farklı. A:yeni’yi alan tüketici biraz yavaşsa, A:gerçekleşme ondan önce biter ve “emir bulunamadı” hatası çıkar.
Adım adım oku
- Bir ailenin sıralı üç fişi.
- Üç gişe aynı anda aldı.
- Hesap açılmadan para çekilmek istendi.
- Aynı ailenin fişleri aynı gişeye.
Sıra, kuyruğun bir özelliğidir; işlemenin değil. Paralel tüketiciler kuyruğu hızlı boşaltır ama sırayı bir anahtara bağlamadıkça korumaz.
Kafam karıştı, daha basit anlat
Paralel tüketici hızlıdır, ama sırayı korumaz.
Üç tüketici aynı anda mesaj alırsa ne olabilir?
Loglarda "emir bulunamadı" hatası var ve emir saniyeler sonra geliyor. En olası neden?
Anahtara göre böl
Her mesajın sırası önemli değildir; yalnızca aynı emre ait mesajların sırası önemlidir. Bu yüzden mesajları emir numarasına göre mesaj grubuSırası önemli olan mesajları bir anahtarla (örneğin emir numarası) bir araya toplamak. Aynı gruptaki mesajlar tek tüketicide, sırayla işlenir.Sözlükte gör → bölmek yeter.
Gönderen taraf emir numarasından bir kuyruk seçer: aynı emir hep aynı kuyruğa gider. Her kuyruğu tek bir tüketici okur. Emir içinde sıra korunur, farklı emirler yan yana işlenir.
Kafam karıştı, daha basit anlat
Aynı emrin mesajları hep aynı kuyruğa ve aynı tüketiciye gider.
Hem sırayı korumak hem paralel çalışmak için ne yapılır?
Kendin gör
Aynı emrin mesajları kuyrukta sırayla bekliyor
Tohum 211382- A:new
- B:new
- A:fill
- B:fill
- A:done
- B:done
· Tur: 0 · işlenen: 0/6 · sırasız: 0
Şu an ne oldu?
0 / 6 mesaj işlendi
Kuyruk mesajları sırayla verdi; işlenme sırası da aynı mı?
Görevler0/3
Bir gerçekleşme, emri henüz yokken işlensinaçık
İpucu
Üç tüketiciyi aynı anda çalıştır.
Sıra doğru olsun, ama her mesaj tek tek beklesinaçık
İpucu
Tek tüketici.
Sıra doğru olsun ve iki emir yan yana işlensinaçık
İpucu
Emre göre grupla.
Olay günlüğü (0)
Henüz olay yok. Oynat veya adımla.
- Varsayılanla oynat. Üç tüketici iki turda bitirdi, ama A’nın gerçekleşmesi emir yokken işlendi.
- “Tek tüketici”yi seç. Sıra doğru, ama altı tur sürdü: A’nın mesajı B’yi de bekletti.
- “Emre göre grup”u seç. Sıra doğru ve üç turda bitti: A ve B yan yana işlendi.
Simülatörde "emre göre grup" neden tek tüketiciden hızlı bitti ve sırayı bozmadı?
Tuzaklar
Sırayı tıkayan mesaj. İşlenemeyen bir poison pillKaç kez denenirse denensin işlenemeyecek bir mesaj: bozuk format, geçersiz veri. Yeniden denemek yalnızca arkasındaki mesajları bekletir.Sözlükte gör → geri alınıp yeniden denenir ve arkasındaki her şeyi bekletir. IBM MQ’da kuyruğun backout eşiği ve backout kuyruğu tanımlanır; eşik aşılınca mesaj oraya taşınır ve bir insan bakar.
İşlemeden önce onaylamak. Mesajı alır almaz onaylayıp sonra işlemede hata alırsan mesaj kaybolur. Transacted bir oturum kullan: işlem başarılıysa onayla, değilse geri al.
Kuyruk sayısını değiştirmek. Kuyruk sayısı değişince aynı emir başka bir kuyruğa düşebilir. Yoldaki mesajlar bitmeden sayıyı değiştirme.
Kafam karıştı, daha basit anlat
Bozuk mesajı backout kuyruğuna taşı. İşledikten sonra onayla. Kuyruk sayısını sakin bir anda değiştir.
Tek tüketicili bir kuyrukta bir mesaj her denemede hata veriyor. Ne olur?
Aşağıda emir mesajlarını emir numarasına göre kuyruklara dağıtan bir yönlendirici ve her kuyruğu tek tüketiciyle okuyan Spring JMS dinleyicileri var.
Derinleş · Emir mesajları: anahtara göre kuyruk, kuyruk başına tek tüketici 3 dosya · ~57 satır · ilk okumada atlayabilirsin
Kendini sına
Kuyruk sırayı koruyorsa, üç tüketici de mesajları sırayla işler.
IBM MQ'da işlenemeyen mesajın kuyruğu sonsuza kadar tıkamasını ne önler?
Aklında kalacak üç şey
- 1 Kuyruk mesajları geldiği sırayla verir. Birden çok tüketici aynı anda aldığında, mesajların işlenme sırası artık garanti değildir.
- 2 Aynı emre ait mesajları tek bir tüketiciye yönlendirmek, emir içinde sırayı korur; farklı emirler yine yan yana işlenir.
- 3 İşlenemeyen bir mesaj tek tüketicili kuyruğu durdurur. Belirli bir deneme sayısından sonra ayrı bir kuyruğa taşınmalı ve bir insan ona bakmalı.