İçeriğe geç

RabbitMQ — Mesaj Hangi Kuyruğa Gider?

Orta 9 dk Sık karşılaşılır

Önce şunu oku: Servisler Arası İletişim Desenleri

30 saniyede özet

RabbitMQ'da mesaj doğrudan kuyruğa değil, bir exchange'e gönderilir. Exchange türü ve bağlantılar mesajın hangi kuyruklara kopyalanacağını seçer. Hiçbir bağlantıya uymayan mesaj hata vermeden kaybolur.

Postanedeki ayırma tezgâhını düşün. Memur her mektubun üstündeki adrese bakar ve onu etiketi uyan gözlere koyar. Hiçbir göze uymayan bir mektup gelirse, ayrı bir kutu yoksa onu çöpe atar.

  1. Bayt: Avrupa'daki kartlar için yeni bir olay ekledik: kart.bloke.eu. Yayınladık, hata da gelmedi!

  2. Sen: Ama dolandırıcılık servisi bu olaylardan hiçbirini görmemiş.

  3. Bayt: Hata yoksa mesaj bir yere gitmiş olmalı... değil mi?

  4. Bayt: Belki hiçbir yere gitmedi. Mesajın kuyruğa nasıl vardığına bakalım.

Mesaj kuyruğa nasıl varır?

RabbitMQ’da yayıncı mesajı bir exchangeRabbitMQ'da yayıncının mesajı gönderdiği ayırma noktası. Türüne ve bağlantılara bakarak mesajın kopyalarını uygun kuyruklara koyar.Sözlükte gör →’e gönderir ve üstüne bir routing keyMesajın üstüne yazılan, noktayla ayrılmış adres; örneğin odeme.tamamlandi.tr. Exchange bunu kuyrukların bağlantılarıyla karşılaştırır.Sözlükte gör → yazar; örneğin odeme.tamamlandi.tr. Yayıncı hangi kuyrukların var olduğunu bilmek zorunda değildir.

Kuyruklar exchange’e bağlantılarla (binding) bağlanır. Exchange, routing key’i bu bağlantılarla karşılaştırır ve uyan her kuyruğa mesajın bir kopyasını koyar.

Kafam karıştı, daha basit anlat

Yayıncı exchange’e bir anahtarla gönderir. Kuyruklar bağlantılarıyla hangi anahtarları istediklerini söyler.

Hızlı kontrolBaşlangıç

RabbitMQ'da yayıncı mesajı nereye gönderir?

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

Binding (bağlantı) ne işe yarar?

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

Üç tür exchange

Direct exchange'e bağlı kuyrukların bağlantıları yalnızca odeme.tamamlandi.tr ve odeme.basarisiz.tr. Yayıncı kart.bloke.eu anahtarıyla bir mesaj gönderdi. Ne olur? Cevabı göster

Mesaj hiçbir kuyruğa gitmez ve sessizce kaybolur. Direct exchange anahtarı birebir arar; uyan bağlantı yoksa mesajı atar. Yayıncı bir hata almaz.

Gözlerin etiketi, mektubun nereye gideceğini seçer.
Adım adım oku
  1. Mektup bir adresle gelir.
  2. Memur adresi uyan gözlere koyar.
  3. Hiçbir göze uymayan: çöpe ya da ayrı bir kutuya.
  4. Gözlerin etiketi, mektubun nereye gideceğini seçer.

Direct exchange anahtarı birebir eşler. Topic exchange desenle eşler: * tam bir kelimeye, # sıfır ya da daha çok kelimeye uyar; kart.# bütün kart olaylarını alır. Fanout ise anahtara hiç bakmaz ve her kuyruğa her mesajı gönderir.

Hiçbir bağlantıya uymayan mesajı kaybetmemek için exchange’e bir alternate exchangeBir exchange'te hiçbir bağlantıya uymayan mesajların gönderildiği yedek exchange. Sessizce kaybolacak mesajları ayrı bir kuyrukta toplar.Sözlükte gör → tanımlanır. Yönlendirilemeyen mesajlar oraya gider ve ayrı bir kuyrukta incelenmeyi bekler.

Kafam karıştı, daha basit anlat

Direct birebir, topic desenle, fanout herkese. Uymayan mesajı alternate exchange yakalar.

Hızlı kontrolOrta

Direct ve topic exchange arasındaki fark nedir?

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

