Rocketmq的消费模式、Rocketmq的生产模式、Windows下Rocketmq的安装(代码演示)

61 阅读8分钟

一、Rocketmq的安装与使用

概述:

RocketMQ基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。同时,广泛应用于多个领域,包括异步通信解耦、企业解决方案、金融支付、电信、电子商务、快递物流、广告营销、社交、即时通信、移动应用、手游、视频、物联网、车联网等。

二、安装

需要jdk1.8 jdk安装不能是中文,不能有空格

tomcat配置也是不能有空格的,不能再program files文件夹里面

否则:Broker(需要jdk) NameServer(需要tomcat)不能正常启动

第一步官网下载

点击下载-官网 | RocketMQ (apache.org)

第二步配置环境变量

a)系统变量

rocketmq添加系统变量.png

b)path路径

添加一个环境变量.png

c)查看jdk路径是否有空格,默认是在progman Files里面,有空格需要进行移动(重要)

javahome不能有空格.png

d)tomcat不能有空格,两处地方

  1. CATALINA_HOME
  2. CLASSPATH

tomcat配置.png

第三部,配置完成之后进行测试

三、NameServer说明与启动

NameServer是一个Broker与Topic路由的注册中心,支持Broker的动态注册与发现。

Broker管理:接受Broker集群的注册信息并且保存下来作为路由信息的基本数据;提供心跳检测 机制,检查Broker是否还存活。

路由信息管理:每个NameServer中都保存着Broker集群的整个路由信息和用于客户端查询的队列 信息。Producer和Conumser通过NameServer可以获取整个Broker集群的路由信息,从而进行消 息的投递和消费。

相对来说,nameserver的稳定性非常高。原因有二: 1. nameserver互相独立,彼此没有通信关系,单台nameserver挂掉,不影响其他nameserver,即使全部挂掉,也不影响业务系统使用。无状态 2. nameserver不会有频繁的读写,所以性能开销非常小,稳定性很高。

start mqbroker -n 127.0.0.1:9876

mqbroker配置.png

四、Broker说明与启动

Broker充当着消息中转角色,负责存储消息、转发消息。Broker在RocketMQ系统中负责接收并存储从 生产者发送来的消息,同时为消费者的拉取请求作准备。Broker同时也存储着消息相关的元数据,包括 消费者组消费进度偏移offset、主题、队列等。

​ start mqnamesrv

mqnamesrv配置.png

4,1 与NameServer的关系

  • 连接
    • 单个broker和所有nameserver保持长连接
  • 心跳
    • 心跳间隔:每隔30秒(此时间无法更改)向所有nameserver发送心跳,心跳包含了自身的topic配置信息。
    • 心跳超时:nameserver每隔10秒钟(此时间无法更改),扫描所有还存活的broker连接,若某个连接2分钟内(当前时间与最后更新时间差值超过2分钟,此时间无法更改)没有发送心跳数据,则断开连接。
  • 断开
    • 时机:broker挂掉;心跳超时导致nameserver主动关闭连接
    • 动作:一旦连接断开,nameserver会立即感知,更新topic与队列的对应关系,但不会通知生产者和消费者

4.2. 负载均衡

  • 一个topic分布在多个broker上,一个broker可以配置多个topic,它们是多对多的关系。
  • 如果某个topic消息量很大,应该给它多配置几个队列?这什么意思,并且尽量多分布在不同broker上,减轻某个broker的压力。
  • topic消息量都比较均匀的情况下,如果某个broker上的队列越多,则该broker压力越大。

五、Rocketmq的使用

  • 通过@Test进行展示测试结果

1.安装依赖

<parent>
        <artifactId>spring-boot-starter-parent</artifactId>
        <groupId>org.springframework.boot</groupId>
        <version>2.7.5</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
<!--        实现对rocketmq的自动装配-->
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-spring-boot-starter</artifactId>
            <version>2.1.1</version>
        </dependency>

        <!-- 单元测试 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

2.服务执行顺序

  1. 开始nameserver

    start mqnamesrv

  2. 开启Broker

start mqbroker -n 127.0.0.1:9876

img

