İçeriğe geç

IBM MQ ve Sıralı Teslim — Gerçekleşme, Emirden Önce Nasıl İşlendi?

İleri 9 dk Sık karşılaşılır

Ö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.

  1. Bayt: Emir mesajları IBM MQ kuyruğunda sırayla duruyor. Ama işleme yavaş, kuyruk birikiyor.

  2. Sen: Tüketici sayısını üçe çıkardım. Kuyruk eridi!

  3. Bayt: Loglarda garip hatalar var: 'emir bulunamadı'. Emir sonra geliyor!

  4. 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.

Hızlı kontrolBaşlangıç

Bir mesaj kuyruğu aynı öncelikteki mesajları hangi sırayla verir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Tek tüketici bir kuyruğu okuyorsa işlenme sırası nedir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Üç 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.

Aynı ailenin fişleri aynı gişeye.
Adım adım oku
  1. Bir ailenin sıralı üç fişi.
  2. Üç gişe aynı anda aldı.
  3. Hesap açılmadan para çekilmek istendi.
  4. 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.

Hızlı kontrolOrta

Üç tüketici aynı anda mesaj alırsa ne olabilir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Loglarda "emir bulunamadı" hatası var ve emir saniyeler sonra geliyor. En olası neden?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

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.

Hızlı kontrolOrta

Hem sırayı korumak hem paralel çalışmak için ne yapılır?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Kendin gör

Aynı emrin mesajları kuyrukta sırayla bekliyor

Tohum 211382
  1. A:new
  2. B:new
  3. A:fill
  4. B:fill
  5. A:done
  6. B:done
Emir A: —
Emir B: —

· Tur: 0 · işlenen: 0/6 · sırasız: 0

Hız
Adım 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.

  1. Varsayılanla oynat. Üç tüketici iki turda bitirdi, ama A’nın gerçekleşmesi emir yokken işlendi.
  2. “Tek tüketici”yi seç. Sıra doğru, ama altı tur sürdü: A’nın mesajı B’yi de bekletti.
  3. “Emre göre grup”u seç. Sıra doğru ve üç turda bitti: A ve B yan yana işlendi.
Hızlı kontrolOrta

Simülatörde "emre göre grup" neden tek tüketiciden hızlı bitti ve sırayı bozmadı?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

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.

Hızlı kontrolOrta

Tek tüketicili bir kuyrukta bir mesaj her denemede hata veriyor. Ne olur?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

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
Proje dosyaları

oms/src/main/java/com/bank/oms/mq/ OrderEventRouter.java OrderEventRouter: emir numarasının özetinden kuyruk seçer; aynı emir hep aynı kuyruğa.

oms/src/main/java/com/bank/oms/mq/OrderEventRouter.java
package com.bank.oms.mq;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Component;
@Component
public class OrderEventRouter {
static final int PARTITIONS = 4;
private final JmsTemplate jms;
public OrderEventRouter(JmsTemplate jms) {
this.jms = jms;
}
public void publish(OrderEvent event) {
// Same order, same queue: its events keep their order.
int partition = Math.floorMod(event.orderId().hashCode(), PARTITIONS);
jms.convertAndSend("OMS.ORDER.EVENTS." + partition, event);
}
}

oms/src/main/java/com/bank/oms/mq/ OrderEventListener.java OrderEventListener: her kuyruğu concurrency 1 ile okur; transacted oturumda hata geri alma demektir.

oms/src/main/java/com/bank/oms/mq/OrderEventListener.java
package com.bank.oms.mq;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
@Component
public class OrderEventListener {
private final OrderBook orders;
public OrderEventListener(OrderBook orders) {
this.orders = orders;
}
// One consumer per queue. An exception rolls the session back and MQ
// redelivers; past the backout threshold MQ moves the message aside.
@JmsListener(destination = "OMS.ORDER.EVENTS.0", concurrency = "1")
@JmsListener(destination = "OMS.ORDER.EVENTS.1", concurrency = "1")
@JmsListener(destination = "OMS.ORDER.EVENTS.2", concurrency = "1")
@JmsListener(destination = "OMS.ORDER.EVENTS.3", concurrency = "1")
public void on(OrderEvent event) {
orders.apply(event);
}
}

oms/src/main/resources/ application.yml application.yml: IBM MQ bağlantısı ve transacted oturum; backout eşiği ve kuyruğu MQ tarafında tanımlıdır.

oms/src/main/resources/application.yml
ibm:
mq:
queue-manager: QM_OMS
channel: OMS.SVRCONN
conn-name: mq.internal(1414)
spring:
jms:
listener:
session:
transacted: true # acknowledge only after apply() succeeds
# On the queue manager, per queue: BOTHRESH(3) BOQNAME('OMS.ORDER.EVENTS.BACKOUT')

Kendini sına

Şimşek turu1/4

Kuyruk sırayı koruyorsa, üç tüketici de mesajları sırayla işler.

Soru 1/3İleri

IBM MQ'da işlenemeyen mesajın kuyruğu sonsuza kadar tıkamasını ne önler?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Aklında kalacak üç şey

  1. 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. 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. 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ı.
0/4 kart bu dersten toplandı