在項目中引入RabbitMQ通常會考慮它會帶來的好處:解耦應用程序,實現不同編程語言之間的互通,解除對特定通信協議的依賴,解除應用程序在時序上執行的依賴(異步).落實到代碼層面就是兩種常用應用模式:"發后即忘"(fire-and-forget)和RPC.
fire-and-forget
RPC
這里有兩件事情要保證:1.要為隊列創建隨機Name 2.即使Name隨機還是有可能沖突,還需要保證消息通信的獨占性,看看RabbitMQ是怎么滿足這兩點的:
[1] 之前提到過,如果創建的隊列不指定queue name,RabbitMQ就會創建一個隨機的Name.
[2] 獨占只需要exclusive參數即可
總而言之,需要做的就是Client創建一個temporary,exclusive,anonymou的queue,並把queue name設置在RPC 消息的reply_to字段即可.注意這里RPC Server已經知道要投遞到哪個Queue,所以不需要指定Exchange(后面我們會提到在實現層面Queue和Exchange的不同,簡單講queue會有對應的Erlang進程,而exchang只是執行一些模式匹配的檢查並沒有進程實體對應).看下圖:
略有不同
傳統的RPC調用Client和Server緊密依賴,客戶端連接上服務器,發送一個請求然后阻塞等待服務器響應.這樣的做的特點是客戶端和服務器端是知道對方的.如果RPC Server崩潰掉,客戶端需要重連,如果Server徹底崩掉就要重新找一個提供同樣服務的Server,然后客戶端重連過去.
用RabbitMQ來實現RPC,依然保持Client Server信息隱藏的特點,Client依賴的不是特定的Server而是特定的消息,在有多個等效Server的情況下,一個Server的狀態是否正常不會影響到客戶端的狀態.
總結一下,使用RabbitMQ是先RPC,客觀上還實現了下面的效果:
- 容錯 一個Server崩潰不影響 Client
- 解耦了對特定通信協議和接口的依賴,統一走AMQP消息.
- 在多個RPC Server之間的負載均衡由RabbitMQ完成
RabbitMQ 入門文檔中專門提到了RPC的場景,Python和Java版本的代碼都有,很容易寫一個.net版本這里不再堆疊,請移步這里:
http://www.rabbitmq.com/tutorials/tutorial-six-python.html