3. 创建微服务

创建两个微服务,一个user微服务用来生产消息,一个order微服务用来消费消息

  • 相关配置:
# rocketmq 配置项,对应 RocketMQProperties 配置类
rocketmq:
  name-server: 101.133.227.13:9876 # RocketMQ Namesrv
  # Producer 配置项
  producer:
    group: erbadagang-producer-group # 生产者分组
    send-message-timeout: 3000 # 发送消息超时时间,单位:毫秒。默认为 3000 。
    compress-message-body-threshold: 4096 # 消息压缩阀值,当消息体的大小超过该阀值后,进行消息压缩。默认为 4 * 1024B
    max-message-size: 4194304 # 消息体的最大允许大小。。默认为 4 * 1024 * 1024B
    retry-times-when-send-failed: 2 # 同步发送消息时,失败重试次数。默认为 2 次。
    retry-times-when-send-async-failed: 2 # 异步发送消息时,失败重试次数。默认为 2 次。
    retry-next-server: false # 发送消息给 Broker 时,如果发送失败,是否重试另外一台 Broker 。默认为 false
    access-key: # Access Key ,可阅读 https://github.com/apache/rocketmq/blob/master/docs/cn/acl/user_guide.md 文档
    secret-key: # Secret Key
    enable-msg-trace: true # 是否开启消息轨迹功能。默认为 true 开启。可阅读 https://github.com/apache/rocketmq/blob/master/docs/cn/msg_trace/user_guide.md 文档
    customized-trace-topic: RMQ_SYS_TRACE_TOPIC # 自定义消息轨迹的 Topic 。默认为 RMQ_SYS_TRACE_TOPIC 。
  # Consumer 配置项
  consumer:
    listeners: 
    # 配置某个消费分组,是否监听指定 Topic 。结构为 Map<消费者分组, <Topic, Boolean>> 。默认情况下,不配置表示监听。
      erbadagang-consumer-group:
        topic1: false # 关闭 test-consumer-group 对 topic1 的监听消费
  • 如果没有其他配置要求,使用默认配置即可,生产消费都这样配置即可

生产组名.png

4. 接收消息

  • 注意需要添加这两个注解

@RocketMQMessageListener

@Component

代码示例

@Component
@RocketMQMessageListener(
        topic = "主题",consumerGroup = "消费者组名 自定义"
)
public class MQlistener implements RocketMQListener<String> {
    @Override
    public void onMessage(String msg) {
        System.out.println("收到消息:"+msg);
    }
}

5.mq发送类型

需要注入RocketMQTemplate

@Autowired
RocketMQTemplate mq;

六、生产消息类型与消费模型与测试

常用的生产消息类型:可靠同步发送、可靠异步发送、单向发送、顺序发送、延迟发送

常用的消费模型分为:集群消费(默认)、广播消费(类似于吃自助餐,每个人花的钱是一样的,吃的东西也是一样的;所有消费者收到的消息是一样的)、顺序消费(顾名思义)

a)发送消息类型

1. 可靠同步发送

  • 同步发送是指消息发送方发出数据后,会在收到接收方发回响应之后才会发送下一个数据包的通讯方式。
  • 此种方式应用场景非常广泛,例如重要通知邮件、报名短信通知、营销短信系统等。
        // 该方式发送的消息是无序的,默认有4个队列,分别进行存储所以是无序的
        for (int i = 0; i < 10; i++) {
            Message<String> msg = MessageBuilder.withPayload("你好" + i).build();
            // 主题、消息(参数) order关联接受消息的topic
            SendResult result = mq.syncSend("order", msg);
            System.out.println(result);
        }

1.1 接受消息演示(以默认的集群消费进行演示)

  • OrderMQListener 类实现RocketMQListener接口,设置返回类型为String
  • topic 监听的消息主题 必须参数(重要)
  • consumerGroup 消费者组 组名 自定义 作用 :集群消费时同一个组名才能集群(重要)
package com.zking.mq;

