RocketMQ4.3.x入门

RocketMQ控制台安装教程 RocketMQ安装教程一文中,详细探讨了如何搭建RocketMQ,这一节来搭建RocketMQ控制台,RocketMQ的可视化管理界面。 一、下载代码 # 方式一、git下载,执行如下命令 git clone https://github.com/apache/rocketmq-externals.git # 方式二、直接下载,访问如下地址即可 https://github.co... 阅读详情

目录

1.RocketMQ整体介绍

2.概念模型

3.源码包编译与结构说明

2.环境搭建

3.控制台部署与使用

4.QuickStart-生产者使用

5.QuickStart-消费者使用

6.四种集群环境构建详解

7.主从模式集群环境构建与测试(故障演练)

8.RocketMQ生产者核心参数详解

9.生产者同步发送消息和异步发送消息

10.生产者消息的返回状态

11.延迟消息

12如何把消息发送到指定的队列(Message Queue)

13.pushConsumer消费者核心参数详解


1.RocketMQ整体介绍

1.1简介

RocketMQ 是一款分布式、队列模型的消息中间件,具有以下特点:
1.能够保证严格的消息顺序
2.提供丰富的消息拉取模式
3.高效的订阅者水平扩展能力
4.实时的消息订阅机制
5.亿级消息堆积能力

1.2选用理由

1. 阿里巴巴开源的分布式、队列模型的消息中间件,遵循JMS开发规范。
2. 4.3.x支持分布式事务
3. 官网地址:https://rocketmq.apache.org/   -- https://rocketmq.apache.org/release_notes/release-notes-4.3.0/
4. 支持集群模型、负载均衡、水平扩展能力
5. 亿级别的消息堆积能力
6. 采用0拷贝的原理、顺序写盘、随机读
7. 丰富api使用
8. 代码优秀底层采用Netty NIO 框架
9. NameServer(更轻量级网络路由服务) 代替 Zookeper
10.消息失败重试机制、消息可查询
11.社区活跃、成熟度(经过双11考验)

2.概念模型

1.简述

producer:消息生产者。负责生产消息,一般由后台业务系统负责生产消息。
consumer:消息消费者,负责消费消息,一般是后台系统负责异步消费。
push consumer:consumer的一种,需要像consumer对象注册监听
pull consumer:consumer的一种,需要主动请求Broker拉去消息
prodicer group:生产者集合,一般用于发送一类消息
consumer group:消费着集合,一般用于接收一类消息进行消费
borker:mq消息服务,消息的存储生产消费和转发

2.主题与标签

主题 Tpoic:第一级消息类型,书的标题
标签 Tags:第二级消息类型,书的目录,可以基于 Tag 做消息过滤
例如:
    主题:
        订单交易
    标签:
        订单交易-创建
        订单交易-付款
        订单交易-完成

3.发送与订阅群组

rocketmq-broker:主要业务逻辑消息收发,主从同步,pagecache
rocketmq-client:客户端接口生产消费者都要用
rocketmq-example:示例比如生产者消费者
rocketmq-common:公共数据结构
rocketmq-distribution:编译模块编译输出
rocketmq-filter:过滤broker过滤不感兴趣的消息传输,减小带宽压力
rocketmq-logging:日志相关的包
rocketmq-namesrv:用于服务协调
rocketmq-openmessaging:对外提供服务
rocketmq-remoting:远程调用接口,封装Nettty底层通信
rocketmq-srvutil:公用的工具方法,比如解析命令行参数
rocketmq-store:消息存储
rocketmq-tools:管理工具 mqadmin工具

3.源码包编译与结构说明

rocketmq-broker:主要业务逻辑消息收发,主从同步,pagecache
rocketmq-client:客户端接口生产消费者都要用
rocketmq-example:示例比如生产者消费者
rocketmq-common:公共数据结构
rocketmq-distribution:编译模块编译输出
rocketmq-filter:过滤broker过滤不感兴趣的消息传输,减小带宽压力
rocketmq-logging:日志相关的包
rocketmq-namesrv:用于服务协调
rocketmq-openmessaging:对外提供服务
rocketmq-remoting:远程调用接口,封装Nettty底层通信
rocketmq-srvutil:公用的工具方法,比如解析命令行参数
rocketmq-store:消息存储
rocketmq-tools:管理工具 mqadmin工具

2.环境搭建

CentOS7
jdk1.8
4.3.x

2.1上传MQ安装包

