RabbitMQ — Mesaj Hangi Kuyruğa Gider?
Ö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.
-
Bayt: Avrupa'daki kartlar için yeni bir olay ekledik: kart.bloke.eu. Yayınladık, hata da gelmedi!
-
Sen: Ama dolandırıcılık servisi bu olaylardan hiçbirini görmemiş.
-
Bayt: Hata yoksa mesaj bir yere gitmiş olmalı... değil mi?
-
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.
RabbitMQ'da yayıncı mesajı nereye gönderir?
Binding (bağlantı) ne işe yarar?
Üç 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.
Adım adım oku
- Mektup bir adresle gelir.
- Memur adresi uyan gözlere koyar.
- Hiçbir göze uymayan: çöpe ya da ayrı bir kutuya.
- 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.
Direct ve topic exchange arasındaki fark nedir?
Topic exchange'te `kart.#` deseni hangi anahtarlara uyar?
Kendin gör
Mesaj hangi kuyruğa gider?
Tohum 502526Exchange (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.
Ş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.
- Varsayılanla oynat. Direct exchange: altı olaydan dördü hiçbir kuyruğa uymadı ve kayboldu.
- “Alternate exchange”i aç. Aynı dört olay kaybolmadı, “yönlendirilemeyen” kuyruğunda toplandı.
- “topic” seç, alternate exchange’i kapat. Her olay yalnızca onu isteyen kuyruklara gitti; raporlama
#ile hepsini aldı. - “fanout” seç. Her kuyruk her olayı aldı; bildirim servisi kart olaylarını da ayıklamak zorunda kaldı.
Direct exchange'e hiçbir bağlantıya uymayan bir anahtarla mesaj gönderildi. Ne olur?
Fanout exchange ne zaman doğru seçimdir?
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.
Tüketici mesajı aldı ama işlerken çöktü. Mesajın kaybolmaması için ne gerekir?
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
Kendini sına
RabbitMQ'da yayıncı mesajı doğrudan bir kuyruğa gönderir.
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?
Aklında kalacak üç şey
- 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 Direct exchange anahtarı birebir arar, topic exchange desenle eşler, fanout ise anahtara bakmadan her kuyruğa kopyalar.
- 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.
4 kart sonraki derste seni bekliyor