消息隊列之 RabbitMQ

消息隊列之 RabbitMQ

關于消息隊列兄纺,從前年開始斷斷續(xù)續(xù)看了些資料废菱,想寫很久了技矮,但一直沒騰出空,近來分別碰到幾個朋友聊這塊的技術選型昙啄,是時候把這塊的知識整理記錄一下了穆役。

市面上的消息隊列產品有很多,比如老牌的 ActiveMQ梳凛、RabbitMQ 耿币,目前我看最火的 Kafka ,還有 ZeroMQ 韧拒,去年底阿里巴巴捐贈給 Apache 的 RocketMQ 淹接,連 redis 這樣的 NoSQL 數(shù)據庫也支持 MQ 功能∨岩纾總之這塊知名的產品就有十幾種塑悼,就我自己的使用經驗和興趣只打算談談 RabbitMQ、Kafka 和 ActiveMQ 楷掉,本文先講 RabbitMQ 厢蒜,在此之前先看下消息隊列的相關概念。

什么叫消息隊列

消息(Message)是指在應用間傳送的數(shù)據烹植。消息可以非常簡單斑鸦,比如只包含文本字符串,也可以更復雜草雕,可能包含嵌入對象巷屿。

消息隊列(Message Queue)是一種應用間的通信方式,消息發(fā)送后可以立即返回墩虹,由消息系統(tǒng)來確保消息的可靠傳遞嘱巾。消息發(fā)布者只管把消息發(fā)布到 MQ 中而不用管誰來取,消息使用者只管從 MQ 中取消息而不管是誰發(fā)布的诫钓。這樣發(fā)布者和使用者都不用知道對方的存在旬昭。

為何用消息隊列

從上面的描述中可以看出消息隊列是一種應用間的異步協(xié)作機制,那什么時候需要使用 MQ 呢菌湃?

以常見的訂單系統(tǒng)為例稳懒,用戶點擊【下單】按鈕之后的業(yè)務邏輯可能包括:扣減庫存、生成相應單據、發(fā)紅包场梆、發(fā)短信通知墅冷。在業(yè)務發(fā)展初期這些邏輯可能放在一起同步執(zhí)行,隨著業(yè)務的發(fā)展訂單量增長或油,需要提升系統(tǒng)服務的性能寞忿,這時可以將一些不需要立即生效的操作拆分出來異步執(zhí)行,比如發(fā)放紅包顶岸、發(fā)短信通知等腔彰。這種場景下就可以用 MQ ,在下單的主流程(比如扣減庫存辖佣、生成相應單據)完成之后發(fā)送一條消息到 MQ 讓主流程快速完結霹抛,而由另外的單獨線程拉取MQ的消息(或者由 MQ 推送消息),當發(fā)現(xiàn) MQ 中有發(fā)紅包或發(fā)短信之類的消息時卷谈,執(zhí)行相應的業(yè)務邏輯杯拐。

以上是用于業(yè)務解耦的情況,其它常見場景包括最終一致性世蔗、廣播端逼、錯峰流控等等。

RabbitMQ 特點

RabbitMQ 是一個由 Erlang 語言開發(fā)的 AMQP 的開源實現(xiàn)污淋。

AMQP :Advanced Message Queue顶滩,高級消息隊列協(xié)議。它是應用層協(xié)議的一個開放標準寸爆,為面向消息的中間件設計礁鲁,基于此協(xié)議的客戶端與消息中間件可傳遞消息,并不受產品赁豆、開發(fā)語言等條件的限制仅醇。

RabbitMQ 最初起源于金融系統(tǒng),用于在分布式系統(tǒng)中存儲轉發(fā)消息歌憨,在易用性、擴展性墩衙、高可用性等方面表現(xiàn)不俗务嫡。具體特點包括:

可靠性(Reliability) RabbitMQ 使用一些機制來保證可靠性,如持久化漆改、傳輸確認心铃、發(fā)布確認。

靈活的路由(Flexible Routing) 在消息進入隊列之前挫剑,通過 Exchange 來路由消息的去扣。對于典型的路由功能,RabbitMQ 已經提供了一些內置的 Exchange 來實現(xiàn)樊破。針對更復雜的路由功能愉棱,可以將多個 Exchange 綁定在一起唆铐,也通過插件機制實現(xiàn)自己的 Exchange 。