链接:https://pan.baidu.com/s/1wkA8uH75nMD4haal0i5zUg 
提取码:4545 
#上传根目录
cd /home
#创建目录 mq目录
mkdir rocket
#配置host
vi /etc/hosts
# 主节点服务器
ip1 rocketmq-nameserver1
ip1 rocketmq-master1
# 从节点服务器
ip2 rocketmq-nameserver2
ip2 rocketmq-master1-slave

2.2解压

tar -zxvf apache-rocketmq.tar.gz -C /home/rocket

2.3创建存储路径

mkdir /home/rocket/store
mkdir /home/rocket/store/commitlog
mkdir /home/rocket/store/consumequeue
mkdir /home/rocket/store/index

2.4修改broker配置文件

# Master
vim /home/rocket/conf/2m-2s-async/broker-a.properties
brokerClusterName=rocketmq-cluster-1
#broker 名字,角色是Slave需与Master相同
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer 地址,分号分割
namesrvAddr=rocketmq-nameserver1:20000;rocketmq-nameserver2:20000
#namesrvAddr=rocketmq-nameserver1:20000
brokerIP1=ip1
brokerIP2=ip1
#在发送消息时,自动创建服务器不存在的 topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建 Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=20001
#删除文件时间点,默认凌晨 4 点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog 每个文件的大小默认 1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue 每个文件默认存 30W 条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/home/rocket/store
#commitLog 存储路径
storePathCommitLog=/home/rocket/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/home/rocket/store/consumequeue
#消息索引存储路径
storePathIndex=/home/rocket/store/index
#checkpoint 文件存储路径
storeCheckpoint=/home/rocket/store/checkpoint
#abort 文件存储路径
abortFile=/home/rocket/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制 Master
#- SYNC_MASTER 同步双写 Master
#- SLAVE
brokerRole=ASYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
​
​

2.5修改日志配置文件

# 创建日志文件夹
mkdir -p /home/rocket/logs
# 日志配置修改
cd /home/rocket/conf
sed -i 's#${user.home}#/home/rocket#g' *.xml

2.6修改启动脚本参数

vim /home/rocket/bin/runbroker.sh
​
#===========================================================================================
# JVM Configuration
#===========================================================================================
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn512m"
​
vim /home/rocket/bin/runserver.sh
​
#===========================================================================================
# JVM Configuration
#===========================================================================================
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn512m  -XX:PermSize=128m -
XX:MaxPermSize=320m"

2.7启动mqnameser

2.7.1添加nameser.properties

vim /home/rocket/conf/nameser.properties
# 文件内容 默认9876
listenPort=20000

2.7.2启动命令

nohup sh /home/rocket/bin/mqnamesrv  -c /home/rocket/conf/nameser.properties &

2.8启动BrokerServer

nohup sh /home/rocket/bin/mqbroker -c /home/rocket/conf/2m-2s-async/broker-a.properties >/dev/null 2>&1 &

2.9查看日志

tail -f -n 500 /home/rocket/logs/rocketmqlogs/namesrv.log
tail -f -n 500 /home/rocket/logs/rocketmqlogs/broker.log

2.10打开端口

2.10.1namesrv只使用了一个9876端口,修改了默认配置改为20000

firewall-cmd --zone=public --add-port=20000/tcp --permanent

2.10.2broker的服务端口号 修改broker的listenPort端口号为20001

firewall-cmd --zone=public --add-port=20001/tcp --permanent

2.10.3 haListenPort haListenPort是haService中使用

//默认值为:listenPort + 1 这个值是在BrokerStartup.java中设置的
/**
* 影响haservice中AcceptSocketService服务的端口号
* 参考:
* com.alibaba.rocketmq.store.ha.HAService 构造函数中
*     this.acceptSocketService =
   new AcceptSocketService(defaultMessageStore.getMessageStoreConfig().getHaListenPort());
*/
messageStoreConfig.setHaListenPort(nettyServerConfig.getListenPort() + 1);
firewall-cmd --zone=public --add-port=20002/tcp --permanent

2.10.4fastListenPort

/**
 *主要用于slave同master同步。 默认为:主要是fastRemotingServer服务使用 listenPort - 2
 * listenPort - 2 默认 10909
 */
fastConfig.setListenPort(nettyServerConfig.getListenPort() - 2);
this.fastRemotingServer = new NettyRemotingServer(fastConfig, this.clientHousekeepingService);
firewall-cmd --zone=public --add-port=19999/tcp --permanent

3.控制台部署与使用

3.1控制台github源码地址

链接:https://pan.baidu.com/s/1MnQZkLt_FoVaOFwtAAgarQ 
​
提取码:4545 