Topic exchange'te `kart.#` deseni hangi anahtarlara uyar?

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

Kendin gör

Mesaj hangi kuyruğa gider?

Tohum 502526

Exchange (direct)

bildirim

bağlantı: odeme.tamamlandi.tr

    dolandırıcılık

    bağlantı: odeme.basarisiz.tr

      raporlama

      bağlantı: odeme.tamamlandi.tr

        kaybolan

        hiçbir bağlantıya uymadı

          Oynat ya da adımla: her adımda bir olay yayınlanır.

          Hız
          Adım 0

          Şu an ne oldu?

          Exchange: direct (anahtar birebir)

          6 olay yayınlanacak; bildirim, dolandırıcılık ve raporlama kuyrukları bağlı.

          Görevler0/3

          • Bir mesajı sessizce kaybetaçık

            İpucu

            Varsayılan ayarlar yeter.

          • Hiçbir mesajı kaybetmeden her kuyruğa yalnızca istediğini gönderaçık

            İpucu

            Desenlerle yönlendir.

          • Bildirim kuyruğuna istemediği mesajları yollaaçık

            İpucu

            Anahtara hiç bakmayan exchange türü.

          Olay günlüğü (0)

          Henüz olay yok. Oynat veya adımla.

          1. Varsayılanla oynat. Direct exchange: altı olaydan dördü hiçbir kuyruğa uymadı ve kayboldu.
          2. “Alternate exchange”i aç. Aynı dört olay kaybolmadı, “yönlendirilemeyen” kuyruğunda toplandı.
          3. “topic” seç, alternate exchange’i kapat. Her olay yalnızca onu isteyen kuyruklara gitti; raporlama # ile hepsini aldı.
          4. “fanout” seç. Her kuyruk her olayı aldı; bildirim servisi kart olaylarını da ayıklamak zorunda kaldı.
          Hızlı kontrolOrta

          Direct exchange'e hiçbir bağlantıya uymayan bir anahtarla mesaj gönderildi. Ne olur?

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

          Fanout exchange ne zaman doğru seçimdir?

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

          Tuzaklar

          Sessiz kayıp. Varsayılan ayarlarla yönlendirilemeyen mesaj atılır ve yayıncıya hiçbir şey söylenmez. Alternate exchange ya da mandatory bayrağıyla bu durumu görünür kıl.

          Fazla geniş desen. # ile bağlanan bir kuyruk her şeyi alır; yeni olay türleri eklendikçe ilgisiz mesajlarla dolar. Desenleri gerçekten istenen olaylara göre daralt.

          Mesajın kuyruğa ulaşmasını teslim sanmak. Mesaj kuyruğa vardı diye işlenmiş sayılmaz. Tüketici, işini bitirdikten sonra onaylamalı (ack); aksi halde bir çökmede mesaj kaybolur.

          Kafam karıştı, daha basit anlat

          Kaybı görünür kıl, desenleri daralt, işi bitirince onayla.

          Hızlı kontrolOrta

          Tüketici mesajı aldı ama işlerken çöktü. Mesajın kaybolmaması için ne gerekir?

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

          Aşağıdaki örnek bir bankanın olay altyapısından: topic exchange, desenli bağlantılar, yönlendirilemeyen mesajlar için alternate exchange ve işi bitince onaylayan bir tüketici.

          Derinleş · Banka olayları: topic exchange, desenli bağlantılar, alternate exchange 4 dosya · ~81 satır · ilk okumada atlayabilirsin
          Proje dosyaları

          src/main/java/com/bank/events/ EventTopology.java Topoloji: bank.events bir topic exchange; yönlendirilemeyen mesajlar bank.unroutable'a gidiyor.

          src/main/java/com/bank/events/EventTopology.java
          @Configuration
          class EventTopology {
          @Bean
          TopicExchange bankEvents() {
          return ExchangeBuilder.topicExchange("bank.events")
          .durable(true)
          .alternate("bank.unroutable") // nothing matched? keep it, don't drop it
          .build();
          }
          @Bean
          FanoutExchange unroutableExchange() {
          return new FanoutExchange("bank.unroutable");
          }
          @Bean Queue notifyQueue() { return QueueBuilder.durable("notify").build(); }
          @Bean Queue fraudQueue() { return QueueBuilder.durable("fraud").build(); }
          @Bean Queue reportQueue() { return QueueBuilder.durable("report").build(); }
          @Bean Queue unroutableQueue() { return QueueBuilder.durable("unroutable").build(); }
          @Bean
          Declarables bindings(TopicExchange bankEvents, FanoutExchange unroutableExchange,
          Queue notifyQueue, Queue fraudQueue, Queue reportQueue, Queue unroutableQueue) {
          return new Declarables(
          BindingBuilder.bind(notifyQueue).to(bankEvents).with("odeme.tamamlandi.*"),
          BindingBuilder.bind(fraudQueue).to(bankEvents).with("*.basarisiz.*"),
          BindingBuilder.bind(fraudQueue).to(bankEvents).with("kart.#"),
          BindingBuilder.bind(reportQueue).to(bankEvents).with("#"),
          BindingBuilder.bind(unroutableQueue).to(unroutableExchange));
          }
          }

          src/main/java/com/bank/events/ BankEventPublisher.java Bağlantılar: bildirim yalnızca tamamlanan ödemeleri, dolandırıcılık başarısız ödemeleri ve bütün kart olaylarını alıyor.

          src/main/java/com/bank/events/BankEventPublisher.java
          @Component
          class BankEventPublisher {
          private final RabbitTemplate rabbit;
          BankEventPublisher(RabbitTemplate rabbit) {
          this.rabbit = rabbit;
          }
          /** The publisher knows the exchange and the key, never the queues. */
          void cardBlocked(CardBlocked event) {
          rabbit.convertAndSend("bank.events", "kart.bloke." + event.region(), event);
          }
          void paymentCompleted(PaymentCompleted event) {
          rabbit.convertAndSend("bank.events", "odeme.tamamlandi." + event.region(), event);
          }
          }

          src/main/java/com/bank/fraud/ FraudListener.java Yayıncı: kuyrukları bilmiyor; yalnızca exchange'i ve routing key'i biliyor.

          src/main/java/com/bank/fraud/FraudListener.java
          @Component
          class FraudListener {
          private final FraudChecks checks;
          FraudListener(FraudChecks checks) {
          this.checks = checks;
          }
          // With the default AUTO acknowledge mode, Spring acks only after this method returns;
          // an exception leaves the message to be redelivered instead of losing it.
          @RabbitListener(queues = "fraud")
          void on(BankEvent event) {
          checks.review(event);
          }
          }

          src/main/java/com/bank/ops/ UnroutableWatcher.java Tüketici: işi bitince onaylıyor; hata olursa mesaj yeniden denenmek üzere kuyrukta kalıyor.

          src/main/java/com/bank/ops/UnroutableWatcher.java
          @Component
          class UnroutableWatcher {
          private final Counter unroutable;
          UnroutableWatcher(MeterRegistry registry) {
          this.unroutable = registry.counter("events.unroutable");
          }
          /** A message here means a routing key nobody is bound to: an alert, not noise. */
          @RabbitListener(queues = "unroutable")
          void on(Message message) {
          unroutable.increment();
          }
          }

          Kendini sına

          Şimşek turu1/4

          RabbitMQ'da yayıncı mesajı doğrudan bir kuyruğa gönderir.

          Soru 1/3İleri

          Yeni bir olay türü kart.bloke.eu eklendi ve dolandırıcılık servisi onu hiç görmüyor. En hızlı nasıl fark edilir?

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

          Aklında kalacak üç şey

          1. 1 Yayıncı mesajı bir exchange'e bir routing key ile gönderir. Mesajın hangi kuyruklara gideceğine exchange türü ve kuyrukların bağlantıları karar verir.
          2. 2 Direct exchange anahtarı birebir arar, topic exchange desenle eşler, fanout ise anahtara bakmadan her kuyruğa kopyalar.
          3. 3 Hiçbir bağlantıya uymayan mesaj sessizce kaybolur. Alternate exchange bu mesajları ayrı bir kuyrukta toplar ve yönlendirme kurallarındaki boşluğu görünür kılar.
          Sonraki kapı Kart sağlayıcısı biraz yavaşladı. Birkaç saniye sonra müşteriler bakiyelerini bile göremiyordu. Bakiye servisi sapasağlamdı. Nasıl? Bulkhead — Tek Yavaş Servis Neden Herkesi Düşürür? · 9 dk

          4 kart sonraki derste seni bekliyor

          0/4 kart bu dersten toplandı