fanout exchange缺点:盲目广播,会忽略掉binding key的value。
direct exchange: 不能基于多个标准进行路由。
topic exchange:
发送到topic exchange的message不能有任意的routing_key,必须是单词列表,有点号分隔。单词可以是任意的,但是通常他们都代表连接到message的一些特征。
一些合法的routing key例子:"stock.usd.nyse", "nyse.vmw","quick.orange.rabit".routing key里面可以有任意多单词,但是限制在255字节内。
binding key必须也是同样的形式。
topic exchange背后的逻辑与direct exchange类似:特定routing key的message将会被传递到所有binding key与message的routing key匹配的queue里面。
注意:这里有两个特例:
1. * (星号) 能够准确替代一个单词
2. #(井号)能够替换零个或多个单词。
由上图可知:
我们将发送的消息是描述动物的。
routing key的第一个单词代表速度,第二个代表颜色,第三个代表种类。
Q1与"*.orange.*"绑定,Q2与"*.*.rabbit"和"lazy.#."绑定。
简单描述:
Q1对所有的orange动物感兴趣;
Q2对所有的兔子以及所有懒惰的动物感兴趣
一个message的routing key "quick.orange.rabbit"将会被路由到Q1和Q2;
routing key为"quick.orange.fox"将会被路由到Q1;
routing key为"lazy.brown.fox"将会路由到Q2 ;
routing key为"lazy.pink.rabbit"将会路由到Q2一次,即使匹配Q1与Q2
routing key 为"quick.brown.fox"没有任何匹配,因此将会被丢弃。
如果routing key为"orange"或者"quick.orange.male.rabbit",那么该消息将被丢弃。
routing key 为"lazy.orange.male.rabbit"会被路由到Q2.
由上可见,topic exchange功能强大,可以像其他类型的exchange一样。
当queue与#绑定的时候,将会接收所有message。