3.2修改源码配置文件

rocketmq.config.namesrvAdd

rocketmq.config.isVIPChannel

server.contextPath=
server.port=8080
#spring.application.index=true
spring.application.name=rocketmq-console
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
logging.config=classpath:logback.xml
#if this value is empty,use env value rocketmq.config.namesrvAddr  NAMESRV_ADDR | now, you can set it in ops page.default localhost:9876
rocketmq.config.namesrvAddr=47.97.228.218:9876
#if you use rocketmq version < 3.5.8, rocketmq.config.isVIPChannel should be false.default true
rocketmq.config.isVIPChannel=false
#rocketmq-console's data path:dashboard/monitor
rocketmq.config.dataPath=/tmp/rocketmq-console/data
#set it false if you don't want use dashboard.default true
rocketmq.config.enableDashBoardCollect=true

3.3打开防火墙

firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --reload

4.QuickStart-生产者使用

4.1依赖地址

链接:https://pan.baidu.com/s/1dvTVXCccJXiCBma4WCTSXg 
提取码:4545 

4.2简单代码示例

​
package com.cnnct.test;
​
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;
​
/**
 * 消息生产者测试代码
 *
 * @author busl
 * @version 1.0
 */
public class MyRocketMqProducerTest {
    public static void main(String[] args) throws MQClientException, InterruptedException {
        DefaultMQProducer producer = new DefaultMQProducer("rent_quick_producer_name");
        producer.setNamesrvAddr("47.97.228.218:9876");
        producer.setSendMsgTimeout(60000);
        producer.start();
​
        for (int i = 0; i < 5; i++) {
            try {
                {
                    
                    Message msg = new Message(
                            //主题
                            "TopicTest",
                            //标签
                            "TagA",
                            /**
                             * 例如:
                             * 主题:
                             *  订单交易
                             * 标签:
                             *  订单交易-创建
                             *  订单交易-付款
                             *  订单交易-完成
                             */
                            //用户自定义的key主键标识
                            "OrderID18"+i,
                            //消息体 bate[]
                            ("Hello world"+i).getBytes(RemotingHelper.DEFAULT_CHARSET));
                    SendResult sendResult = producer.send(msg);
                    System.out.printf("%s%n", sendResult);
                }
​
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        producer.shutdown();
    }
}
​

5.QuickStart-消费者使用

​
package com.cnnct.test;
​
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.client.exception.MQClientException;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.remoting.common.RemotingHelper;
​
/**
 * 消息消费者测试代码
 *
 * @author busl
 * @version 1.0
 */
public class MyRocketMqPushConsumerTest {
    public static void main(String[] args) throws InterruptedException, MQClientException {
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("rent_quick_Consumer_name");
        //设置地址
        consumer.setNamesrvAddr("47.97.228.218:9876");
        consumer.subscribe(
                //主题
                "TopicTest",
                //消息过滤:模糊匹配 正则表达式或者* 全部
                "TagA");
        //枚举类型 当前是从最后端开始消费
        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);
        consumer.registerMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
                MessageExt messageExt = msgs.get(0);
                try {
                    // 主题
                    String topic = messageExt.getTopic();
                    // 标签
                    String tags = messageExt.getTags();
                    // 用户自定义的key主键标识
                    String keys = messageExt.getKeys();
                    if (keys.equals("OrderID183")) {
                        System.out.println("消息消费失败。。。");
                        int a = 1 / 0;
                    }
                    // 内容
                    String msgBody = new String(messageExt.getBody(), RemotingHelper.DEFAULT_CHARSET);
                    System.out.println("topic = " + topic + "tags = " + tags + "keys = " + keys + "msgBody = " + msgBody);
                } catch (Exception exception) {
                    exception.printStackTrace();
                    //重试次数大于三次则然会成功
                    System.out.println("重试次数" + messageExt.getReconsumeTimes());
                    if (messageExt.getReconsumeTimes() > 3) {
                        //记录
                        System.out.println("重试三次还是失败");
                        return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
                    }
                    //过一段时间重试
                    return ConsumeConcurrentlyStatus.RECONSUME_LATER;
                }
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        consumer.start();
        System.out.printf("Consumer Started.%n");
    }
​
}
​

6.四种集群环境构建详解

6.1单点模式

这种方式风险较大,一旦 Broker 重启或者宕机时,会导致整个服务不可用,不建议线上环境使用。


6.2主从模式

1.主节点接收消息同步给从节点一条消息,如果主节点挂了,消息还没有被消费,从节点还有消息,消息也可以消费(不能接收消息),保证消息的及时性和可靠性。
2.投递一条消息后,关闭主节点
3.从节点继续可以提供消费者数据进行消费,但是不能接收消息
4.主节点上线后进行消费进度offset同步(数据内容	+ 元数据信息)


6.2.1环境搭建

6.2.1.1准备安装包和创建存储路径

2.1上传安装包->2.2解压0->2.3创建存储路径


6.2.1.2修改broker slave配置文件

# brokerRole、brokerId、namesrvAddr
vim /home/rocket/conf/2m-2s-async/broker-a-s.properties


brokerClusterName=rocketmq-cluster-1
#broker 名字,角色是Slave需与Master相同
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=1
#nameServer 地址,分号分割
namesrvAddr=rocketmq-nameserver2:20000;rocketmq-nameserver1:20000
brokerIP1=150.158.140.224
#在发送消息时,自动创建服务器不存在的 topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建 Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=20001
#删除文件时间点,默认凌晨 4 点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog 每个文件的大小默认 1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue 每个文件默认存 30W 条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/home/rocket/store
#commitLog 存储路径
storePathCommitLog=/home/rocket/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/home/rocket/store/consumequeue
#消息索引存储路径
storePathIndex=/home/rocket/store/index
#checkpoint 文件存储路径
storeCheckpoint=/home/rocket/store/checkpoint
#abort 文件存储路径
abortFile=/home/rocket/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制 Master
#- SYNC_MASTER 同步双写 Master
#- SLAVE
brokerRole=SLAVE
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128

6.2.1.3修改其他配置文件

2.5->2.6
#打开配置文件修改主节点nameServer
vim /home/rocket/conf/2m-2s-async/broker-a.properties
#nameServer 地址,分号分割
namesrvAddr=47.97.228.218:9876;150.158.140.224:9876

6.2.1.4关闭主节点nameser和brokerser

# 查询mq进程
ps -ef | grep java 
# 按照下面顺序 kill掉 进程
kill -9 broker进程id
kill -9 nameser进程id

6.2.1.5配置nameser启动端口并启动两台nameser

#添加nameser.properties
vim /home/rocket/conf/nameser.properties
# 文件内容 默认9876
listenPort=20000
#启动命令
nohup sh /home/rocket/bin/mqnamesrv  -c /home/rocket/conf/nameser.properties &
#查看启动日志
tail -f -n 500 /home/rocket/logs/rocketmqlogs/namesrv.log
#打开nameserv端口
firewall-cmd --zone=public --add-port=20000/tcp --permanent
#打开broker进程idserv端口
firewall-cmd --zone=public --add-port=20001/tcp --permanent
firewall-cmd --zone=public --add-port=19999/tcp --permanent
firewall-cmd --zone=public --add-port=20002/tcp --permanent
firewall-cmd --reload


6.2.1.6启动Master brokerSer

