RocketMQ 基本使用

目录

介绍

RocketMQ是阿里巴巴自研的第三代分布式消息中间件。2016年11月,阿里将RocketMQ捐献给Apache软件基金会,正式成为孵化项目。阿里称会将其打造成顶级项目。

2017年2月20日,RocketMQ正式发布4.0版本,专家称新版本适用于电商领域,金融领域,大数据领域,兼有物联网领域的编程模型。

相关地址

小试牛刀

可通过自己下载源码编译或下载编译好的文件,地址见上。
假设是自己下载源码进行编译

下载源码并进行编译

> git clone https://github.com/apache/incubator-rocketmq.git
> cd incubator-rocketmq
> mvn clean package install -Prelease-all assembly:assembly -U
> cd target/apache-rocketmq-all/

Start Name Server

> nohup sh bin/mqnamesrv &
> tailf nohup.out

Start Broker

> nohup sh bin/mqbroker -n localhost:9876 &
> tailf nohup.out

注意如果这里启动失败,看一下内存是否足够,可以看一下“runbroker.sh”这个文件,对应的修改参数,如下

JAVA_OPT="-server -Xms4g -Xmx4g -Xmn2g -XX:PermSize=128m -XX:MaxPermSize=320m"

测试发送与接收

 > export NAMESRV_ADDR=localhost:9876
 > sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer

 > sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer

关闭服务

> sh bin/mqshutdown broker
> sh bin/mqshutdown namesrv

在Java项目中的使用

pom.xml

<properties>
    <rocketmq_ver>4.0.0-incubating</rocketmq_ver>
</properties>
<dependencies>
<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-client</artifactId>
    <version>${rocketmq_ver}</version>
</dependency>
</dependencies>

生产者

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;

public class Producer {

    public static void main(String[] args) {
        DefaultMQProducer producer = new DefaultMQProducer("Producer");
        producer.setNamesrvAddr(Config.ADDR);
        try {
            producer.start();

            Message msg = new Message("PushTopic", "push", "1", "Just for push1.".getBytes());

            SendResult result = producer.send(msg);
            System.out.println("id:" + result.getMsgId() + " result:" + result.getSendStatus());

            msg = new Message("PushTopic", "push", "2", "Just for push2.".getBytes());

            result = producer.send(msg);
            System.out.println("id:" + result.getMsgId() + " result:" + result.getSendStatus());

            msg = new Message("PushTopic", "pull", "1", "Just for pull.".getBytes());

            result = producer.send(msg);
            System.out.println("id:" + result.getMsgId() + " result:" + result.getSendStatus());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            producer.shutdown();
        }
    }
}

消费者

import java.util.List;

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageExt;

