這次就來說說RabbitMQ,這個應該不陌生了,隨便一查就知道這個是用來做消息隊列的。(注意:這一節很多都是概念的東西,需要操作的比較少)
至於AMQP協議(Advanced Message Queuing Protocol),專業名稱叫做高級消息隊列協議,就是只要你遵守這個協議,那么做出來的產品就能跨平台,跨語言,很牛的一個協議,具體多么牛可以自己百度一下。
而RabbitMQ就是基於這個協議的!很多語言都可以用RabbitMQ,例如python,C語言,PHP,Java等語言,而且windows,linux,macos等平台都可以使用。。。
簡單看看使用場景:
運用場景1:比如大家注冊博客園的時候,注冊信息寫入數據庫之后,還需要激活吧!你要等博客園的一個線程給你發郵件,假如這個時候注冊的人很多,那就需要非常多的線程,大家也知道線程到達一定數目效率反而是降低的,而且只有等到郵件給你發送之后你才知道注冊成功,你就可能一直卡了幾分鍾。所以這個時候,就把很多個發郵件需要的消息放到一個消息隊列中你就馬上收到響應“注冊成功”,然后你就可以去玩玩手機,等一下就會收到郵件,其實對博客園來說,只需要幾個或者幾十個線程慢慢的從這個隊列中取消息、一個一個慢慢發郵件就是了。
運用場景二:大家都知道雙11,淘寶各種活動,假如一個店鋪生意特別好,一下子賣了十幾萬件。那么假如每個人都是提交訂單,還要去庫存那邊查查之后再調用方法減庫存,然后再給你響應訂單成功,emmmm....你就慢慢等十幾分鍾吧!用戶體驗賊差!但是直接把所有訂單消息給消息隊列(也叫做消息中間件),然后立刻給用戶響應:訂單成功!用戶可以想干嘛就干嘛去了,而這邊的庫存系統只需要從消息隊列中慢慢拿數據就ok,假如沒貨了還能通知店主補充貨物。
運用場景三:很多秒殺活動,就在那一秒鍾看誰的是單身三十年的手速了!然而秒殺的點擊量太高,會把那個系統卡爆了。。。所以做了一個限制,將前n個人點擊的消息放入消息隊列(可以就設置這個隊列長度為1,那么第二個及之后的消息自動全部舍棄),后面的無論多少點擊,直接丟掉並響應秒殺失敗!而秒殺業務只需要慢慢從這個隊列取消息就可以做后續的操作了。
簡單的下載安裝一下,因為這個RabbitMQ是用erlang這個語言開發的(反正我是沒有用過這個語言....),雖然我們不用,但是RabbitMQ啟動的時候要用這個的環境。
就像我們的java程序要運行,肯定要jre啊,這是一個道理!所以下載一個erlang(這個讀音是不是挺像二郎啊,哈哈!話說RabbitMQ,Rabbit是兔子的意思,M指的是Message,Q代表Queue,我猜意思是不是兔子消息隊列啊,哈哈哈)
1.RabbitMQ的簡單安裝
新建一個文件夾,把erlang和RabbitMQ放在一起。
下載relang地址:http://erlang.org/download/,多往下翻!!!我用的是下圖的這個,版本可以根據條件選擇。下完之后安裝,然后就一直next就ok了 ,存放的位置自己看着辦。(我用360極速瀏覽器下了三次都沒成功,用了谷歌一次就成功了,可還各種給我提醒不安全、對電腦有害,emmmm......看我電腦今天會不會爆炸)

一番努力之后這個erlang下好了,然后到http://www.rabbitmq.com/install-windows.html下載,如果點了下面這個跳轉到了github,就點9M多的那個文件進行下載,下完之后也是一直下一步。

ok,兩個不知道什么鬼的軟件下好了,我們就能夠看到這兩個文件夾,其中erl文件夾沒什么用,我們把重點放在rabbitmq_server,看名字就知道這個就是一個服務端,只要啟動它,我們基本的功能就能用了(雖然我們也就只會用到基本的功能)

打開rabbitmq_server-3.7.9,有個sbin,進去,打開命令窗口

然后運行命令
第一種:rabbitmq-plugins.bat enable rabbitmq_management(用了這個命令就可以直接在瀏覽器里可視化的看到RabbitMQ內部的數據了,類似Druid)
第二種:"C:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.5\sbin\rabbitmq-plugins.bat" enable rabbitmq_management
其實我感覺兩種應該是一樣的,但是可能會碰到秘之錯誤,看情況用啊!出現類似下圖這個界面就ok了(因為這個命令我運行了一次了,所以可能有些出入,但大概的應該差不多),還有估計還會有其他的錯誤,其實很正常,試試命令net stop RabbitMQ && net start RabbitMQ,重啟一下試試,沒用的話就慢慢百度是什么錯誤吧!

到此安裝成功,打開瀏覽器,輸入url:http://localhost:15672,用戶名和密碼都是:guest
登錄成功,出現如下這個頁面就成功了。

