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.#;

相关文章
相关标签/搜索