    nohup sh /home/rocket/bin/mqbroker -c /home/rocket/conf/2m-2s-async/broker-a.properties >/dev/null 2>&1 &
# 查看日志
tail -f -n 500 /home/rocket/logs/rocketmqlogs/broker.log


6.2.1.7启动Slave brokerSer

nohup sh /home/rocket/bin/mqbroker -c /home/rocket/conf/2m-2s-async/broker-a-s.properties  >/dev/null 2>&1 &
# 查看日志
tail -f -n 500 /home/rocket/logs/rocketmqlogs/broker.log


6.3多主模式

一个集群无 Slave,全是 Master,例如 2 个 Master 或者 3 个 Master
 优点:配置简单,单个 Master 宕机或重启维护对应用无影响,在磁盘配置为 RAID10
时,即使机器宕机不可恢复情况下,由与 RAID10 磁盘非常可靠,消息也不会丢(异步刷
盘丢失少量消息,同步刷盘一条不丢)。性能最高。
 缺点:单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅,消息
实时性会受到受到影响。
 ### 先启动 NameServer
 ### 在机器 A,启动第一个 Master
 ### 在机器 B,启动第二个 Master


6.4多 Master 多 Slave 模式,异步复制

每个 Master 配置一个 Slave,有多对 Master-Slave,HA 采用异步复制方式,主备有短
暂消息延迟,毫秒级。
 优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,因为 Master 宕
机后,消费者仍然可以从 Slave 消费,此过程对应用透明。不需要人工干预。性能同多
Master 模式几乎一样。
 缺点:Master 宕机,磁盘损坏情况,会丢失少量消息。
 ### 先启动 NameServer
 ### 在机器 A,启动第一个 Master
 ### 在机器 B,启动第二个 Master
 ### 在机器 C,启动第一个 Slave
 ### 在机器 D,启动第二个 Slave

6.5多 Master 多 Slave 模式,同步双写

每个 Master 配置一个 Slave,有多对 Master-Slave,HA 采用同步双写方式,主备都写
成功,向应用返回成功。
 优点:数据与服务都无单点,Master 宕机情况下,消息无延迟,服务可用性与数据可
用性都非常高
 缺点:性能比异步复制模式略低,大约低 10%左右,发送单个消息的 RT 会略高。目
前主宕机后,备机不能自动切换为主机,后续会支持自动切换功能。
 ### 先启动 NameServer
 ### 在机器 A,启动第一个 Master
 ### 在机器 B,启动第二个 Master
 ### 在机器 C,启动第一个 Slave
 ### 在机器 D,启动第二个 Slave
 以上 Broker 与 Slave 配对是通过指定相同的 brokerName 参数来配对,Master 的
BrokerId 必须是 0,Slave 的 BrokerId 必须是大与 0 的数。另外一个 Master 下面可以挂
载多个 Slave,同一 Master 下的多个 Slave 通过指定不同的 BrokerId 来区分。

7.主从模式集群环境构建与测试(故障演练)

1.正常启动主从
2.消费者不启动,生产者正常发消息
3.关闭主节点这样就有未消费的消息
3.从节点继续可以提供消费者数据进行消费,但是不能接收消息
4.主节点上线后进行消费进度offset同步


8.RocketMQ生产者核心参数详解

8.1producerGroup:组名

一个生产者组,代表着一群topic相同的Producer。即一个生产者组是同一类Producer的组合。
一个应用里面组名是唯一的;


8.2CreateTopicKey

使用RocketMQ进行发消息时,必须要指定topic,对于topic的设置有一个开关autoCreateTopicEnable,一般在开发测试环境中会使用默认设置autoCreateTopicEnable = true,但是这样就会导致topic的设置不容易规范管理,没有统一的审核等等,所以在正式环境中会在Broker启动时设置参数autoCreateTopicEnable = false。这样当需要增加topic时就需要在web管理界面上添加即可。


8.3DefaultTopicQueueNum(默认为4)

8.4setMessageTimeOut(单位:ms)

8.5getCompressMsgBodyOverHowmuch(默认压缩字节4096)

8.6RetryTimesWhenSendFailed(同步重发策略可配置)

8.7RetryTimesWhenSendAsyncFailed(异步重发策略可配置)

8.8RetryAnotherBrokerWhenNotStoreOK(没有存储成功找其他broker存储)

8.9MaxMessageSize(最大的消息限制默认128k)

9.生产者同步发送消息和异步发送消息

9.1同步发送消息

producer.send(Message msg)				   


9.2同步发送核心实现

DefaultMQProducerImpl.java

9.3异步发送消息

producer.send(Message msg, SendCallback SendCallback);

9.4异步发送消息核心实现

DefaultMQProducerImpl.java


10.生产者消息的返回状态

{
    "SendResult":{
        "SendStatus":{
            "SEND_OK":"消息发送成功",
            "FLUSH_DISK_TIMEOUT":"消息发送到服务器,刷盘超时。可靠性投递的话考虑重发消息",
            "FLUSH_SLAVE_TIMEOUT":"消息同步到slave超时,slave宕机",
            "SLAVE_NOT_AVAILABLE":"消息发送成功了,slave不可用"
        }
    }
}

11.延迟消息

延迟消息:消息发送到broker后,要特定的时间才会被Consumer消费
目前只支持固定精度的定时消息
MessageStoreConfig配置类&&ScheduleMessageService
Message.setDelayTimeLevel();方法实现
1对应 1秒 2对应5秒 以此类推
messageDelayLevel = "1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h";


12如何把消息发送到指定的队列(Message Queue)

