柚子快報(bào)邀請(qǐng)碼778899分享:RabbitMQ介紹及搭建
柚子快報(bào)邀請(qǐng)碼778899分享:RabbitMQ介紹及搭建
架構(gòu)
RabbitMQ是實(shí)現(xiàn)了高級(jí)消息隊(duì)列協(xié)議(AMQP)的開源消息代理軟件,使用erlang語言編寫,依賴Erlang環(huán)境運(yùn)行。
Broker:運(yùn)行消息隊(duì)列服務(wù)進(jìn)程的節(jié)點(diǎn),包含Exchange、Queue; Producer:消息生產(chǎn)者; Consumer:消息消費(fèi)者;
相關(guān)概念
Server:AMQP實(shí)例,接收客戶端的連接;
Connection:連接,應(yīng)用程序與Server的TCP連接;
Channel:信道,輕量級(jí)的Connection,消息讀寫等操作在信道中進(jìn)行??蛻舳嗽谝粋€(gè)Connection中建立多個(gè)信道,每個(gè)信道代表一個(gè)會(huì)話任務(wù)。如果每一次訪問 RabbitMQ 都建立一個(gè) Connection,在大量消息時(shí)開銷會(huì)變得巨大;
Message:應(yīng)用程序和服務(wù)器之間傳送的數(shù)據(jù);
Virtual Host:邏輯隔離,由若干Exchange、Queue組成;
Exchange:交換器,按照路由規(guī)則將消息路由到一個(gè)或者多個(gè)隊(duì)列;
Queue:隊(duì)列,用來暫存消息,供consumer消費(fèi);
RoutingKey:路由鍵,producer向Exchange發(fā)送消息時(shí)會(huì)標(biāo)識(shí)路由鍵,按照路由鍵的不通發(fā)送到指定Queue。格式如“com.rabbitmq”;
Binding:綁定,Echange、Queue之間的虛擬連接,由一個(gè)或者多個(gè)RoutingKey組成;
exchange分類
Direct Exchange:直連交換器,一對(duì)一發(fā)送,綁定一個(gè)Queue,與一個(gè)特定的RoutingKey完全匹配;
Fanout Exchange:扇形交換器,類似子網(wǎng)廣播,綁定多個(gè)Queue,發(fā)送到該類型交換器的消息,都會(huì)被轉(zhuǎn)發(fā)到與其綁定的所有Queue上;
Topic Exchange:主題交換器,通過通配符(*)(#)匹配RoutingKey,路由到相應(yīng)的Queue;
Headers Exchange:頭交換器,通過匹配請(qǐng)求頭中攜帶的鍵值進(jìn)行消息路由,有2種模式:全部匹配、部分匹配;
queue分類
主從架構(gòu),吞吐量受限。
master queue:主隊(duì)列,讀寫操作均在master queue上,然后由master同步操作到mirror queue。即使consumer連接到了mirror queue,相關(guān)操作也會(huì)被路由到master queue上。對(duì)于生成隊(duì)列,原理和消費(fèi)一樣;
mirror queue:鏡像隊(duì)列,作為備份,在master queue所在節(jié)點(diǎn)掛掉之后,系統(tǒng)把mirror queue提升為master queue;
使用模式
simple模式
P發(fā)送消息到隊(duì)列,C監(jiān)聽消息隊(duì)列,如果Queue中有消息,就消費(fèi),然后自動(dòng)刪除。可以通過啟用消息確認(rèn)機(jī)制確保穩(wěn)健性,消費(fèi)完后會(huì)立即發(fā)送ack,否則會(huì)造成內(nèi)存溢出;
work模式
P發(fā)送消息到隊(duì)列,C1、C2共同監(jiān)聽Queue,爭搶消息,誰先拿到誰就消費(fèi);
publish/subscribe模式
P發(fā)送消息到交換器X,X發(fā)布訂閱,將消息發(fā)送到已綁定的Queue中,相應(yīng)的C監(jiān)聽自己;
routing模式
P發(fā)送消息到交換器X,X根據(jù)路由字符RoutingKey做匹配,發(fā)送到對(duì)應(yīng)的Queue,對(duì)應(yīng)的C進(jìn)行消費(fèi);
topic模式
路由模式的一種,X根據(jù)RoutingKey的進(jìn)行模糊匹配,發(fā)送到相應(yīng)的Queue,對(duì)應(yīng)的C進(jìn)行消費(fèi);
rpc模式
基于Direct交換器,使用MQ實(shí)現(xiàn)RPC的異步調(diào)用,過程如下: 1、Client即是P也是C,向rpc_queue送調(diào)用消息,同時(shí)監(jiān)聽reply_queue; 2、Server監(jiān)聽rpc_queue,收到消息后進(jìn)行處理,返回結(jié)果; 3、Server將結(jié)果發(fā)送到reply_queue; 4、Client接收到RPC調(diào)用結(jié)果;
環(huán)境
systemctl stop firewalld && systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
vi /etc/hosts
ip1 rabbit1
ip2 rabbit2
ip3 rabbit3
安裝配置
yum install -y rabbitmq-server
mkdir -p /etc/systemd/system/rabbitmq-server.service.d
# 修改文件打開數(shù)
vi /etc/systemd/system/rabbitmq-server.service.d/limit.conf
[Service]
LimitNOFILE = 100000
# 修改ip與端口
vi /etc/rabbitmq/rabbitmq-env.conf
RABBITMQ_NODE_IP_ADDRESS="本機(jī)ip"
RABBITMQ_NODE_PORT=5672
vi /etc/rabbitmq/rabbitmq.config
% Template Path: rabbitmq/templates/rabbitmq.config
[
{kernel,[
{inet_dist_listen_min, 41055},
{inet_dist_listen_max, 41055},
# epmd端口必須打開,群集才能正常工作、cli才能使用,設(shè)置端口范圍
{inet_default_connect_options, [{nodelay,true}]} ]},
{rabbit,[
# 在autoheal模式下,當(dāng)某網(wǎng)絡(luò)分區(qū)故障時(shí),RabbitMQ會(huì)自動(dòng)決定一個(gè)獲勝分區(qū)winning,然后重啟不在這個(gè)分區(qū)中的節(jié)點(diǎn)以恢復(fù)網(wǎng)絡(luò)分區(qū)
{cluster_partition_handling, autoheal},
# tcp套接字的配置
{tcp_listen_options, [
binary,
{packet, raw},
{reuseaddr, true},
# 未接受的TCP連接隊(duì)列的最大數(shù),達(dá)到此數(shù)量時(shí),新的連接將被拒絕
{backlog, 4096},
{nodelay, true},
{exit_on_close, false},
# heartbeat: 0,代表關(guān)閉心跳服務(wù)
# 啟用tcp keepalive機(jī)制
{keepalive, true}
]}
{rabbitmq_management,[
{http_log_dir, "/tmp/rabbit-mgmt"},
# 監(jiān)控各項(xiàng)資源的速率,none為不監(jiān)控,默認(rèn)為basic
{rates_mode,none}
]}
# 復(fù)制cookie
scp /var/lib/rabbitmq/.erlang.cookie root@rabbit2:/var/lib/rabbitmq/.erlang.cookie
scp /var/lib/rabbitmq/.erlang.cookie root@rabbit3:/var/lib/rabbitmq/.erlang.cookie
chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
chown rabbitmq:rabbitmq /etc/rabbitmq/rabbitmq.config
chmod 400 /var/lib/rabbitmq/.erlang.cookie
systemctl daemon-reload
systemctl enable rabbitmq-server.service
systemctl start rabbitmq-server.service
# 查看狀態(tài)
rabbitmqctl cluster_status
# 關(guān)閉:其他從節(jié)點(diǎn)先執(zhí)行關(guān)閉,然后加入集群主節(jié)點(diǎn)
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@rabbit1
rabbitmqctl start_app
# 查看
rabbitmqctl cluster_status
# 隊(duì)列的鏡像設(shè)置,在集群中所有的節(jié)點(diǎn)上進(jìn)行鏡像
rabbitmqctl set_policy ha-all '^(?!amq\.).*' '{"ha-mode": "all"}
# 創(chuàng)建用戶
rabbitmqctl add_user test
rabbitmqctl set_permissions -p / test test#123
rabbitmqctl set_user_tags test 角色
柚子快報(bào)邀請(qǐng)碼778899分享:RabbitMQ介紹及搭建
精彩內(nèi)容
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。