1. 程式人生 > >3分鐘快速入門RocketMQ(下)

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 之間的資料同步方式是同步的。

優點:同步雙寫模式能保證資料不丟失。
缺點

:傳送單個訊息 RT 會略長,效能相比非同步複製低 10% 左右。
刷盤策略:同步刷盤和非同步刷盤(指的是節點自身資料是同步還是非同步儲存)。
同步方式:同步雙寫和非同步複製(指的一組 master 和 slave 之間資料的同步方式)。
注意:要保證資料可靠,需採用同步刷盤和同步雙寫的方式,但效能會較其他方式低。

RocketMQ 單主部署

鑑於是快速入門,我選擇的是第一種單 master 的部署模式。先說明一下我的安裝環境:

  1. Centos 7.2
  2. jdk 1.8
  3. Maven 3.2.x
  4. Git

這裡 git 可用可不用,主要是用來直接下載 github 上的原始碼。也可以選擇自己到
github 上下載,然後上傳到伺服器上。這裡以 git 操作為示例。

  1. 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
  1. 啟動 Name Server
> nohup sh /opt/RocketMQ/bin/mqnamesrv &
//執行 jps 檢視程序
> jps
25913 NamesrvStartup
//檢視日誌確保服務已正常啟動
> tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...
  1. 啟動 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...
  1. 傳送和接收訊息

傳送/接收訊息之前,我們需要告訴客戶端 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...
  1. 關閉服務
> 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 命令。

  1. 執行"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基礎 快速入門spring1 基礎概念

作為流行了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基礎:快速入門spring1:基礎概念

作為流行了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。 簡介