3分鐘快速入門RocketMQ(下)
RocketMQ 叢集部署模式
- 單 master 模式
也就是隻有一個 master 節點,稱不上是叢集,一旦這個 master 節點宕機,那麼整個服務就不可用。
優點:部署簡單。
缺點:存在單點故障。
注意:該模式一般只用來個人學習,或者作為開發環境使用,生產環境不推薦使用該模式。
- 多 master 模式
多個 master 節點組成叢集,單個 master 節點宕機或者重啟對應用來說沒有影響。
優點:所有模式中效能最高。
缺點:單個 master 節點宕機期間,未被消費的訊息在節點恢復之前不可用,訊息的實時性會受到影響。
注意:使用同步刷盤可以保證訊息不丟失,同時每個 Topic 應該均勻分佈在叢集中每個節點,而不是隻在某個節點上,否則,該節點宕機就會對訂閱該 topic 的應用造成影響。
- 多 master 多 slave 非同步複製模式
在多 master 模式的基礎上,每個 master 節點都有至少一個對應的 slave。master 節點可讀可寫,但是 slave 只能讀不能寫,類似於 mysql 的主備模式。
優點: 在 master 宕機時,消費者可以從 slave 讀取訊息,訊息的實時性不會受影響,效能幾乎和多 master 一樣。
缺點:使用非同步複製的同步方式有可能會有訊息丟失的問題。
- 多 master 多 slave 同步雙寫模式
同多 master 多 slave 非同步複製模式類似,區別在於 master 和 slave 之間的資料同步方式是同步的。
優點:同步雙寫模式能保證資料不丟失。
缺點
刷盤策略:同步刷盤和非同步刷盤(指的是節點自身資料是同步還是非同步儲存)。
同步方式:同步雙寫和非同步複製(指的一組 master 和 slave 之間資料的同步方式)。
注意:要保證資料可靠,需採用同步刷盤和同步雙寫的方式,但效能會較其他方式低。
RocketMQ 單主部署
鑑於是快速入門,我選擇的是第一種單 master 的部署模式。先說明一下我的安裝環境:
- Centos 7.2
- jdk 1.8
- Maven 3.2.x
- Git
這裡 git 可用可不用,主要是用來直接下載 github 上的原始碼。也可以選擇自己到
github 上下載,然後上傳到伺服器上。這裡以 git 操作為示例。
- clone 原始碼並用 maven 編譯
> git clone https://github.com/alibaba/RocketMQ.git /opt/RocketMQ
> cd /opt/RocketMQ && mvn -Dmaven.test.skip=true clean package install assembly:assembly -U
> cd target/alibaba-rocketmq-broker/alibaba-rocketmq
- 啟動 Name Server
> nohup sh /opt/RocketMQ/bin/mqnamesrv &
//執行 jps 檢視程序
> jps
25913 NamesrvStartup
//檢視日誌確保服務已正常啟動
> tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...
- 啟動 broker
> nohup sh /opt/RocketMQ/bin/mqbroker -n localhost:9876 &
//執行 jps 檢視程序
> jps
25954 BrokerStartup
//檢視日誌確保服務已正常啟動
> tail -f ~/logs/rocketmqlogs/broker.log
The broker[broker-a, 10.1.54.121:10911] boot success...
- 傳送和接收訊息
傳送/接收訊息之前,我們需要告訴客戶端 NameServer 地址。RocketMQ 提供了多種方式來實現這一目標。為簡單起見,我們使用環境變數 NAMESRV_ADDR。
> export NAMESRV_ADDR=localhost:9876
> sh /opt/RocketMQ/bin/tools.sh com.alibaba.rocketmq.example.quickstart.Producer
SendResult [sendStatus=SEND_OK, msgId= ...
> sh /opt/RocketMQ/bin/tools.sh com.alibaba.rocketmq.example.quickstart.Consumer
ConsumeMessageThread_%d Receive New Messages: [MessageExt...
- 關閉服務
> sh /opt/RocketMQ/bin/mqshutdown broker
The mqbroker(36695) is running...
Send shutdown request to mqbroker(36695) OK
> sh /opt/RocketMQ/bin/mqshutdown namesrv
The mqnamesrv(36664) is running...
Send shutdown request to mqnamesrv(36664) OK
此處可能遇到的問題:
fatal: unable to access 'https://github.com/alibaba/RocketMQ.git/': Could not resolve host: github.com; Unknown error
解決辦法:一般是由於網路原因造成的,執行以下命令:
> ping github.com
確定可以 ping 通之後,再重新執行 git clone 命令。
- 執行"mvn -Dmaven.test.skip=true clean package install assembly:assembly -U"編譯時,可能出現下載相關 jar 包很慢的情況。
這也是由於預設 maven 中央倉庫在國外的原因,可以根據需要在 /home/maven/conf/setting.xml 中的 <mirrors></mirrors> 新增以下內容後重新編譯:
<mirror>
<id>aliyun</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
示例程式碼
- 生產者
public class Producer {
public static void main(String[] args) throws MQClientException, InterruptedException {
//宣告並初始化一個producer
//需要一個producer group名字作為構造方法的引數,這裡為producer1
DefaultMQProducer producer = new DefaultMQProducer("producer1");
//設定NameServer地址,此處應改為實際NameServer地址,多個地址之間用;分隔
//NameServer的地址必須有,但是也可以通過環境變數的方式設定,不一定非得寫死在程式碼裡
producer.setNamesrvAddr("10.1.54.121:9876;10.1.54.122:9876");
//呼叫start()方法啟動一個producer例項
producer.start();
//傳送10條訊息到Topic為TopicTest,tag為TagA,訊息內容為“Hello RocketMQ”拼接上i的值
for (int i = 0; i < 10; i++) {
try {
Message msg = new Message("TopicTest",// topic
"TagA",// tag
("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET)// body
);
//呼叫producer的send()方法傳送訊息
//這裡呼叫的是同步的方式,所以會有返回結果
SendResult sendResult = producer.send(msg);
//列印返回結果,可以看到訊息傳送的狀態以及一些相關資訊
System.out.println(sendResult);
} catch (Exception e) {
e.printStackTrace();
Thread.sleep(1000);
}
}
//傳送完訊息之後,呼叫shutdown()方法關閉producer
producer.shutdown();
}
}
- 消費者
public class Consumer {
public static void main(String[] args) throws InterruptedException, MQClientException {
//宣告並初始化一個consumer
//需要一個consumer group名字作為構造方法的引數,這裡為consumer1
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumer1");
//同樣也要設定NameServer地址
consumer.setNamesrvAddr("10.1.54.121:9876;10.1.54.122:9876");
//這裡設定的是一個consumer的消費策略
//CONSUME_FROM_LAST_OFFSET 預設策略,從該佇列最尾開始消費,即跳過歷史訊息
//CONSUME_FROM_FIRST_OFFSET 從佇列最開始開始消費,即歷史訊息(還儲存在broker的)全部消費一遍
//CONSUME_FROM_TIMESTAMP 從某個時間點開始消費,和setConsumeTimestamp()配合使用,預設是半個小時以前
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
//設定consumer所訂閱的Topic和Tag,*代表全部的Tag
consumer.subscribe("TopicTest", "*");
//設定一個Listener,主要進行訊息的邏輯處理
consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
ConsumeConcurrentlyContext context) {
System.out.println(Thread.currentThread().getName() + " Receive New Messages: " + msgs);
//返回消費狀態
//CONSUME_SUCCESS 消費成功
//RECONSUME_LATER 消費失敗,需要稍後重新消費
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
//呼叫start()方法啟動consumer
consumer.start();
System.out.println("Consumer Started.");
}
}
作者:馮先生的筆記
相關推薦
3分鐘快速入門RocketMQ(下)
RocketMQ 叢集部署模式單 master 模式也就是隻有一個 master 節點,稱不上是叢集,一旦這個 master 節點宕機,那麼整個服務就不可用。優點:部署簡單。缺點:存在單點故障。注意:該模式一般只用來個人學習,或者作為開發環境使用,生產環境不推薦使用該模式。多 master 模式多個 mast
3分鐘快速入門RocketMQ(上)
簡介 用官方的話來說,RcoketMQ 是一款低延遲、高可靠、可伸縮、易於使用的訊息中介軟體,具有以下特性(ps:對於這些特性描述,大家簡單過一眼就即可,深入學習之後自然就明白了): 支援釋出/訂閱(Pub/Sub)和點對點(P2P)訊息模型在一個佇列中可靠的先進先出(FIFO)和嚴格的順序傳遞支援拉(p
Docker快速入門系列(三)——CentOS-7.5下使用yum命令快速安裝Docker CE
《 CentOs-7.5下安裝Docker CE 》 先決條件 在安裝Docker CE前,CentOS 系統版本應該升級到64位版本的 CentOS 7或以上,在這兒
【ASP.NET Core快速入門】(三)準備CentOS和Nginx環境
正常 b- 進入 運行 ins 輸入 最小 我們 -128 基本軟件 VMware虛擬機 centos:http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1708.iso
【ASP.NET Core快速入門】(四)在CentOS上安裝.NET Core運行時、部署到CentOS
ati libunwind serve code api cal 之前 prompt conn 下載.NET Core SDK 下載地址:https://www.microsoft.com/net/download/windows 第一步:Add the dotne
【ASP.NET Core快速入門】(九) RoutingMiddleware介紹以及MVC引入
pre configure onf mvc tin 常用 esp red 引入 前言 前面我們介紹了使用app.Map來配置路由,但是對於一般不是特別大的項目來說,我們不使用Map來進行路由配置。 配置路由 我們首先需要在Startup.cs文件中的Configu
【ASP.NET Core快速入門】(二)部署到IIS
圖片 cor .com servers 訪問 publish img 控制臺 -m 原文:【ASP.NET Core快速入門】(二)部署到IIS配置IIS模塊 ASP.NET Core Module載地址:https://docs.microsoft.com/en-us/
Koa快速入門教程(一)
Koa 是由 Express 原班人馬打造的,致力於成為一個更小、更富有表現力、更健壯的 Web 框架,採用了async和await的方式執行非同步操作。 Koa有v1.0與v2.0兩個版本,隨著node對async和await的支援,Koa2的正式釋出,本文Koa均
NodeJS簡易部落格系統(六)NodeJS入門學習(下)
一、網路程式設計 1、小試牛刀 NodeJS本來的用途是編寫高效能Web伺服器。首先在這裡重複一下官方文件裡的例子,使用NodeJS內建的http模組簡單實現一個HTTP伺服器。 var http = require('http'); http.createSe
C++快速入門---物件(8)
C++快速入門---物件(8) 類是一個模型。當為這個類建立例項的時候,也就是物件本身。 類是物件的一個藍圖、模型、模板。 物件是類的一個具體化的例項、實現。 類(class)就像一幅藍圖,它決定一個物件將是什麼樣的(具備什麼樣的屬性、功能)
.NET Core on K8S快速入門課程(Jessetalk)
01-介紹K8s是什麼 Docker VS VirtualMachine 敏捷地應用建立和部署 持續開發,整合和部署 開發和執行相分離 開發,測試和生產環境的持續 雲和作業系統版本的可移植性,可以執行在 Ubuntu, RHEL, CoreOS, on-prem, Google Co
3.08 EOS智慧合約(下)
1.什麼是李嘉圖合約 李嘉圖合約是一種特殊的結構化文字,主要用作交易中明確雙方的意圖,是做交易之前檢視的要遵循的規則 以後正式合法的合約都要有李嘉圖合約 EOS白皮書中所提到的,所有的交易,都會是基於對憲法同意的基礎之上進行的,這就意味著,EOS啟動後,使用者所有
Scala程式設計快速入門系列(一)
目 錄 一、Scala概述 二、Scala資料型別 三、Scala函式 四、Scala集合 五、Scala伴生物件 六、Scala trait 七、Actor 八、隱式轉換與隱式引數 九、Scala JDBC 由於整理的篇幅較長,所以文章計劃分三次釋出。
【Elasticsearch 5.6.12 原始碼】——【3】啟動過程分析(下)
版權宣告:本文為博主原創,轉載請註明出處! 簡介 本文主要解決以下問題: 1、ES啟動過程中的Node物件都初始化了那些服務? 構造流程 Step 1、建立一個List暫存初始化失敗時需要釋放的資源,並使用臨時的Logger物件輸出開始初始化的日誌。 這裡首先建立了一個List
MiniUI快速入門教程(三)CRUD
CRUD包括:查詢、編輯、新增、刪除等資料操作。 效果圖如下: 一:建立DataGrid 首先,我們建立一個數據表格: <div id="datagrid1" class="mini-datagrid" style="width:800px;height:280px;" url="../da
Spring基礎 快速入門spring(1) 基礎概念
作為流行了10年以上的老將,spring依然精神矍鑠,影響不減。本文將對spring很基礎的概念進行介紹以及為學習spring最核心和基礎的知識作環境搭建的準備。 Spring官網 http://docs.spring.io/ 簡介 Spring
BDF快速入門筆記(一)
快速入門案例 1,HelloWorld http://bsdn.org/projects/dorado7/deploy/sample-center/com.bstek.dorado.sample.Main.d#33800 對映規律->HelloWo
spring cloud快速入門教程(四)路由閘道器Zuul
現在服務也統一註冊管理了,配置也統一管理了,我們就可以瘋狂的開發各項微服務了,是不是還覺得少了點什麼?前端怎麼訪問到相應服務?這就用到路由網關了。 路由閘道器就是整個微服務的統一入口,看看第一張的架構圖,專案的前端做成了動靜分離,靜態檔案、html頁面、css檔案和js檔案
Spring基礎:快速入門spring(1):基礎概念
作為流行了10年以上的老將,spring依然精神矍鑠,影響不減。本文將對spring很基礎的概念進行介紹以及為學習spring最核心和基礎的知識作環境搭建的準備。 Spring官網 簡介 Spring為JAVA企業級應用提供了
Oracle 11g Data Guard 物理備庫快速配置指南(下)
第二部分 作者介紹 作者 Jed Walker 是科羅拉多 Centennial Comcast 媒體中心的資料操作經理(Manager of Databse Operation)。他從1997年開始做 Oracle 資料庫相關工作,是9i, 10g和11g的OCP。 簡介