消息集群(Clustering) 多個 RabbitMQ 服務器可以組成一個集群奔滑,形成一個邏輯 Broker 艾岂。

高可用(Highly Available Queues) 隊列可以在集群中的機器上進行鏡像,使得在部分節(jié)點出問題的情況下隊列仍然可用朋其。

多種協(xié)議(Multi-protocol) RabbitMQ 支持多種消息隊列協(xié)議王浴,比如 STOMP、MQTT 等等梅猿。

多語言客戶端(Many Clients) RabbitMQ 幾乎支持所有常用語言氓辣,比如 Java、.NET袱蚓、Ruby 等等钞啸。

管理界面(Management UI) RabbitMQ 提供了一個易用的用戶界面,使得用戶可以監(jiān)控和管理消息 Broker 的許多方面癞松。

跟蹤機制(Tracing) 如果消息異常爽撒,RabbitMQ 提供了消息跟蹤機制,使用者可以找出發(fā)生了什么响蓉。

插件機制(Plugin System) RabbitMQ 提供了許多插件硕勿,來從多方面進行擴展,也可以編寫自己的插件枫甲。

RabbitMQ 中的概念模型

消息模型

所有 MQ 產品從模型抽象上來說都是一樣的過程: 消費者(consumer)訂閱某個隊列源武。生產者(producer)創(chuàng)建消息,然后發(fā)布到隊列(queue)中想幻,最后將消息發(fā)送到監(jiān)聽的消費者粱栖。

RabbitMQ 基本概念

上面只是最簡單抽象的描述,具體到 RabbitMQ 則有更詳細的概念需要解釋脏毯。上面介紹過 RabbitMQ 是 AMQP 協(xié)議的一個開源實現(xiàn)闹究,所以其內部實際上也是 AMQP 中的基本概念:

Message 消息,消息是不具名的食店,它由消息頭和消息體組成渣淤。消息體是不透明的,而消息頭則由一系列的可選屬性組成吉嫩,這些屬性包括routing-key(路由鍵)价认、priority(相對于其他消息的優(yōu)先權)、delivery-mode(指出該消息可能需要持久性存儲)等自娩。

Publisher 消息的生產者用踩,也是一個向交換器發(fā)布消息的客戶端應用程序。

Exchange 交換器,用來接收生產者發(fā)送的消息并將這些消息路由給服務器中的隊列脐彩。

Binding 綁定碎乃,用于消息隊列和交換器之間的關聯(lián)。一個綁定就是基于路由鍵將交換器和消息隊列連接起來的路由規(guī)則丁屎,所以可以將交換器理解成一個由綁定構成的路由表荠锭。

Queue 消息隊列,用來保存消息直到發(fā)送給消費者晨川。它是消息的容器证九,也是消息的終點。一個消息可投入一個或多個隊列共虑。消息一直在隊列里面愧怜,等待消費者連接到這個隊列將其取走。

Connection 網絡連接妈拌,比如一個TCP連接拥坛。

Channel 信道,多路復用連接中的一條獨立的雙向數(shù)據流通道尘分。信道是建立在真實的TCP連接內地虛擬連接猜惋,AMQP 命令都是通過信道發(fā)出去的,不管是發(fā)布消息培愁、訂閱隊列還是接收消息著摔,這些動作都是通過信道完成。因為對于操作系統(tǒng)來說建立和銷毀 TCP 都是非常昂貴的開銷定续,所以引入了信道的概念谍咆,以復用一條 TCP 連接。

Consumer 消息的消費者私股,表示一個從消息隊列中取得消息的客戶端應用程序摹察。

Virtual Host 虛擬主機,表示一批交換器倡鲸、消息隊列和相關對象供嚎。虛擬主機是共享相同的身份認證和加密環(huán)境的獨立服務器域。每個 vhost 本質上就是一個 mini 版的 RabbitMQ 服務器峭状,擁有自己的隊列克滴、交換器、綁定和權限機制宁炫。vhost 是 AMQP 概念的基礎偿曙,必須在連接時指定氮凝,RabbitMQ 默認的 vhost 是 / 羔巢。

Broker 表示消息隊列服務器實體。

AMQP 中的消息路由

