一. 為什么要用mq?
在介紹RabbitMQ之前,我們先來看下面一個(gè)電商項(xiàng)目的場(chǎng)景:
- 商品的原始數(shù)據(jù)保存在數(shù)據(jù)庫中,增刪改查都在數(shù)據(jù)庫中完成。
- 搜索服務(wù)數(shù)據(jù)來源是索引庫(Elasticsearch),如果數(shù)據(jù)庫商品發(fā)生變化,索引庫數(shù)據(jù)不能及時(shí)更新。
- 商品詳情做了頁面靜態(tài)化處理,靜態(tài)頁面數(shù)據(jù)也不會(huì)隨著數(shù)據(jù)庫商品更新而變化。
如果我們?cè)诤笈_(tái)修改了商品的價(jià)格,搜索頁面和商品詳情頁顯示的依然是舊的價(jià)格,這樣顯然不對(duì)。該如何解決? ?
我們可能會(huì)想到這么做:
- 方案1:每當(dāng)后臺(tái)對(duì)商品做增刪改操作,同時(shí)修改索引庫數(shù)據(jù)及更新靜態(tài)頁面。
- 方案2:搜索服務(wù)和商品頁面靜態(tài)化服務(wù)對(duì)外提供操作接口,后臺(tái)在商品增刪改后,調(diào)用接口。?
?這兩種方案都有個(gè)嚴(yán)重的問題:就是代碼耦合,后臺(tái)服務(wù)中需要嵌入搜索和商品頁面服務(wù),違背了微服務(wù)的獨(dú)立原則。
這時(shí),我們就會(huì)采用另外一種解決辦法,那就是消息隊(duì)列!?
? ? ? ? 商品服務(wù)對(duì)商品增刪改以后,無需去操作索引庫和靜態(tài)頁面,只需向MQ發(fā)送一條消息(比如包含商品id的消息),也不關(guān)心消息被誰接收。 搜索服務(wù)和靜態(tài)頁面服務(wù)監(jiān)聽MQ,接收消息,然后分別去處理索引庫和靜態(tài)頁面(根據(jù)商品id去更新索引庫和商品詳情靜態(tài)頁面)。?
二.?RabbitMQ介紹
2.1.?什么是mq?
????????消息隊(duì)列(Message Queue,簡(jiǎn)稱MQ):是在消息的傳輸過程中保存消息的容器。用于分布式系統(tǒng)之間進(jìn)行通信。
?2.2?選型和對(duì)比
RabbitMQ | ActiveMQ | RocketMQ | Kafka | |
---|---|---|---|---|
公司/社區(qū) | Rabbit | Apache | 阿里 | Apache |
開發(fā)語言 | Erlang | Java | Java | Scala&Java |
協(xié)議 | AMQP | OpenWire、AUTO、Stomp、MQTT | 自定義 | 自定義 |
單機(jī)吞吐量 | 萬級(jí) | 萬級(jí)(最差) | 十萬級(jí) | 十萬級(jí) |
消息延遲 | 微妙級(jí) | 毫秒級(jí) | 毫秒級(jí) | 毫秒以內(nèi) |
特性 | 并發(fā)能力很強(qiáng),延時(shí)很低 | 老牌產(chǎn)品,文檔較多 | MQ功能比較完備,擴(kuò)展性佳 | 只支持主要的MQ功能,畢竟是為大數(shù)據(jù)領(lǐng)域準(zhǔn)備的。 |
綜合上面的材料得出以下兩點(diǎn) :?
-
中小型軟件公司,建議選RabbitMQ.一方面,erlang語言天生具備高并發(fā)的特性,RabbitMQ的社區(qū)十分活躍,可以解決開發(fā)過程中遇到的bug,這點(diǎn)對(duì)于中小型公司來說十分重要。不考慮rocketmq和kafka的原因是中小型軟件公司不如互聯(lián)網(wǎng)公司,數(shù)據(jù)量沒那么大,選消息中間件,應(yīng)首選功能比較完備的,所以kafka和rocketmq排除。
-
大型軟件公司,根據(jù)具體使用在rocketMq和kafka之間二選一。一方面,大型軟件公司,具備足夠的資金搭建分布式環(huán)境,也具備足夠大的數(shù)據(jù)量。針對(duì)rocketMQ,大型軟件公司也可以抽出人手對(duì)rocketMQ進(jìn)行定制化開發(fā),畢竟國(guó)內(nèi)有能力改JAVA源碼的人,還是相當(dāng)多的。至于kafka,根據(jù)業(yè)務(wù)場(chǎng)景選擇,如果有日志采集功能,肯定是首選kafka了。
?2.3?什么是RabbitMQ?
????????AMQP,即 Advanced Message Queuing Protocol(高級(jí)消息隊(duì)列協(xié)議),是一個(gè)網(wǎng)絡(luò)協(xié)議,是應(yīng)用層協(xié)議的一個(gè)開放標(biāo)準(zhǔn),為面向消息的中間件設(shè)計(jì)?;诖藚f(xié)議的客戶端與消息中間件可傳遞消息,并不受客戶端/中間件不同產(chǎn)品,不同的開發(fā)語言等條件的限制。2006年,AMQP規(guī)范發(fā)布。類比HTTP。
?2.4 為什么使用RabbitMQ?
2.4.1 解耦
- 傳統(tǒng)模式:耦合性太強(qiáng),系統(tǒng)A在代碼中直接調(diào)用系統(tǒng)B和系統(tǒng)C的代碼,如果將來D系統(tǒng)接入,系統(tǒng)A還需要修改代碼,過于麻煩!
- 中間件模式:將消息寫入到對(duì)列中,需要消息的系統(tǒng)自己從消息隊(duì)列中訂閱,從而系統(tǒng)A不需要做任何改變?
2.4.2?異步
- 傳統(tǒng)模式:一些非必要的業(yè)務(wù)邏輯以同步的方式運(yùn)行,太耗費(fèi)時(shí)間
- ?中間件模式:將消息寫入消息隊(duì)列,非必要的業(yè)務(wù)邏輯以異步的方式運(yùn)行,加快響應(yīng)速度
?2.4.3 削峰
- 傳統(tǒng)模式:并發(fā)量大的時(shí)候,所有的請(qǐng)求直接懟到數(shù)據(jù)庫,造成數(shù)據(jù)庫連接異常
- ?中間件模式:系統(tǒng)A慢慢的按照數(shù)據(jù)庫能處理的并發(fā)量,從消息隊(duì)列中慢慢拉取消息(秒殺商品)
?三.?RabbitMQ的安裝(linux系統(tǒng)安裝)
3.1 下載:
官網(wǎng)下載http://www.rabbitmq.com/download.html
?
3.2 安裝Erlang
- 上傳安裝包到linux系統(tǒng)下
- ?進(jìn)入上傳后的目錄下,依次執(zhí)行命令:
1)rpm -ivh esl-erlang-17.3-1.x86_64.rpm --force --nodeps
2)rpm -ivh esl-erlang_17.3-1~centos~6_amd64.rpm --force --nodeps
3)rpm -ivh esl-erlang-compat-R14B-1.el6.noarch.rpm --force --nodeps
?3.3?安裝RabbitMQ
- 上傳安裝包到linux系統(tǒng)下
-
進(jìn)入上傳后的目錄下,執(zhí)行命令:
rpm -ivh rabbitmq-server-3.4.1-1.noarch.rpm
??3.4?啟動(dòng)和停止
service rabbitmq-server start? #啟動(dòng)服務(wù)
service rabbitmq-server stop??#停止服務(wù)
service rabbitmq-server restart??#重啟服務(wù)
service rabbitmq-server status??#查看當(dāng)前服務(wù)
?3.5?設(shè)置開機(jī)自啟
chkconfig rabbitmq-server on
3.6?防火墻開放15672端口--外部可訪問
/sbin/iptables -I INPUT -p tcp --dport 15672 -j ACCEPT
/etc/rc.d/init.d/iptables save
?3.7?開啟web界面管理工具
rabbitmq-plugins enable rabbitmq_management
service rabbitmq-server restart
3.8?創(chuàng)建賬戶
? ? ? ? 這樣就算安裝成功了,他默認(rèn)有一個(gè)賬戶,賬號(hào)guest具有所有的操作權(quán)限,并且又是默認(rèn)賬號(hào),出于安全因素的考慮,guest用戶只能通過localhost登陸,并且只能在安裝機(jī)器上使用
? ? ? ? 我們創(chuàng)建一個(gè)admin賬戶,創(chuàng)建一個(gè)賬戶并支持遠(yuǎn)程ip訪問
- 1. 創(chuàng)建賬戶
rabbitmqctl ?add_user admin 1111
- ? 2. 給用戶添加角色
rabbitmqctl ?set_user_tags admin ?administrator
- 3. 設(shè)置用戶權(quán)限
?rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
- 4.設(shè)置完成后可以查看當(dāng)前用戶和角色(需要開啟服務(wù))
?rabbitmqctl list_users
3.9 測(cè)試
????????瀏覽器輸入:serverip:15672。其中serverip是RabbitMQ-Server所在主機(jī)的ip,15672是RabbitMQ-Server的端口號(hào)
?
?四.?RabbitMQ管理界面
4.1 主頁總覽
connections:無論生產(chǎn)者還是消費(fèi)者,都需要與RabbitMQ建立連接后才可以完成消息的生產(chǎn)和消費(fèi),在這里可以查看連接情況
channels:通道,建立連接后,會(huì)形成通道,消息的投遞獲取依賴通道。
Exchanges:交換機(jī),用來實(shí)現(xiàn)消息的路由
Queues:隊(duì)列,即消息隊(duì)列,消息存放在隊(duì)列中,等待消費(fèi),消費(fèi)后被移除隊(duì)列。
端口:
????????5672: rabbitMq的編程語言客戶端連接端口
????????15672:rabbitMq管理界面端口
????????25672:rabbitMq集群的端口
4.2 添加用戶
如果不使用guest,我們也可以自己創(chuàng)建一個(gè)用戶:
1、 超級(jí)管理員(administrator)
????????可登陸管理控制臺(tái),可查看所有的信息,并且可以對(duì)用戶,策略(policy)進(jìn)行操作。
2、 監(jiān)控者(monitoring)
????????可登陸管理控制臺(tái),同時(shí)可以查看rabbitmq節(jié)點(diǎn)的相關(guān)信息(進(jìn)程數(shù),內(nèi)存使用情況,磁盤使用情況等)
3、 策略制定者(policymaker)
????????可登陸管理控制臺(tái), 同時(shí)可以對(duì)policy進(jìn)行管理。但無法查看節(jié)點(diǎn)的相關(guān)信息(上圖紅框標(biāo)識(shí)的部分)。
4、 普通管理者(management)
????????僅可登陸管理控制臺(tái),無法看到節(jié)點(diǎn)信息,也無法對(duì)策略進(jìn)行管理。
5、 其他
????????無法登陸管理控制臺(tái),通常就是普通的生產(chǎn)者和消費(fèi)者
4.3 創(chuàng)建Virtual Hosts
虛擬主機(jī):類似于mysql中的database。他們都是以“/”開頭
4.4?設(shè)置權(quán)限
1. 點(diǎn)擊用戶名
2、設(shè)置權(quán)限
文章來源:http://www.zghlxwxcb.cn/news/detail-401872.html
3、查看效果文章來源地址http://www.zghlxwxcb.cn/news/detail-401872.html
到了這里,關(guān)于RabbitMQ入門系列01----RabbitMQ簡(jiǎn)介的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!