一、 channel 信道:
概念:信道是生產消費者與rabbit通信的渠道,生產者publish或是消費者subscribe一個隊列都是通過信道來通信的。信道是建立在TCP連接上的虛擬連接,什么意思呢?就是說rabbitmq在一條TCP上建立成百上千個信道來達到多個線程處理,這個TCP被多個線程共享,每個線程對應一個信道,信道在rabbit都有唯一的ID ,保證了信道私有性,對應上唯一的線程使用。
疑問:為什么不建立多個TCP連接呢?原因是rabbit保證性能,系統為每個線程開辟一個TCP是非常消耗性能,每秒成百上千的建立銷毀TCP會嚴重消耗系統。所以rabbitmq選擇建立多個信道(建立在tcp的虛擬連接)連接到rabbit上。
類似概念:TCP是電纜,信道就是里面的光纖,每個光纖都是獨立的,互不影響。
二、exchange 交換機和綁定routing key
exchange的作用就是類似路由器,routing key 就是路由鍵,服務器會根據路由鍵將消息從交換器路由到隊列上去。
exchange有多個種類:direct,fanout,topic,header(非路由鍵匹配,功能和direct類似,很少用)。前三種類似集合對應關系那樣,(direct)1:1,(fanout)1:N,(topic)N:1
direct: 1:1類似完全匹配
fanout:1:N 可以把一個消息並行發布到多個隊列上去,簡單的說就是,當多個隊列綁定到fanout的交換器,那么交換器一次性拷貝多個消息分別發送到綁定的隊列上,每個隊列有這個消息的副本。
ps:這個可以在業務上實現並行處理多個任務,比如,用戶上傳圖片功能,當消息到達交換器上,它可以同時路由到積分增加隊列和其它隊列上,達到並行處理的目的,並且易擴展,以后有什么並行任務的時候,直接綁定到fanout交換器不需求改動之前的代碼。
topic N:1 ,多個交換器可以路由消息到同一個隊列。根據模糊匹配,比如一個隊列的routing key 為*.test ,那么凡是到達交換器的消息中的routing key 后綴.test都被路由到這個隊列上。
三、結合信道、交換器和路由鍵到隊列
總結幾點重要知識:1.信道才是rabbit通信本質,生產者和消費者都是通過信道完成消息生產消費的。2.交換器本質是一張路由查詢表(名稱和隊列id,類似於hash表),這是一個虛擬出來的東西,並不存在真實的交換器。
消息的生命周期:生產者生產消息A 交由信道,信道通過消息(消息由載體和標簽)的標簽(路由鍵)放到交換器發送到隊列上(其實就是查詢匹配,一旦匹配到了規則,信道就直接和隊列產生連接,然后將消息發送過去)