8. RocketMQ快速入门
RocketMQ提供了发送多种发送消息的模式,例如同步消息,异步消息,顺序消息,延迟消息,事务消息等,我们一一学习
8.1 消息发送和监听的流程
我们先搞清楚消息发送和监听的流程,然后我们在开始敲代码
8.1.1 消息生产者
1.创建消息生产者producer,并制定生产者组名
2.指定Nameserver地址
3.启动producer
4.创建消息对象,指定主题Topic、Tag和消息体等
5.发送消息
6.关闭生产者producer
8.1.2 消息消费者
1.创建消费者consumer,制定消费者组名
2.指定Nameserver地址
3.创建监听订阅主题Topic和Tag等
4.处理消息
5.启动消费者consumer
8.2 搭建Rocketmq-demo
8.2.1 加入依赖
<dependencies>
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.9.2</version>
<!--docker的用下面这个版本--><version>4.4.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency></dependencies>
8.2.2 编写生产者
_/** * 测试生产者 * * @throws Exception */_
@Testpublic void testProducer() throws Exception {
_// 创建默认的生产者 _
DefaultMQProducer producer = new DefaultMQProducer("test-group");
_// 设置nameServer地址 _
producer.setNamesrvAddr("localhost:9876");
_// 启动实例 _
producer.start();
for (int i = 0; i < 10; i++) {
_// 创建消息 _
_// 第一个参数:主题的名字 _
_// 第二个参数:消息内容 _
Message msg = new Message("TopicTest", ("Hello RocketMQ " + i).getBytes());
SendResult send = producer.send(msg);
System._out_.println(send);
}
_// 关闭实例 _producer.shutdown();
}
8.2.3 编写消费者
_/** * 测试消费者 * * @throws Exception */
_ @Test public void testConsumer() throws Exception {
_// 创建默认消费者组
_ DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumer-group");
_// 设置nameServer地址
_ consumer.setNamesrvAddr("localhost:9876");
_// 订阅一个主题来消费 *表示没有过滤参数 表示这个主题的任何消息 _consumer.subscribe("TopicTest", "*");
_// 注册一个消费监听 _
_MessageListenerConcurrently 是多线程消费,默认20个线程,可以参看consumer.setConsumeThreadMax() _ consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
System._out_.println(Thread._currentThread_().getName() + "----" + msgs);
_// 返回消费的状态 如果是CONSUME_SUCCESS 则成功,若为RECONSUME_LATER则该条消息会被重回队列,重新被投递 _
_// 重试的时间为messageDelayLevel = "1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h _
_// 也就是第一次1s 第二次5s 第三次10s .... 如果重试了18次 那么这个消息就会被终止发送给消费者_
_// _
_return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; _ return ConsumeConcurrentlyStatus._RECONSUME_LATER_;
}
});
_// 这个start一定要写在registerMessageListener下面
_ consumer.start();
System._in_.read();
}
8.2.4 测试
启动生产者和消费者进行测试
9. 消费模式
MQ的消费模式可以大致分为两种,一种是推Push,一种是拉Pull。
Push是服务端【MQ】主动推送消息给客户端,优点是及时性较好,但如果客户端没有做好流控,一旦服务端推送大量消息到客户端时,就会导致客户端消息堆积甚至崩溃。
Pull是客户端需要主动到服务端取数据,优点是客户端可以依据自己的消费能力进行消费,但拉取的频率也需要用户自己控制,拉取频繁容易造成服务端和客户端的压力,拉取间隔长又容易造成消费不及时。
Push模式也是基于pull模式的,只能客户端内部封装了api,一般场景下,上游消息生产量小或者均速的时候,选择push模式。在特殊场景下,例如电商大促,抢优惠券等场景可以选择pull模式
10. RocketMQ发送同步消息
上面的快速入门就是发送同步消息,发送过后会有一个返回值,也就是mq服务器接收到消息后返回的一个确认,这种方式非常安全,但是性能上并没有这么高,而且在mq集群中,也是要等到所有的从机都复制了消息以后才会返回,所以针对重要的消息可以选择这种方式
11. RocketMQ发送异步消息
异步消息通常用在对响应时间敏感的业务场景,即发送端不能容忍长时间地等待Broker的响应。发送完以后会有一个异步消息通知
11.1 异步消息生产者
@Testpublic void testAsyncProducer() throws Exception {
_// 创建默认的生产者 _
DefaultMQProducer producer = new DefaultMQProducer("test-group");
_// 设置nameServer地址 _
producer.setNamesrvAddr("localhost:9876");
_// 启动实例 _producer.start();
Message msg = new Message("TopicTest", ("异步消息").getBytes());** **
**producer.send(msg, new SendCallback() {
**
**@Override **
**public void onSuccess(SendResult sendResult) {
**