RabbitMQ - routing 模式 和 topics 模式

開篇

本文主要講解 routing 和 topics 兩種工做模式,其中 topics 只是在 routing 的基礎上增長了一個 routingkey 的正則匹配。接下來會詳細介紹。ui


routing 模式

以前說到的 Publish/Subscribe 是把一個消息發給多個消費者,而且每一個消費者接收到的消息是同樣的。而此次說到的Routing 模式,則是經過增長一個組件(Bingings),使咱們的消費者能訂閱到本身感興趣的消息。code

bindings 的做用

Bindings 會將 exchanges 和 queue 聯繫在一塊兒,queue 經過 bindings 從 exchangs 中訂閱本身感興趣的消息。隊列

Routing Key

Bindings 提供了一個 RoutingKey 參數 channel.queueBind(queueName, EXCHANGE_NAME, routingkey); 其實在上一篇中,也有這個參數, 只不過這個參數是一個空字符串,由於 這個key和 exchange type是息息相關的,fanout 類型的 exchange 的key就是 空字符串。ip

  • direct exchange字符串

    一個消息 會根據 routing key 來匹配本身應該去哪一個隊列。get

  • Multiple bindingsit

    direct exchange 也能夠實現 fanout exchange 的做用,只要隊列綁定相同的 routing key,一個消息一樣能夠發到多個隊列當中基礎

代碼

channel.basicPublish(EXCHANGE_NAME, routingkey, null,   message.getBytes());
channel.queueBind(queueName, EXCHANGE_NAME, routingkey);

topic 模式

topic exchange 只是在 routing 的基礎上,將routingkey 改爲了相似正則匹配, routingkey 由單詞 和 點 組成 ,長度限制在 255 bytechannel

例如:lazy.orange.rabbit 或者 quick.orange.fox, 除此以外, 還能夠用queue

  • '*' 表明一個單詞
  • '#' 表明 0個 或 多個 單詞

例如 :.orange.rabbit, .orange., quick.# 可是若是單詞個數不匹配,也是不行的, 好比, lazy.orange.rabbit. 或者 *.orange.rabbit.other 可是 '#' 這樣用是能夠的, lazy.orange.rabbit.#;

相關文章
相關標籤/搜索