                    //发送到指定的队列 3指定的队列
​
                    SendResult send = producer.send(msg, new MessageQueueSelector() {
                        @Override
                        public MessageQueue select(List<MessageQueue> mqs, Message message, Object o) {
                            Integer arg = (Integer) o;
                            return mqs.get(arg);
                        }
                    }, 3);
                    System.out.println("send = " + send);

13.pushConsumer消费者核心参数详解

Consumer 的一种,应用通常吐 Consumer 对象注册一个 Listener 接口,一旦收到消息,Consumer 对象立
刻回调 Listener 接口方法。

14.消费模式-集群模式

15.消费模式广播模式

16.消费者存储核心偏移量

16.1

16.2

17.长轮询模式分析

18.pullconsumer

Consumer 的一种,应用通常主劢调用 Consumer 的拉消息方法从 Broker 拉消息,主劢权由应用控制。


Springboot2整合RocketMQ4.x   Springboot2.x整合RocketMQ4.x实战,加入相关依赖,开发生产者代码          启动nameser和broker     微信支付架构图:    微信支付调用相应的API进行支付,支付完成后回调,把相应的支付信息封装成对象发给生产者。生产者把消息发送给消息队列  broker,通过NameServer获取相应的路由地址。消息订阅者从broker获取相应的消息,生... 阅读详情

相关推荐

GD32_ADC采样+DMA多通道扫描传输

所使用的MCU 片上集成了 12 位逐次逼近式模数转换器模块(ADC),可以采样来自于 16 个外部通道和 2 个内部通道上的模拟信号。这 18 个 ADC 采样通道都支持多种运行模式,采样转换后,转换结果可以按照最低有效位对齐或最高有效位对齐的方式保存在相应的数据寄存器中。我们主要介绍其多通道扫描转换和DMA传输功能,在多个通道轮询采集ad数据,并使用DMA分别保存各个数据值,其能大大提高ADC的工作效率。以下为ADC 模块框图:

Yin_w的博客 8159

RocketMQ学习笔记(2)----Broker的集群四种方式

RocketMQ推荐了几种Broker集群方式,这里的Slave不可写,但可读,类似于Mysql主备方式 1. 单个Master   这是一种风险比较大的集群方式,因为一旦Borker重启或宕机期间,将会导致这个服务不可用,因此是不建议线上环境去使用的。 2. 多个Master   一个集群全部都是Master,没有Slave,它的优点和缺点如下:   优点:配置简单,单个Ma...

Teddies10081008的博客 373

基于ROS2系统开发机器人

以上是基于ROS 2开发机器人的基本流程和一个简单的发布者-订阅者示例。通过这个流程,你可以逐步扩展和优化你的机器人系统,实现更复杂的功能。

xuweilin的博客 1493

rocketMq4.3.0版本的安装配置及使用

rocketMq4.3.0版本的安装配置及使用     闲话不多说,直接进入正题。看下面: 一、下载安装 官网地址http://rocketmq.apache.org/release_notes/release-notes-4.3.0/,点击Resource后的链接地址就可以下载了。下载后放到/usr/local路径下,如下图所示: 进入到rocketmq...

student_zz的博客 3324

Windows11家庭版开启虚拟化与WSL安装操作手册

Windows 11 家庭版完全支持 WSL 2,无需升级到专业版即可享受 Linux 开发环境。通过本手册介绍的步骤,您可以顺利安装和配置 WSL,并掌握系统更新后的维护技巧。WSL 为开发者提供了在 Windows 环境下使用 Linux 工具链的便利,尤其适合需要跨平台开发的场景。随着使用深入,您会发现 WSL 生态系统的强大之处,它不仅能提高开发效率,还能让 Windows 用户体验到 Linux 的强大功能。建议定期查看微软官方文档,了解 WSL 的最新功能和最佳实践。

m0_54846764的博客 3018

全面指南:PyTorch与ROCm版本兼容性及多版本环境管理

本文详细介绍了在AMD GPU上配置PyTorch开发环境的完整流程,重点解决版本兼容性和多版本ROCm环境管理问题。主要内容包括:1) PyTorch与ROCm版本对应关系查询;2) 四种查看ROCm版本的方法;3) 使用update-alternatives管理多版本ROCm;4) 环境变量配置与冲突解决方案;5) 完整的验证流程和性能测试方法。文章提供了最佳实践建议和故障排除清单,帮助开发者快速搭建稳定高效的深度学习开发环境,充分发挥AMD GPU硬件性能。通过系统化的验证流程确保各组件协同工作,解决

