RocketMQ(1) 环境搭建、基础运行

MQ 全称为 Message Queue,是一种应用程序程序对应用程序的通信方式,应用程序通过读写出入队列的消息来通信,而无需专用连接来连接它们。消息传递指的是程序之间通过在消息中发送数据来进行通信,而不是通过直接调用来通信,直接调用通常用于诸如远程过程调用的技术。


主流 MQ 对比

主流 MQ 有 Kafka、RocketMQ、RabbitMQ 等

Kafka

Kafka 是 Apache 的一个子项目,使用 Scala 实现的一个高性能分布式 publish/subscribe 消息队列系统,主要特点:

  • 快速持久化:通过磁盘顺序读写与零拷贝机制,可以在 O(1) 的系统开销下进行消息持久化
  • 高吞吐:在一台普通的服务器上可以达到 10W/S 的吞吐量
  • 高堆积:支持 Topic 下消费者长时间离线,消息堆积量大
  • 完全的分布式系统,Broker、Producer、Consumer 都原生支持分布式,依赖 ZK 实现负载均衡
  • 支持 Hadoop 数据并行加载;对于像 Hadoop 一样的日志数据和离线分析系统,但又要求实时处理的限制,是一个可行的解决方案

RocketMQ

前身是 Metaq,3.0 版本更名为 RocketMQ,alibaba 出品,现交 Apache 孵化。RocketMQ 是一款分布式、队列模型的消息中间件,特点:

  • 能够保证严格的消息顺序
  • 提供丰富的消息拉取模式
  • 高效的订阅者水平扩展能力
  • 实时的消息订阅机制
  • 支持事务消息
  • 亿级消息堆积能力

RabbitMQ

使用 Erlang 编写的一个开源的消息队列,本身支持:AMQP、XMPP、SMTP、STOMP 等协议,是一个重量级消息队列,更适合企业级开发。同时也实现的 broker 架构,生产者不会讲消息直接发送给队列,消息在发送给客户端时,现在中心队列排队。
对路由、负载均衡、数据持久化有很好的支持。


RocketMQ 单机环境搭建

版本

  • JDK 版本:1.8+
  • RocketMQ:4.4.0
  • Maven:3.x
  • os:CentOS 6.5 x64

单机版环境搭建

  1. 解压 RocketMQ 4.4.0 到指定文件夹,并修改解压后的文件夹名称
unzip rocketmq-all-4.4.0-bin-release.zip -d /usr/local/include/mq/
cd /usr/local/include/mq/
mv rocketmq-all-4.4.0-bin-release/ rocketmq
  1. 创建日志、数据文件夹
mkdir logs store && cd store
mkdir commitlog consumequeue index
  1. 修改 conf/2m-2s-async/broker-a.properties
# 所属集群名称
brokerClusterName=rocketmq-cluster
# brijer 名称,不同的配置文件,名称不一样
brokerName=broker-a
# 0 表示 master,大于0表示 salve
brokerId=0
# nameServer 地址,分号分割
namesrvAddr=192.168.52.200:9876
# 在发送消息时,自动创建服务器不存在的 Topic,默认创建的队列数
defaultTopicQueueNums=4
# 是否允许 Broker 自动创建 Topic,生产环境需关闭
autoCreateTopicEnable=true
# 是否允许 Broker 自动创建订阅组,生产环境需关闭
autoCreateSubscriptionGroup=true
# Broker 对外服务的监听端口
listenPort=10911
# 删除文件的时间点,默认是凌晨4点
deleteWhen=04
# 文件保留时间,默认 48 小时
fileReservedTime=48
# commitLog 每个文件的大小,默认 1G
mapedFileSizeCommitLog=1073741824
# consumeQueue 每个文件默认存 30W 条,根据需求调整
mapedFileSizeConsumeQueue=300000
# 检测屋里文件磁盘空间
diskMaxUsedSpaceRatio=88
# 存储路径
storePathRootDir=/usr/local/include/mq/rocketmq/store
# commitLog 存储路径
storePathCommitLog=/usr/local/include/mq/rocketmq/store/commitlog
# 消息队列存储路径
storePathConsumeQueue=/usr/local/include/mq/rocketmq/store/consumequeue
# 消息索引存储路径
storePathIndex=/usr/local/include/mq/rocketmq/store/index
# checkpoint 文件存储路径
storeCheckPoint=/usr/local/include/mq/rocketmq/store/checkpoint
# abort 文件存储路径
abortFile=/usr/local/include/mq/rocketmq/store/abort
# 限制消息大小
maxMessageSize=65535
# broker 角色
# 1、ASYNC_MASTER:异步复制的 Master
# 2、SYNC_MASTER:同步双鞋 Master
# 3、SLAVE:从
brokerRole=ASYNC_MASTER
# 刷盘方式
# 1、ASYNC_FLUSH:异步刷盘
# 2、SYNC_FLUSH:同步刷盘
flushDiskType=ASYNC_FLUSH


#checkTransactionMessageEnable=false