AMQP 中消息的路由過程和 Java 開發(fā)者熟悉的 JMS 存在一些差別,AMQP 中增加了 Exchange 和 Binding 的角色竿秆。生產者把消息發(fā)布到 Exchange 上启摄,消息最終到達隊列并被消費者接收,而 Binding 決定交換器的消息應該發(fā)送到那個隊列幽钢。

Exchange 類型

Exchange分發(fā)消息時根據類型的不同分發(fā)策略有區(qū)別歉备,目前共四種類型:direct、fanout翠肘、topic齐饮、headers 较解。headers 匹配 AMQP 消息的 header 而不是路由鍵,此外 headers 交換器和 direct 交換器完全一致龟再,但性能差很多,目前幾乎用不到了尼变,所以直接看另外三種類型:

direct

消息中的路由鍵(routing key)如果和 Binding 中的 binding key 一致利凑, 交換器就將消息發(fā)到對應的隊列中。路由鍵與隊列名完全匹配嫌术,如果一個隊列綁定到交換機要求路由鍵為“dog”哀澈,則只轉發(fā) routing key 標記為“dog”的消息,不會轉發(fā)“dog.puppy”度气,也不會轉發(fā)“dog.guard”等等割按。它是完全匹配、單播的模式蚯嫌。

fanout

每個發(fā)到 fanout 類型交換器的消息都會分到所有綁定的隊列上去哲虾。fanout 交換器不處理路由鍵,只是簡單的將隊列綁定到交換器上择示,每個發(fā)送到交換器的消息都會被轉發(fā)到與該交換器綁定的所有隊列上束凑。很像子網廣播,每臺子網內的主機都獲得了一份復制的消息栅盲。fanout 類型轉發(fā)消息是最快的汪诉。

topic

topic 交換器通過模式匹配分配消息的路由鍵屬性,將路由鍵和某個模式進行匹配谈秫,此時隊列需要綁定到一個模式上扒寄。它將路由鍵和綁定鍵的字符串切分成單詞,這些單詞之間用點隔開拟烫。它同樣也會識別兩個通配符:符號“#”和符號“”该编。#匹配0個或多個單詞,匹配不多不少一個單詞硕淑。

RabbitMQ 安裝

一般來說安裝 RabbitMQ 之前要安裝 Erlang 课竣,可以去Erlang官網下載嘉赎。接著去RabbitMQ官網下載安裝包,之后解壓縮即可于樟。根據操作系統(tǒng)不同官網提供了相應的安裝說明:Windows公条、Debian / Ubuntu、RPM-based Linux迂曲、Mac

如果是Mac 用戶靶橱,個人推薦使用 HomeBrew 來安裝,安裝前要先更新 brew:

brew update

接著安裝 rabbitmq 服務器:

brew install rabbitmq

這樣 RabbitMQ 就安裝好了路捧,安裝過程中會自動其所依賴的 Erlang 关霸。

RabbitMQ 運行和管理 啟動 啟動很簡單,找到安裝后的 RabbitMQ 所在目錄下的 sbin 目錄杰扫,可以看到該目錄下有6個以 rabbitmq 開頭的可執(zhí)行文件谒拴,直接執(zhí)行 rabbitmq-server 即可,下面將 RabbitMQ 的安裝位置以 . 代替涉波,啟動命令就是:

./sbin/rabbitmq-server

啟動正常的話會看到一些啟動過程信息和最后的 completed with 7 plugins英上,這也說明啟動的時候默認加載了7個插件。

后臺啟動

如果想讓 RabbitMQ 以守護程序的方式在后臺運行啤覆,可以在啟動的時候加上 -detached 參數(shù):

./sbin/rabbitmq-server -detached

查詢服務器狀態(tài)

sbin 目錄下有個特別重要的文件叫 rabbitmqctl 苍日,它提供了 RabbitMQ 管理需要的幾乎一站式解決方案,絕大部分的運維命令它都可以提供窗声。 查詢 RabbitMQ 服務器的狀態(tài)信息可以用參數(shù) status :

./sbin/rabbitmqctl status

該命令將輸出服務器的很多信息相恃,比如 RabbitMQ 和 Erlang 的版本、OS 名稱笨觅、內存等等

關閉 RabbitMQ 節(jié)點

