[TOC]
rabbitmq
架構
rabbitmq 基本架構
關鍵部件
- consumer/producer
- exchange
- queue
consumer 和 queue
??一個queue下可以連多個consumer娘侍;
??consumer從queue中取消息;
??queue中的一個消息,可以發(fā)送給與queue相連的其中一個consumer沾乘。
queue到consumer這個流程段,是不做匹配的(雖然有queuename和consumername恬砂,但是僅僅用做標識而已)蛤铜。
queue類似于組,多個consumer并發(fā)處理queue中的消息婆殿。
exchange 和 producer
??producer的消息回帶exchangename
和routerkey
诈乒。
??消息到了rabbitmq服務器,會選擇一個exchange婆芦。
??exchange會根據(jù)routerkey來選擇queue怕磨。
exchange 和 queue
??exchange和queue會通過queuekey
來綁定操作;
??exchange收到消息之后喂饥,會根據(jù)消息中的routerkey
來選擇queue;
??具體匹配規(guī)則,根據(jù)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就發(fā)辈讶。
- 還是上面的例子,exchange1下面有三個隊列queue1,queue2,queue3: bind(exchang1,queue1,test_12);bind(exchang1,queue2,test_12);bind(exchang1,queue3,test_3);
- exchange1收到
任何消息
,都會同時發(fā)到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禾乘,發(fā)送到rabbitmq服務器澎埠;
- rabbitmq服務器根據(jù)msg的exchange名字,選擇一個exchange(如果為空始藕,那么選擇默認的exchange)
- exchange根據(jù)routekey來匹配exchange下面的隊列
- 匹配成功蒲稳,就放進隊列;
- 如果匹配失敗鳄虱,就做對應處理(屬性設置弟塞,可以選擇丟棄,可以選擇等待隊列創(chuàng)建)
- queue從下面連接的consumer中選擇一個拙已,將msg發(fā)送過去决记。
- 一般情況下,會等待ack確認倍踪。