話說這個RabbitMQ可以添加新用戶,權限啊什么的,emmm....我們就自己用的,不搞這么麻煩了。
如果不小心關閉了RabbitMQ服務端或者下次再想開啟,可以在安裝目錄xxx\rabbitmq_server-3.7.9\sbin,雙擊rabbitmq-server.bat就開啟服務端了,當然你也可以去設置windows服務。
2.說說RabbitMQ的基本概念
剛開始說專業名詞很是頭痛,而聽不懂,我就來用一個小場景來引出一些概念。
小王,小李和小陳一起去路邊小飯店吃飯,這個飯店規模不大,就一個廚師,一個服務員,我們要吃飯,怎么辦呢?首先是跟服務員點菜,就點兩個菜,清炒小白菜和魚香肉絲,然后服務員將點好的菜單丟給廚師師傅做。
生活場景: 廚師做好了,把一盤小白菜給服務員,說了一句“這是清炒小白菜”,服務員就端着小白菜就跑過來了,對那三人也說了一句“這是清炒小白菜”,然后放桌子上,服務員就走了;那三人沒過幾秒鍾就把小白菜吃完了。過了一會兒,魚香肉絲做好了,根據上面的步驟又走了一遍,魚香肉絲也被拿到桌子上,慢慢的等着被吃,服務員在這過程中是離開的,而且無論點了多少個菜,都是這樣的流程;等三人吃飽喝足之后,三人也就走了,剩下的空碗空盤子和桌子會被處理。
這里涉及幾個關鍵的地方:廚師,一盤小白菜,“這是清炒小白菜”,服務員,“這是清炒小白菜”,桌子,三人,服務員離開,吃完了,桌子被處理
好了,故事聽完了,現在看看RabbitMQ的大概原理:生產者(Producer,或者叫做Publisher)生產消息(Message),並為消息設置一個路由鍵(Routing key),將消息交給交換器(Exchange),交換器通過一個綁定鍵(Binding key)和一個消息隊列綁定,只有當路由鍵和綁定鍵相同的時候,交換器就會將消息丟給消息隊列(Message Queue),然后交換器就不管了,然后消費者(Consumer)過來取隊列中的消息,取完一個消息隊列就刪除一個。
我隨便找個圖可以看一下,下圖所示:broker在這里指的就是RabbitMQ

想想啊,小飯店可能就只有一個廚師,一個服務員,就只有你們一桌人在吃飯,但是五星級大酒店呢?肯定是廚師師傅十幾個甚至幾十個,服務員更是很多,吃飯的人也是多不勝數,很多桌都有老板在吃飯,而消息中間件也是一樣。
實際情況就是:生產者可能有多個,交換器可能有多個,Queue可能有多個,消費者也可能有多個,下圖也只是粗略的顯示了一下幾個關鍵點。下圖的那個RoutingKey其實指的是:交換器根據不同Message內的RoutingKey,交換器和不同Queue綁定的Binding key,將這兩個key比較一下(要符合一定的規則),交換器就會把消息丟到目的Queue內。總之,你就當作這個圖錯了,這個應該是BindingKey,更好理解一些!

3.RabbitMQ名詞解釋(核心是RoutingKey,交換器和綁定)
Publisher(生產者):其實就是一兩行代碼或者一個程序,調用一個什么方法發送一個消息
Message(消息):由消息頭和消息體組成。消息體是真正要發送的數據,消息頭里面可以設置屬性RoutingKey,其他屬性碰到再說
Exchange(交換器):接收生產者傳過來的消息,按照一定的規則丟給指定的Queue,具體什么規則跟交換器類型有關,只說三種,direct(默認類型,那兩個key一定要一樣才會發給指定的一個或幾個Queue),fanout(不管什么key了,給所有Queue發一遍消息,類似微信公眾號的功能),topic(兩個key模糊匹配一下,差不多就行了,然后發給一個或幾個Queue)
Queue(消息隊列):存消息的容器,其實就類似一個List集合,就是放對象的容器,而且有順序。
Binding(綁定):其實就是交換器和Queue的綁定,說白了就是靠那個BindingKey(默認會用Queue的名字)嘛!注意,交換器和Queue是多對多的關系!!!一個虛擬主機可能有多個交換器,一個交換器可以綁定多個隊列,一個隊列也可以綁定多個交換器。
Connection(網絡連接):emmmm....消息到達交換器、消費者從隊列取消息總不可能是憑空就能做吧?肯定要建立連接啊,這里是TCP連接
Channel(信道):就是Connection里面很多條通道,就跟公路一樣,分為很多個車道,讓流通更快嘛!而且每個消費者去隊列取消息都開啟一個TCP,那么很浪費資源,也就是會很卡。
消費者(Consumer):表示一個程序或一兩行代碼,從隊列拿消息。
Virtual Host(虛擬主機):專業的話來說就是一個RabbitMQ服務器,可以設置很多個虛擬主機,每個虛擬主機都可以看作一個迷你型的RabbitMQ,虛擬主機之間隔離。emmmm....不就是跟電腦的虛擬機一個道理嗎???,默認的虛擬主機url是“/”,我們還可以設置其他的虛擬主機“/abc”,"/ccd",隨意。。。
Broker:代表消息隊列服務主體,在我們這里不就是RabbitMQ服務器嘛!