我們知道 RabbitMQ 是用 Erlang 語言寫的拦耐,在Erlang 中有兩個概念:節(jié)點和應用程序。節(jié)點就是 Erlang 虛擬機的每個實例见剩,而多個 Erlang 應用程序可以運行在同一個節(jié)點之上杀糯。節(jié)點之間可以進行本地通信(不管他們是不是運行在同一臺服務器之上)。比如一個運行在節(jié)點A上的應用程序可以調用節(jié)點B上應用程序的方法苍苞,就好像調用本地函數(shù)一樣固翰。如果應用程序由于某些原因奔潰,Erlang 節(jié)點會自動嘗試重啟應用程序羹呵。 如果要關閉整個 RabbitMQ 節(jié)點可以用參數(shù) stop :

./sbin/rabbitmqctl stop

它會和本地節(jié)點通信并指示其干凈的關閉骂际,也可以指定關閉不同的節(jié)點,包括遠程節(jié)點冈欢,只需要傳入參數(shù) -n :

./sbin/rabbitmqctl -n rabbit@server.example.com stop

-n node 默認 node 名稱是 rabbit@server 歉铝,如果你的主機名是 server.example.com ,那么 node 名稱就是 rabbit@server.example.com 凑耻。

關閉 RabbitMQ 應用程序

如果只想關閉應用程序太示,同時保持 Erlang 節(jié)點運行則可以用 stopapp: ./sbin/rabbitmqctl stopapp 這個命令在后面要講的集群模式中將會很有用送火。

啟動 RabbitMQ 應用程序

./sbin/rabbitmqctl start_app

重置 RabbitMQ 節(jié)點

./sbin/rabbitmqctl reset

該命令將清除所有的隊列。

查看已聲明的隊列

./sbin/rabbitmqctl list_queues

查看交換器

./sbin/rabbitmqctl list_exchanges

該命令還可以附加參數(shù)先匪,比如列出交換器的名稱、類型弃衍、是否持久化呀非、是否自動刪除:

./sbin/rabbitmqctl list_exchanges name type durable auto_delete

查看綁定

./sbin/rabbitmqctl list_bindings

Java 客戶端訪問

RabbitMQ 支持多種語言訪問,以 Java 為例看下一般使用 RabbitMQ 的步驟镜盯。

maven工程的pom文件中添加依賴

<dependency>

? ?<groupId>com.rabbitmq</groupId>

? ?<artifactId>amqp-client</artifactId>

? ?<version>4.1.0</version>

</dependency>

消息生產者:

package org.study.rabbitmq;

import com.rabbitmq.client.Channel;

import com.rabbitmq.client.Connection;

import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;

import java.util.concurrent.TimeoutException;

public class Producer {

? ?public static void main(String[] args) throws IOException, TimeoutException {

? ? ? ?//創(chuàng)建連接工廠

? ? ? ?ConnectionFactory factory = new ConnectionFactory();

? ? ? ?factory.setUsername("guest");

? ? ? ?factory.setPassword("guest");

? ? ? ?//設置 RabbitMQ 地址

? ? ? ?factory.setHost("localhost");

? ? ? ?//建立到代理服務器到連接

? ? ? ?Connection conn = factory.newConnection();

? ? ? ?//獲得信道

? ? ? ?Channel channel = conn.createChannel();

? ? ? ?//聲明交換器

? ? ? ?String exchangeName = "hello-exchange";

? ? ? ?channel.exchangeDeclare(exchangeName, "direct", true);

? ? ? ?String routingKey = "hola";

? ? ? ?//發(fā)布消息

? ? ? ?byte[] messageBodyBytes = "quit".getBytes();

? ? ? ?channel.basicPublish(exchangeName, routingKey, null, messageBodyBytes);

? ? ? ?channel.close();

? ? ? ?conn.close();

? ?}

}

消息消費者

package org.study.rabbitmq;

import com.rabbitmq.client.*;

import java.io.IOException;

import java.util.concurrent.TimeoutException;