public class Consumer {
    public static void main(String[] args) {
        DefaultMQPushConsumer consumer =
                new DefaultMQPushConsumer("PushConsumer");
        consumer.setNamesrvAddr(Config.ADDR);
        try {
            //订阅PushTopic下Tag为push的消息
            consumer.subscribe("PushTopic", "push");
           /**
            * 设置Consumer第一次启动是从队列头部开始消费还是队列尾部开始消费<br>
            * 如果非第一次启动,那么按照上次消费的位置继续消费
            */
            consumer.setConsumeFromWhere(
                    ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
            consumer.registerMessageListener(
                    new MessageListenerConcurrently() {
                        public ConsumeConcurrentlyStatus consumeMessage(
                                List<MessageExt> msgs,
                                ConsumeConcurrentlyContext Context) {
                            for (Message msg : msgs) {
                                System.out.println(new String(msg.getBody()) + ":" + msg.toString());
                            }
                            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
                        }
                    }
            );
            consumer.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

结果

id:C0A801663174723279CF77AF3C6E0000 result:SEND_OK
id:C0A801663174723279CF77AF3C7B0001 result:SEND_OK
id:C0A801663174723279CF77AF3C7D0002 result:SEND_OK
Just for push1.:MessageExt [queueId=2, storeSize=184, queueOffset=14, sysFlag=0, bornTimestamp=1490348772974, bornHost=/192.168.127.1:53238, storeTimestamp=1490348775615, storeHost=/192.168.127.128:10911, msgId=C0A87F8000002A9F000000000002EDE8, commitLogOffset=191976, bodyCRC=1396413800, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message [topic=PushTopic, flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=15, KEYS=1, CONSUME_START_TIME=1490348782880, UNIQ_KEY=C0A801663174723279CF77AF3C6E0000, WAIT=true, TAGS=push}, body=15]]
Just for push2.:MessageExt [queueId=3, storeSize=184, queueOffset=14, sysFlag=0, bornTimestamp=1490348772987, bornHost=/192.168.127.1:53238, storeTimestamp=1490348775620, storeHost=/192.168.127.128:10911, msgId=C0A87F8000002A9F000000000002EEA0, commitLogOffset=192160, bodyCRC=2014758571, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message [topic=PushTopic, flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=15, KEYS=2, CONSUME_START_TIME=1490348782882, UNIQ_KEY=C0A801663174723279CF77AF3C7B0001, WAIT=true, TAGS=push}, body=15]]

参考

RocketMQ 是阿里云开源的一款基于发布/订阅模式的消息中间件,它提供了一种高效、可靠的异步通信机制,帮助企业构建高可用、可伸缩的应用系统。以下是对 RocketMQ 使用基本步骤及关键点的介绍: ### 安装部署 1. **下载安装**:访问 RocketMQ 的官方GitHub仓库或其官方网站获取最新版本的安装包或源码,进行编译安装。 - 对于 Windows 用户,可以选择使用预打包的二进制文件; - 对于 Linux 或 MacOS 用户,则需要从源码构建安装环境。 2. **配置**:在安装目录下创建并编辑配置文件 `config.ini`,配置包括服务端口、日志路径、命名服务地址等重要信息。配置文件通常包含了所有必要的参数设置,确保 RocketMQ 正常运行。 ### 集群搭建 对于生产环境,通常会部署多个实例形成集群,提高系统的稳定性和可用性。 1. **启动服务**:根据配置文件启动主节点(Broker)、NameServer 和其他辅助组件如监控服务。 2. **管理节点**:通过 Web 管理界面或命令行工具管理节点间的连接状态、消息队列的分配、消费组的创建等操作。 ### 消息发送 消息可以按照特定的主题进行分类,并由不同的消费者进行接收处理。 1. **生产者**:编写发送消息的代码,指定主题、消息内容以及是否需要持久化等属性。生产者通常使用 Java API 进行消息发送。 2. **消费者**:创建消费组,加入到特定的主题消费,监听并处理接收到的消息。消费者也可以选择不同的消费策略,例如轮询、顺序等。 ### 日志与监控 利用配套的日志系统记录运行过程中的详细信息,同时集成监控工具,对性能指标进行实时监控和报警,保障系统稳定运行。 1. **日志分析**:查看和分析日志文件,了解应用和系统的运行状态。 2. **性能监控**:监控系统性能指标(如吞吐量、延迟、资源占用等),及时发现瓶颈和异常。 ### 应用场景示例 1. **微服务间通讯**:用于不同微服务之间的异步解耦,提高系统响应速度。 2. **数据同步**:将数据从旧系统迁移到新系统,或在不同数据库之间进行数据复制。 3. **批量任务触发**:触发后台定时任务或复杂的业务流程执行。 4. **削峰填谷**:应对突发流量高峰,减轻服务器压力。 ### 相关问题: 1. **如何优化 RocketMQ 性能?** 2. **如何解决 RocketMQ 消息丢失的问题?** 3. **如何配置 RocketMQ 的高可用集群?** 以上是对 RocketMQ 基本使用的一些概述,实际应用中还需要结合项目需求和技术文档进一步深入学习和实践。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程点滴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值