Skip to content

Latest commit

 

History

History
105 lines (70 loc) · 2.96 KB

RabbitMQ四种发送方式区别.md

File metadata and controls

105 lines (70 loc) · 2.96 KB

注意:不管是何种模式,对于队列来说,同一个消息经过路由规则,不管能匹配多少规则,消息只会被路由到该队列一次!而那些不能匹配规则的消息将被丢弃!

A message with a routing key will be delivered to the queue only once, even though it matches many bindings.

If it doesn't match any binding so it will be discarded.

0. 模式:默认

发送:

channel.basicPublish("", ROUTING_KEY, MESSAGE);

其中 EXCHANGE_NAME 为空默认的交换器),ROUTING_KEY 值为 QUEUE_NAME

简化版的 direct

接收:

EXCHANGE_NAME 没有 bind,也就是说 channel 不用调用 bind 函数

硬要调用,会报:ACCESS_REFUSED - operation not permitted on the default exchange

1. 模式:direct

发送:

channel.exchangeDeclare(EXCHANGE_NAME, "direct");

channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, MESSAGE);

发送端指定 ROUTING_KEY 的值消息具体路由到哪个队列由路由器根据匹配规则决定当路由器发现完全匹配的 ROUTING_KEY 消息就会被路由到与其绑定的相应队列这样的队列可以有多个如果路由器没有发现完全匹配的 ROUTING_KEY 则该消息被丢弃

接收:

channel.exchangeDeclare(EXCHANGE_NAME, "direct");

channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);

topic 的弱化版ROUTING_KEY 只能用来做完全匹配而不能模糊匹配

2. 模式:topic

发送:

channel.exchangeDeclare(EXCHANGE_NAME, "topic");

channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, MESSAGE);

发送端指定 ROUTING_KEY 的值消息具体路由到哪个队列由路由器根据匹配规则决定这里的 ROUTING_KEY 可以模糊匹配不能匹配的消息将被丢弃

接收:

channel.exchangeDeclare(EXCHANGE_NAME, "topic");

channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);

direct 的加强版ROUTING_KEY 用点号(.)隔开区间可以模糊匹配(*,仅匹配一个;#,匹配零或多个)

3. 模式:fanout

发送:

channel.exchangeDeclare(EXCHANGE_NAME, "fanout");

channel.basicPublish(EXCHANGE_NAME, "", MESSAGE);

ROUTING_KEY 为空即使使用了也不生效

接收:

channel.exchangeDeclare(EXCHANGE_NAME, "fanout");

channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, "");

topic 的完全版ROUTING_KEY 为空即使使用了也不生效),意味着只要绑定 EXCHANGE_NAME都能路由

4. 模式:诡异的headers

发送:

channel.exchangeDeclare(EXCHANGE_NAME, "headers");

发送消息定义一些 header即一些KV值

ROUTING_KEY 在该模式下不做路由

接收:

 channel.exchangeDeclare(EXCHANGE_NAME, "headers");

 接收绑定一些 header忽略 ROUTING_KEY带有这些 header 的消息都会被接收