数字人生 606

RocketMQ修炼之路(四):搭建集群监控平台

前言 RocketMQ有个可视化的管理界面,通过可视化界面,我们可以方便的监控RocketMQ集群,并实现很多操作,比方说Topic,查看和发送消息等。

1045

uni-app - 修改默认端口,H5 项目控制台运行出来的 IP 地址的默认端口号(H5 项目运行后控制台,修改项目运行到内置浏览器默认 8080 端口号)

uni-app运行到H5修改默认端口号,uni-app如何修改默认端口,uni-app修改默认端口,uni-app本地运行修改调试已上线微信H5项目,请问在UNIAPP的H5运行调试时候的IP是否可以自己设置固定,uni-app开发环境,如何设置h5服务器的端口,uni-app如何修改默认端,uni-app修改默认端口,uni-app指定端口号,uni-app-修改H5项目控制台运行出来的IP地址的默认端口号(H5项目运行后控制台,修改项目运行到内置浏览器默认8080端口号)

🏆 前端领域优质创作者 9884

RocketMQ集群搭建

RocketMQ集群,包括多主多从异步复制、多主多从同步双写等多种模式,下面搭建一个一主一从异步复制集群。 准备两个虚拟机节点 node1:部署主节点、部署nameServer、部署RocketMQ管控台 node2:部署从节点、部署nameServer 在node1 node2上传RocketMQ源码包,使用mvn -Prelease-all -DskipTests clean inst...

