[TOC]
rabbitmq
架构
关键部件
- consumer/producer
- exchange
- queue
consumer 和 queue
一个queue下可以连多个consumer;
consumer从queue中取消息;
queue中的一个消息,可以发送给与queue相连的其中一个consumer。
queue到consumer这个流程段,是不做匹配的(虽然有queuename和consumername,但是仅仅用做标识而已)。
queue类似于组,多个consumer并发处理queue中的消息。
exchange 和 producer
producer的消息回带exchangename
和routerkey
。
消息到了rabbitmq服务器,会选择一个exchange。
exchange会根据routerkey来选择queue。
exchange 和 queue
exchange和queue会通过queuekey
来绑定操作;
exchange收到消息之后,会根据消息中的routerkey
来选择queue;
具体匹配规则,根据exchange类型相关:
-
direct:完全匹配——必须
routerkey
和queuekey
完全相同,才会选择匹配到这个queue。- 如果queue1和queue2都以相同的
queuekey
'test_12'绑定到exchange1, - 如果queue3以
queuekey
'test_3'绑定到exchange1, - exchange1下面没有绑定其它任何队列。
- 那么exchange收到
routerkey
为'test_12'的消息,那么会放到queue1,queue2; - 那么exchange收到
routerkey
为'test_3'的消息,那么会放到queue3; - 如果收到
routerkey
为其它字串,那么就匹配不到。
- 如果queue1和queue2都以相同的
-
fanout:不做任何匹配,只要在exchange下面的queue就发。
- 还是上面的例子,exchange1下面有三个队列queue1,queue2,queue3: bind(exchang1,queue1,test_12);bind(exchang1,queue2,test_12);bind(exchang1,queue3,test_3);
- exchange1收到
任何消息
,都会同时发到queue1,queue2,queue3。- 注意,即不会对
routerkey
和queuekey
做匹配。
- 注意,即不会对
-
topic:这种跟redict类似,需要做匹配,但是,可以进行通配符匹配。
- queue1假设
queuekey
为test.* - queue1假设
queuekey
为test.# - 假设
routekey
是test,匹配不到任何队列 - 假设
routekey
是test.test1,同时匹配到queue1,queeu2 - 假设
routekey
是test.test1.test2,只能匹配到queue2
- queue1假设
注意,
.
之间的整个串进行匹配,不会支持部分匹配(比如:test*
/test.t#
)
消息流程
- producer生成一个消息msg,发送到rabbitmq服务器;
- rabbitmq服务器根据msg的exchange名字,选择一个exchange(如果为空,那么选择默认的exchange)
- exchange根据routekey来匹配exchange下面的队列
- 匹配成功,就放进队列;
- 如果匹配失败,就做对应处理(属性设置,可以选择丢弃,可以选择等待队列创建)
- queue从下面连接的consumer中选择一个,将msg发送过去。
- 一般情况下,会等待ack确认。
网友评论