public class Consumer {

? ?public static void main(String[] args) throws IOException, TimeoutException {

? ? ? ?ConnectionFactory factory = new ConnectionFactory();

? ? ? ?factory.setUsername("guest");

? ? ? ?factory.setPassword("guest");

? ? ? ?factory.setHost("localhost");

? ? ? ?//建立到代理服務器到連接

? ? ? ?Connection conn = factory.newConnection();

? ? ? ?//獲得信道

? ? ? ?final Channel channel = conn.createChannel();

? ? ? ?//聲明交換器

? ? ? ?String exchangeName = "hello-exchange";

? ? ? ?channel.exchangeDeclare(exchangeName, "direct", true);

? ? ? ?//聲明隊列

? ? ? ?String queueName = channel.queueDeclare().getQueue();

? ? ? ?String routingKey = "hola";

? ? ? ?//綁定隊列岸裙,通過鍵 hola 將隊列和交換器綁定起來

? ? ? ?channel.queueBind(queueName, exchangeName, routingKey);

? ? ? ?while(true) {

? ? ? ? ? ?//消費消息

? ? ? ? ? ?boolean autoAck = false;

? ? ? ? ? ?String consumerTag = "";

? ? ? ? ? ?channel.basicConsume(queueName, autoAck, consumerTag, new DefaultConsumer(channel) {

? ? ? ? ? ? ? ?@Override

? ? ? ? ? ? ? ?public void handleDelivery(String consumerTag,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Envelope envelope,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? AMQP.BasicProperties properties,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? byte[] body) throws IOException {

? ? ? ? ? ? ? ? ? ?String routingKey = envelope.getRoutingKey();

? ? ? ? ? ? ? ? ? ?String contentType = properties.getContentType();

? ? ? ? ? ? ? ? ? ?System.out.println("消費的路由鍵:" + routingKey);

? ? ? ? ? ? ? ? ? ?System.out.println("消費的內容類型:" + contentType);

? ? ? ? ? ? ? ? ? ?long deliveryTag = envelope.getDeliveryTag();

? ? ? ? ? ? ? ? ? ?//確認消息

? ? ? ? ? ? ? ? ? ?channel.basicAck(deliveryTag, false);

? ? ? ? ? ? ? ? ? ?System.out.println("消費的消息體內容:");

? ? ? ? ? ? ? ? ? ?String bodyStr = new String(body, "UTF-8");

? ? ? ? ? ? ? ? ? ?System.out.println(bodyStr);

? ? ? ? ? ? ? ?}

? ? ? ? ? ?});

? ? ? ?}

? ?}

}

啟動 RabbitMQ 服務器:

./sbin/rabbitmq-server

運行 Consumer 先運行 Consumer ,這樣當生產者發(fā)送消息的時候能在消費者后端看到消息記錄速缆。

運行 Producer 接著運行 Producer ,發(fā)布一條消息降允,在 Consumer 的控制臺能看到接收的消息:

RabbitMQ 集群

RabbitMQ 最優(yōu)秀的功能之一就是內建集群,這個功能設計的目的是允許消費者和生產者在節(jié)點崩潰的情況下繼續(xù)運行艺糜,以及通過添加更多的節(jié)點來線性擴展消息通信吞吐量剧董。RabbitMQ 內部利用 Erlang 提供的分布式通信框架 OTP 來滿足上述需求,使客戶端在失去一個 RabbitMQ 節(jié)點連接的情況下破停,還是能夠重新連接到集群中的任何其他節(jié)點繼續(xù)生產翅楼、消費消息。

RabbitMQ 集群中的一些概念

RabbitMQ 會始終記錄以下四種類型的內部元數(shù)據:

隊列元數(shù)據 包括隊列名稱和它們的屬性真慢,比如是否可持久化毅臊,是否自動刪除

交換器元數(shù)據 交換器名稱、類型黑界、屬性

綁定元數(shù)據 內部是一張表格記錄如何將消息路由到隊列

vhost 元數(shù)據

為 vhost 內部的隊列管嬉、交換器、綁定提供命名空間和安全屬性 在單一節(jié)點中朗鸠,RabbitMQ 會將所有這些信息存儲在內存中蚯撩,同時將標記為可持久化的隊列、交換器烛占、綁定存儲到硬盤上求厕。存到硬盤上可以確保隊列和交換器在節(jié)點重啟后能夠重建。而在集群模式下同樣也提供兩種選擇:存到硬盤上(獨立節(jié)點的默認設置)扰楼,存在內存中呀癣。