# 发送消息的线程数量
# sendMessageThreadPoolNums=128
# 拉取消息线程池数量
# pullMessageThreadPoolNums=128
  1. 修改 conf 下所有的 xml 文件,将 xml 中的 ${user.home} 修改为 rocketmq 目录
sed -i 's#${user.home}#/usr/local/include/mq/rocketmq#g' *.xml
  1. 修改 bin/runbroker.shbin/runserver.sh 中的 JVM 参数

    runbroker.sh

    runserver.sh

  2. 启动 broker

nohup sh ./bin/mqnamesrv &
  1. 使用 conf/2m-2s-async/broker-a.properties 配置文件,启动 broker
nohup sh ./bin/mqbroker -c /usr/local/include/mq/rocketmq/conf/2m-2s-async/broker-a.properties > /dev/null 2>&1 &
  1. 使用 jps 查看启动结果


    jps

RocketMQ 控制台搭建

下载地址:https://github.com/apache/rocketmq-externals.git master 分支,拉取到本地,使用 IDE 打开,修改:rocketmq-externals-master\rocketmq-console\src\main\resources\application.properties 配置文件,指定 RocketMQ nameserver 地址(默认端口为 9876):

rocketmq.config.namesrvAddr=192.168.52.200:9876

访问 http://localhost:8080

rocketmq-console


消息的生产、消费

一个简单的消息生产者

使用 SpringBoot 搭建一个简单的消息生产者:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.apache.rocketmq</groupId>
        <artifactId>rocketmq-client</artifactId>
        <version>${rocketmq.version}</version>
    </dependency>

</dependencies>
public class Producer {

    public static void main(String[] args) throws MQClientException, UnsupportedEncodingException, RemotingException, InterruptedException, MQBrokerException {
        // 1、创建 DefaultMQProducer
        DefaultMQProducer producer = new DefaultMQProducer("demo-producer");

        // 2、设置 name server
        producer.setNamesrvAddr("192.168.52.200:9876");

        // 3、开启 producer
        producer.start();

        // 4、创建消息
        Message message = new Message("TOPIC_DEMO", "TAG_A", "KEYS_!", "HELLO!".getBytes(RemotingHelper.DEFAULT_CHARSET));

        // 5、发送消息
        SendResult result = producer.send(message);
        System.out.println(result);
        // 6、关闭 producer
        producer.shutdown();
    }
}

运行验证控制台打印信息:

SendResult [sendStatus=SEND_OK, msgId=C0A80067617C18B4AAC26A932C790000, offsetMsgId=C0A834C800002A9F0000000000000000, messageQueue=MessageQueue [topic=TOPIC_DEMO, brokerName=broker-a, queueId=0], queueOffset=0]
16:40:30.148 [NettyClientSelector_1] INFO RocketmqRemoting - closeChannel: close the connection to remote address[192.168.52.200:10909] result: true
16:40:30.152 [NettyClientSelector_1] INFO RocketmqRemoting - closeChannel: close the connection to remote address[192.168.52.200:9876] result: true
16:40:30.152 [NettyClientSelector_1] INFO RocketmqRemoting - closeChannel: close the connection to remote address[192.168.52.200:10911] result: true

查看 rocketmq-console 中 消息 选项卡,并选择主题为 TOPIC_DEMO

TOPIC_DEMO

点击 MESSAGE DETAIL 查看消息具体内容:

message detail

一个简单的消息消费者

依赖与生产者一致

public class Consumer {

    public static void main(String[] args) throws MQClientException {
        // 1、创建 DefaultMQPushConsumer
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("demo-consumer");

        // 2、设置 name server
        consumer.setNamesrvAddr("192.168.52.200:9876");

        // 设置消息拉取最大数
        consumer.setConsumeMessageBatchMaxSize(2);

        // 3、设置 subscribe
        consumer.subscribe("TOPIC_DEMO", // 要消费的主题
                "*" // 过滤规则
        );

        // 4、创建消息监听
        consumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
                // 5、获取消息信息
                for (MessageExt msg : list) {
                    // 获取主题
                    String topic = msg.getTopic();
                    // 获取标签
                    String tags = msg.getTags();
                    // 获取信息
                    try {
                        String result = new String(msg.getBody(), RemotingHelper.DEFAULT_CHARSET);
                        System.out.println("Consumer 消费信息:topic:" + topic+ ",tags:" + tags + ",消息体:" + result);
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                        return ConsumeConcurrentlyStatus.RECONSUME_LATER;
                    }
                }
                // 6、返回消息读取状态
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });

        // 7、启动消费者(启动后会阻塞)
        consumer.start();
    }
}

运行消费者,查看控制台打印信息:

Consumer 消费信息:topic:TOPIC_DEMO,tags:TAG_A,消息体:HELLO!
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,511评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,495评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,595评论 0 225
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,558评论 0 190
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,715评论 3 270
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,672评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,112评论 2 291
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,837评论 0 181
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,417评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,928评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,316评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,773评论 2 234
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,253评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,827评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,440评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,523评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,583评论 2 249

推荐阅读更多精彩内容