------------恢復內容開始------------
參考:https://www.cnblogs.com/vipstone/p/9275256.html
RabbitMQ簡介
在介紹RabbitMQ之前實作要介紹一下MQ,MQ是什么?
MQ全稱是Message Queue,可以理解為訊息佇列的意思,簡單來說就是訊息以管道的方式進行傳遞,
RabbitMQ是一個實作了AMQP(Advanced Message Queuing Protocol)高級訊息佇列協議的訊息佇列服務,用Erlang語言的,
使用場景
在我們秒殺搶購商品的時候,系統會提醒我們稍等排隊中,而不是像幾年前一樣頁面卡死或報錯給用戶,
像這種排隊結算就用到了訊息佇列機制,放入通道里面一個一個結算處理,而不是某個時間斷突然涌入大批量的查詢新增把資料庫給搞宕機,所以RabbitMQ本質上起到的作用就是削峰填谷,為業務保駕護航,
為什么選擇RabbitMQ
現在的市面上有很多MQ可以選擇,比如ActiveMQ、ZeroMQ、Appche Qpid,那問題來了為什么要選擇RabbitMQ?
- 除了Qpid,RabbitMQ是唯一一個實作了AMQP標準的訊息服務器;
- 可靠性,RabbitMQ的持久化支持,保證了訊息的穩定性;
- 高并發,RabbitMQ使用了Erlang開發語言,Erlang是為電話交換機開發的語言,天生自帶高并發光環,和高可用特性;
- 集群部署簡單,正是應為Erlang使得RabbitMQ集群部署變的超級簡單;
- 社區活躍度高,根據網上資料來看,RabbitMQ也是首選;
作業機制
生產者、消費者和代理
在了解訊息通訊之前首先要了解3個概念:生產者、消費者和代理,
生產者:訊息的創建者,負責創建和推送資料到訊息服務器;
消費者:訊息的接收方,用于處理資料和確認訊息;
代理:就是RabbitMQ本身,用于扮演“快遞”的角色,本身不生產訊息,只是扮演“快遞”的角色,
訊息發送原理
首先你必須連接到RabbitMQ才能發布和消費訊息,那怎么連接和發送訊息的呢?
你的應用程式和Rabbit Server之間會創建一個TCP連接,一旦TCP打開,并通過了認證,認證就是你試圖連接Rabbit之前發送的Rabbit服務器連接資訊和用戶名和密碼,有點像程式連接資料庫,使用Java有兩種連接認證的方式,后面代碼會詳細介紹,一旦認證通過你的應用程式和Rabbit就創建了一條AMQP信道(Channel),
信道是創建在“真實”TCP上的虛擬連接,AMQP命令都是通過信道發送出去的,每個信道都會有一個唯一的ID,不論是發布訊息,訂閱佇列或者介紹訊息都是通過信道完成的,
為什么不通過TCP直接發送命令?
1. TCP的創建和銷毀,開銷大,創建需要三次握手,銷毀需要四次分手,
2. 如果不使用信道,那么參考程式就會使用TCP的方式連接到rabbitmq,高峰時每秒成千上萬條連接會造成資源的巨大浪費(一條tcp消耗資源,成千上萬的tcp會非常消耗資源),而且作業系統每秒處理TCP連接數量也是有限的,必定會造成性能瓶頸,
3.信道的原理是一條執行緒一條信道,多條執行緒多條信道共同使用一條TCP連接,一條TCP連接可以容納無限的信道,及時每秒造成成千上萬的請求也不會造成性能瓶頸,

你必須知道的Rabbit
想要真正的了解Rabbit有些名詞是你必須知道的,
包括:ConnectionFactory(連接管理器)、Channel(信道)、Exchange(交換器)、Queue(佇列)、RoutingKey(路由鍵)、BindingKey(系結鍵),
ConnectionFactory(連接管理器):應用程式與Rabbit之間建立連接的管理器,程式代碼中使用;
Channel(信道):訊息推送使用的通道;
Exchange(交換器):用于接受、分配訊息;
Queue(佇列):用于存盤生產者的訊息;
RoutingKey(路由鍵):用于把生成者的資料分配到交換器上;
BindingKey(系結鍵):用于把交換器的訊息系結到佇列上;
看到上面的解釋,最難理解的路由鍵和系結鍵了,那么他們具體怎么發揮作用的,請看下圖:

訊息持久化
Rabbit佇列和交換器有一個不可告人的秘密,就是默認情況下重啟服務器會導致訊息丟失,那么怎么保證Rabbit在重啟的時候不丟失呢?答案就是訊息持久化,
當你把訊息發送到Rabbit服務器的時候,你需要選擇你是否要進行持久化,但這并不能保證Rabbit能從崩潰中恢復,想要Rabbit訊息能恢復必須滿足3個條件:
- 投遞訊息的時候durable設定為true,訊息持久化,代碼:channel.queueDeclare(x, true, false, false, null),引數2設定為true持久化;
- 設定投遞模式deliveryMode設定為2(持久),代碼:channel.basicPublish(x, x, MessageProperties.PERSISTENT_TEXT_PLAIN,x),引數3設定為存盤純文本到磁盤;
- 訊息已經到達持久化交換器上;
- 訊息已經到達持久化的佇列;
持久化作業原理
Rabbit會將你的持久化訊息寫入磁盤上的持久化日志檔案,等訊息被消費之后,Rabbit會把這條訊息標識為等待垃圾回收,
持久化的缺點
訊息持久化的優點顯而易見,但缺點也很明顯,那就是性能,因為要寫入硬碟要比寫入記憶體性能較低很多,從而降低了服務器的吞吐量,盡管使用SSD硬碟可以使事情得到緩解,但他仍然吸干了Rabbit的性能,當訊息成千上萬條要寫入磁盤的時候,性能是很低的,
所以使用者要根據自己的情況,選擇適合自己的方式,
虛擬主機
每個Rabbit都能創建很多vhost,我們稱之為虛擬主機,每個虛擬主機其實都是mini版的RabbitMQ,擁有自己的佇列,交換器和系結,擁有自己的權限機制,
vhost特性
-
RabbitMQ默認的vhost是“/”開箱即用;
-
多個vhost是隔離的,多個vhost無法通訊,并且不用擔心命名沖突(佇列和交換器和系結),實作了多層分離;
-
創建用戶的時候必須指定vhost;
vhost操作(具體命令見下一章內容)
可以通過rabbitmqctl工具命令創建:
rabbitmqctl add_vhost[vhost_name]
洗掉vhost:
rabbitmqctl delete_vhost[vhost_name]
查看所有的vhost:
rabbitmqctl list_vhosts
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/105766.html
標籤:C#