如果在集群中創(chuàng)建隊列,集群只會在單個節(jié)點而不是所有節(jié)點上創(chuàng)建完整的隊列信息(元數(shù)據弦赖、狀態(tài)项栏、內容)。結果是只有隊列的所有者節(jié)點知道有關隊列的所有信息蹬竖,因此當集群節(jié)點崩潰時沼沈,該節(jié)點的隊列和綁定就消失了流酬,并且任何匹配該隊列的綁定的新消息也丟失了。還好RabbitMQ 2.6.0之后提供了鏡像隊列以避免集群節(jié)點故障導致的隊列內容不可用列另。

RabbitMQ 集群中可以共享 user芽腾、vhost、exchange等页衙,所有的數(shù)據和狀態(tài)都是必須在所有節(jié)點上復制的摊滔,例外就是上面所說的消息隊列。RabbitMQ 節(jié)點可以動態(tài)的加入到集群中店乐。

當在集群中聲明隊列艰躺、交換器、綁定的時候眨八,這些操作會直到所有集群節(jié)點都成功提交元數(shù)據變更后才返回腺兴。集群中有內存節(jié)點和磁盤節(jié)點兩種類型,內存節(jié)點雖然不寫入磁盤廉侧,但是它的執(zhí)行比磁盤節(jié)點要好页响。內存節(jié)點可以提供出色的性能,磁盤節(jié)點能保障配置信息在節(jié)點重啟后仍然可用段誊,那集群中如何平衡這兩者呢拘泞?

RabbitMQ 只要求集群中至少有一個磁盤節(jié)點,所有其他節(jié)點可以是內存節(jié)點枕扫,當節(jié)點加入火離開集群時陪腌,它們必須要將該變更通知到至少一個磁盤節(jié)點。如果只有一個磁盤節(jié)點烟瞧,剛好又是該節(jié)點崩潰了诗鸭,那么集群可以繼續(xù)路由消息,但不能創(chuàng)建隊列参滴、創(chuàng)建交換器强岸、創(chuàng)建綁定、添加用戶砾赔、更改權限蝌箍、添加或刪除集群節(jié)點。換句話說集群中的唯一磁盤節(jié)點崩潰的話暴心,集群仍然可以運行妓盲,但知道該節(jié)點恢復,否則無法更改任何東西专普。

RabbitMQ 集群配置和啟動 如果是在一臺機器上同時啟動多個 RabbitMQ 節(jié)點來組建集群的話悯衬,只用上面介紹的方式啟動第二、第三個節(jié)點將會因為節(jié)點名稱和端口沖突導致啟動失敗檀夹。所以在每次調用 rabbitmq-server 命令前筋粗,設置環(huán)境變量 RABBITMQNODENAME 和 RABBITMQNODEPORT 來明確指定唯一的節(jié)點名稱和端口策橘。下面的例子端口號從5672開始,每個新啟動的節(jié)點都加1娜亿,節(jié)點也分別命名為testrabbit1丽已、testrabbit2、testrabbit_3买决。

啟動第1個節(jié)點:

RABBITMQ_NODENAME=test_rabbit_1 RABBITMQ_NODE_PORT=5672 ./sbin/rabbitmq-server -detached

啟動第2個節(jié)點:

RABBITMQ_NODENAME=test_rabbit_2 RABBITMQ_NODE_PORT=5673 ./sbin/rabbitmq-server -detached

啟動第2個節(jié)點前建議將 RabbitMQ 默認激活的插件關掉沛婴,否則會存在使用了某個插件的端口號沖突,導致節(jié)點啟動不成功策州。

現(xiàn)在第2個節(jié)點和第1個節(jié)點都是獨立節(jié)點,它們并不知道其他節(jié)點的存在宫仗。集群中除第一個節(jié)點外后加入的節(jié)點需要獲取集群中的元數(shù)據够挂,所以要先停止 Erlang 節(jié)點上運行的 RabbitMQ 應用程序,并重置該節(jié)點元數(shù)據藕夫,再加入并且獲取集群的元數(shù)據孽糖,最后重新啟動 RabbitMQ 應用程序。

停止第2個節(jié)點的應用程序:

./sbin/rabbitmqctl -n test_rabbit_2 stop_app

重置第2個節(jié)點元數(shù)據:

./sbin/rabbitmqctl -n test_rabbit_2 reset

第2節(jié)點加入第1個節(jié)點組成的集群:

./sbin/rabbitmqctl -n test_rabbit_2 join_cluster

test_rabbit_1@localhost

