开篇
本文主要讲解 routing 和 topics 两种工作模式,其中 topics 只是在 routing 的基础上增加了一个 routingkey 的正则匹配。接下来会详细介绍。
routing 模式
之前说到的 Publish/Subscribe 是把一个消息发给多个消费者,并且每个消费者接收到的消息是一样的。而这次说到的Routing 模式,则是通过增加一个组件(Bingings),使我们的消费者能订阅到自己感兴趣的消息。
bindings 的作用
Bindings 会将 exchanges 和 queue 联系在一起,queue 通过 bindings 从 exchangs 中订阅自己感兴趣的消息。
Routing Key
Bindings 提供了一个 RoutingKey 参数 channel.queueBind(queueName, EXCHANGE_NAME, routingkey); 其实在上一篇中,也有这个参数, 只不过这个参数是一个空字符串,因为 这个key和 exchange type是息息相关的,fanout 类型的 exchange 的key就是 空字符串。
-
direct exchange
一个消息 会根据 routing key 来匹配自己应该去哪个队列。
-
Multiple bindings
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 byte
例如:lazy.orange.rabbit 或者 quick.orange.fox, 除此之外, 还可以用
- '*' 代表一个单词
- '#' 代表 0个 或 多个 单词
例如 :.orange.rabbit, .orange., quick.# 但是如果单词个数不匹配,也是不行的, 比如, lazy.orange.rabbit. 或者 *.orange.rabbit.other 但是 '#' 这样用是可以的, lazy.orange.rabbit.#;