男儿当自强 3115

手把手教你学Simulink--复杂环境适应的四足机器人领域仿真建模实例:构建一个基于Simulink的四足机器人动态平衡保持仿真模型

通过上述步骤,你可以构建一个基本的基于Simulink的四足机器人动态平衡保持仿真模型。此模型不仅有助于理解四足机器人在复杂环境中的动态平衡控制原理,也为进一步优化提供了基础。随着技术的发展,还可以探索更多高级功能,如自适应步态调整、强化学习等,以提高机器人的智能性和适应性。

MHD0815的博客 234

高精度导航 | RTK:2025年高精度导航算法综述,包括:原理,数据,公式,完整代码,开源代码链接

中国科学院国家授时中心的最新研究表明,PPP-AR/PPP-RTK增强算法使时间传递链路的稳定性提升超过30%,模糊度固定成功率高达93.57%,首次固定时间缩短至20分钟内。当这一愿景实现,人类社会的生产效率和资源利用率将迎来革命性提升,高精度定位将成为像电力、互联网一样的基础服务,深刻重塑我们的生活方式和文明形态。PPP-RTK作为GNSS定位领域的最前沿技术,成功融合了精密单点定位(PPP)和实时动态定位(RTK)的双重优势。,实现在无GNSS信号环境下(如隧道、地下停车场)的连续厘米级定位。

尘世冰封的专栏 1604

RocketMQ 4.x入门到进阶

RocketMQ 4.x使用(持续更新中......)第一章《安装搭建RocketMQ 4.x》新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowc...

FaxBoy的博客 2374

【YOLO多模态检测顶刊】TGRS 2025范文解读,RGFNet 可见光-红外图像融合目标检测,2026年基于YOLO多模态融合属于发文热点,小论文和大论文通用,通读顶刊了解做实验和论文写作的全流程

🔥本文提出了一种反射率引导的渐进特征对齐网络(RGFNet)用于全天候无人机目标检测。该方法利用Retinex理论从可见光图像中提取光照不变的反射率特征,设计了反射率引导协同对齐模块(RCAM)实现跨模态双向特征对齐,并通过光照感知选择性融合模块(LSFM)在共享状态空间中进行高效特征交互。在DroneVehicle和DVTOD数据集上的实验表明,RGFNet分别达到81.4%和88.5%的mAP,显著优于现有方法。该方法有效解决了低光照条件下可见光-红外图像特征错位问题,为全天候无人机检测提供了新思路。

Ai缝合怪、助力小伙伴高效发论文 1076

【消息队列】消息中间件RocketMQ4.X急速入门

一文搞定RocketMQ全部知识点

互联网小阿祥 3134

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【RocketMq 系列】springboot RocketMq 入门教程

Apache RocketMQ 自诞生以来,因其架构简单、业务功能丰富、具备极强可扩展性等特点被众多企业开发者以及云厂商广泛采用。历经十余年的大规模场景打磨,RocketMQ 已经成为业内共识的金融级可靠业务消息首选方案,被广泛应用于互联网、大数据、移动互联网、物联网等领域的业务场景。

做一个有思想的技术人 2505

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

大家心心念念的RocketMQ5.x入门手册来喽

为了更好的拥抱云原生,RocketMQ5.x架构进行了大的重构,提出了存储与计算分离的设计架构,本文将带领大家快速入门

中间件兴趣圈 2701

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

RocketMQ 5.X、Kafka 4.x和RabbitMQ 4.x的详细对比