啟動第2個節(jié)點的應用程序

./sbin/rabbitmqctl -n test_rabbit_2 start_app

第3個節(jié)點的配置過程和第2個節(jié)點類似:

RABBITMQ_NODENAME=test_rabbit_3 RABBITMQ_NODE_PORT=5674 ./sbin/rabbitmq-server -detached

./sbin/rabbitmqctl -n test_rabbit_3 stop_app

./sbin/rabbitmqctl -n test_rabbit_3 reset

./sbin/rabbitmqctl -n test_rabbit_3 join_cluster test_rabbit_1@localhost

./sbin/rabbitmqctl -n test_rabbit_3 start_app

RabbitMQ 集群運維

停止某個指定的節(jié)點毅贮,比如停止第2個節(jié)點:

RABBITMQ_NODENAME=test_rabbit_2 ./sbin/rabbitmqctl stop

查看節(jié)點3的集群狀態(tài):

./sbin/rabbitmqctl -n test_rabbit_3 cluster_status

原文鏈接:

http://www.reibang.com/p/79ca08116d57

源網絡办悟,版權歸原創(chuàng)者所有。如有侵權煩請告知滩褥,我們會立即刪除并表示歉意病蛉。

更多技術,歡迎關注下方公眾號

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末瑰煎,一起剝皮案震驚了整個濱河市铺然,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌酒甸,老刑警劉巖魄健,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異插勤,居然都是意外死亡沽瘦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門农尖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來析恋,“玉大人,你說我怎么就攤上這事盛卡÷搪” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵窟扑,是天一觀的道長喇颁。 經常有香客問我漏健,道長,這世上最難降的妖魔是什么橘霎? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任蔫浆,我火速辦了婚禮,結果婚禮上姐叁,老公的妹妹穿的比我還像新娘瓦盛。我一直安慰自己,他們只是感情好外潜,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布原环。 她就那樣靜靜地躺著,像睡著了一般处窥。 火紅的嫁衣襯著肌膚如雪嘱吗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天滔驾,我揣著相機與錄音谒麦,去河邊找鬼。 笑死哆致,一個胖子當著我的面吹牛绕德,可吹牛的內容都是我干的。 我是一名探鬼主播摊阀,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼耻蛇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了胞此?” 一聲冷哼從身側響起城丧,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎豌鹤,沒想到半個月后亡哄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡布疙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年蚊惯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灵临。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡截型,死狀恐怖,靈堂內的尸體忽然破棺而出儒溉,到底是詐尸還是另有隱情宦焦,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站波闹,受9級特大地震影響酝豪,放射性物質發(fā)生泄漏。R本人自食惡果不足惜精堕,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一孵淘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧歹篓,春花似錦瘫证、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至洞斯,卻和暖如春毡庆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背巡扇。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工扭仁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留垮衷,地道東北人厅翔。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像搀突,于是被迫代替她去往敵國和親刀闷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內容

  • 關于消息隊列仰迁,從前年開始斷斷續(xù)續(xù)看了些資料甸昏,想寫很久了,但一直沒騰出空徐许,近來分別碰到幾個朋友聊這塊的技術選型施蜜,是時...
    預流閱讀 584,740評論 51 786
  • 關于消息隊列,從前年開始斷斷續(xù)續(xù)看了些資料雌隅,想寫很久了翻默,但一直沒騰出空,近來分別碰到幾個朋友聊這塊的技術選型恰起,是時...
    Johnson_zx閱讀 1,109評論 0 5
  • 關于消息隊列修械,從前年開始斷斷續(xù)續(xù)看了些資料,想寫很久了检盼,但一直沒騰出空肯污,近來分別碰到幾個朋友聊這塊的技術選型,是時...
    中v中閱讀 1,970評論 0 20
  • 關于消息隊列,從前年開始斷斷續(xù)續(xù)看了些資料蹦渣,想寫很久了哄芜,但一直沒騰出空,近來分別碰到幾個朋友聊這塊的技術選型剂桥,是時...
    Java機械師閱讀 548評論 0 2
  • 什么叫消息隊列忠烛? 消息(Message)是指在應用間傳送的數(shù)據。消息可以非常簡單权逗,比如只包含文本字符串美尸,也可以更復...
    Agile_dev閱讀 2,373評論 0 24