import org.apache.rocketmq.spring.annotation.ConsumeMode;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component;
@Component
@RocketMQMessageListener(
        topic = "order",
        consumerGroup = "orderGroup",
)
public class OrderMQListener implements RocketMQListener<String> {
    @Override
    // 当接受到消息,就会自动调用执行
    // 这里可以注入业务信息 来完成要做的事情
    public void onMessage(String s) {
        System.out.println("订单接受到消息"+s);
    }
}

可靠同步发送是无序的.png

2.可靠异步发送

  • 异步发送是指发送方发出数据后,不等接收方发回响应,接着发送下一个数据包的通讯方式。发送方通过回调接口接收服务器响应,并对响应结果进行处理。
    @Test
    public void 可靠异步发送() throws InterruptedException {
        for (int i = 0; i < 10; i++) {
            Message<String> msg = MessageBuilder.withPayload("你好" + i).build();
            // 主题、消息(参数)
            mq.asyncSend("order", msg, new SendCallback() {
                @Override
                public void onSuccess(SendResult sendResult) {
                    System.out.println("发送成功"+sendResult);
                }

                @Override
                public void onException(Throwable throwable) {
                    System.out.println("发送失败");
                }
            });
            Thread.sleep(1000);
        }
    }

2.1 接受消息演示

异步生产者发送消息.png

消费者接受消息.png

3.单向发送

  • 单向发送是指发送方只负责发送消息,不等待服务器回应,且没有回调函数触发。即只发送请求而不管响应。

  • 适用于某些耗时非常短,但对可靠性要求并不高的场景,例如日志收集。

    @Test
    public void 单项发送() {
        this.mq.sendOneWay("test-topic","单向发送测试");
    }

4.顺序发送

    @Test
    public void 顺序消费() throws InterruptedException {
        for (int i = 1005; i < 1010; i++) {
            Message<String> msg1 = MessageBuilder.withPayload("订单" + i + "创建").build();
            SendResult result = mq.syncSendOrderly("order", msg1, "订单" + i);
            System.out.println(result);

            Message<String> msg2 = MessageBuilder.withPayload("订单" + i + "修改").build();
            SendResult result1 = mq.syncSendOrderly("order", msg2, "订单" + i);
            System.out.println(result1);

            Thread.sleep(1000);
        }
    }

4.1 接受消息演示

  • 发送消息

发送消息-顺序消费.png

  • 接受消息(先创建再修改,是按顺序的,不会出现乱序现象)

顺序消费.png

5.延迟发送

  • mq.syncSend("sms",msg,1000,3); 解释
  • sms:: 关系到哪儿个消费者;
  • msg :传入的参数
  • 1000:超时时间
  • 3:延迟发送等级

延迟发送等级表,最多只能延迟两个小时(1-18级对应表)

1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h

    @Test
    public void 延迟消息() {
        Long start = System.currentTimeMillis();
        Message<Long> msg = MessageBuilder.withPayload(start).build();
        // timeout超市时间,如果达到改时间就放弃发送消息
        mq.syncSend("sms",msg,1000,3);
    }

5.1 接受消息演示

@Component
@RocketMQMessageListener(
        topic = "sms",consumerGroup = "smsGroup"
)
public class SmsMQListener implements RocketMQListener<Long> {
    @Override
    public void onMessage(Long s) {
        long time = System.currentTimeMillis();

        System.out.println("延迟消息 - 发送到执行时长为"+(time- s)/1000);
    }
}

延迟发送结果.png

1.集群消费

  • topic :监听的消息主题 必须参数

  • consumerGroup: 消费者组 组名 自定义 作用 :集群消费时同一个组名才能集群

  • messageModel:消息模型,默认为集群

@Component
@RocketMQMessageListener(
        topic = "order",
        consumerGroup = "orderGroup",
)

2.广播消费

@Component
@RocketMQMessageListener(
        topic = "order",
        consumerGroup = "orderGroup",
        messageModel = MessageModel.BROADCASTING  // 广播消费
)

3.顺序消费

@Component
@RocketMQMessageListener(
        topic = "order",
        consumerGroup = "orderGroup",
        consumeMode = ConsumeMode.ORDERLY  // 顺序消费
)

常用的生成与消费解释与测试就说到这里啦,散花!