消息中间件对比摘要 RocketMQ 5.X、Kafka 4.x和RabbitMQ 4.x在架构和特性上各有侧重:RocketMQ采用主从架构优化负载均衡,支持严格顺序和事务消息,适合金融/电商等场景;Kafka 4.x通过KRaft模式摆脱ZK依赖,专为高吞吐流处理设计,适合大数据场景;RabbitMQ基于AMQP协议,提供丰富消息模型和插件系统,适合传统异步通信。性能方面,Kafka吞吐量最高达百万级TPS,RocketMQ次之,RabbitMQ相对较低。三者在可靠性、顺序性、事务支持等核心功能上各具特

csdn_tom_168的博客 812

【RocketMQ】RocketMQ快速入门

Metaq1.x是RocketMQ前身的第一个版本,本质上把Kafka做了一次java版本的重写(Kafka是scala语言开发)。Meta2.x,主要是对存储部分进行了优化,因为kafka的数据存储,它的partition是一个全量的复制,在阿里、在淘宝的这种海量交易。Kafka这种机制的横向拓展是非常不好的。2012年阿里同时把Meta2.0从阿里内部开源出来,取名RocketMQ,同时为了命名上的规范(版本上延续),所以这个就是RocketMQ3.0。现在RocketMQ主要维护的是4.x的版本,也是

morris 2万+

Windows部署RocketMQ4.X.X

Windows中部署RocketMQ

caokai1992的专栏 758

RocketMQ 4.x各种开发模型简介及实战

半事务消息是指暂不能投递的消息,生产者已经成功地将消息发送到了 Broker,但是Broker 未收到生产者对该消息的二次确认,此时该消息被标记成“暂不能投递”状态,如果发送成功则执行本地事务,并根据本地事务执行成功与否,向 Broker 半事务消息状态(commit或者rollback),半事务消息只有 commit 状态才会真正向下游投递。事务消息只保证消息发送者的本地事务与发消息这两个操作的原子性,因此,事务消息的示例只涉及到消息发送者,对于消息消费者来说,并没有什么特别的。

weixin_42544499的博客 1746

Linux RocketMQ4.x 部署和安装可视化控制台

Linux安装RocketMQ4.x 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、安装1、准备如下环境:2、安装二、启动1.启动NameServer2.启动broker3.关闭nameserver broker执行的命令4.使用jps查看进程三、验证是否成功常见错误1.NameServer内存不够2.Broker内存不足 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介

婉君 3046

聊聊 RocketMQ 4.X 知识体系

本文将带您深入了解 RocketMQ 4.X 的核心知识体系,从架构设计到关键机制,一探这款高可用消息中间件的底层逻辑。

m0_69632475的博客 858

rocketmq4.x快速入门指南

以下采用的是apache rocketmq 4.2.0版本 相关文档如下 快速体验: http://blog.seoui.com/2018/07/24/rocketmqinstall/ rocketmq简单消息发送: http://blog.seoui.com/2018/07/24/rock...

chenghanlan5902的博客 132

从入门到稳定运行:RocketMQ 5.3.4 单机版安装与开机自启配置详解

作为常年和中间件打交道的开发者,我发现很多朋友在部署 RocketMQ 时总被各种细节卡壳 —— 要么是 JVM 参数配置不当导致内存溢出,要么是内网服务没法对外访问。

羑悻的博客. 1万+

SpringBoot2.x整合RocketMQ

SpringBoot2.x整合RockketMQ JMS介绍和使用场景及基础编程模型 1、JMS介绍和使用场景及基础编程模型 简介:讲解什么是小写队列,JMS的基础知识和使用场景 1、什么是JMS: Java消息服务(Java Message Service),Java平台中关于面向消息中间件的接口 2、JMS是一种与厂商无关的 API,用来访问消息收发系统消息,它类似于JDBC(Java Dat...

紫蝶侠的博客 4613

RocketMQ4.x 笔记

什么是JMS? Java消息服务(Java Message Service),Java平台中关于面向消息中间件的接口,JMS是一种与厂商无关的 API,用来访问消息收发系统消息,它类似于JDBC(Java Database Connectivity)。这里,JDBC 是可以用来访问许多不同关系数据库的 API 使用场景 核心应用 解耦:订单系统->物流系统 异步:用户注册->发送邮件,初始化信息 削峰:秒杀、日志处理 跨平台 、多语言 分布式事务、最终

vincent_wen0766的博客 1126
上一篇: java: 找不到符号 符号: 变量 log
下一篇: easy mock 自定义post请求模拟数据
别浪呀
博客等级 码龄8年 1万+粉丝 260原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值