(部分资料是网上收集整理)
关于为什么使用RocketMQ?
RocketMQ是一款分布式、队列模型的消息中间件,是由阿里巴巴设计的,RocketMQ历经多次天猫双十一海量消息考验,有亿级消息堆积能力,这么强大的一个部件,一个新生的黑马!具有以下特点:
场景解决:
目前主流的MQ主要是Rocketmq、kafka、Rabbitmq,Rocketmq相比于Rabbitmq、kafka具有主要优势特性有:
• 支持事务型消息(消息发送和DB操作保持两方的最终一致性,rabbitmq和kafka不支持)
• 支持结合rocketmq的多个系统之间数据最终一致性(多方事务,二方事务是前提)
• 支持18个级别的延迟消息(rabbitmq和kafka不支持)
• 支持指定次数和时间间隔的失败消息重发(kafka不支持,rabbitmq需要手动确认)
• 支持consumer端tag过滤,减少不必要的网络传输(rabbitmq和kafka不支持)
• 支持重复消费(rabbitmq不支持,kafka支持)
整体可以分成4个角色:Producer,Consumer,Broker,NameServer;
1.NameServer
可以理解为是消息队列的协调者,Broker向它注册路由信息,同时Client向其获取路由信息
NameServer本身是没有状态的,并且多个NameServer直接并没有通信,可以横向扩展多台,Broker会和每一台NameServer建立长连接;
2.Broker
Broker是RocketMQ的核心,提供了消息的接收,存储,拉取等功能,一般都需要保证Broker的高可用,所以会配置Broker Slave,当Master挂掉之后,Consumer然后可以消费Slave;
Broker分为Master和Slave,一个Master可以对应多个Slave,Master与Slave的对应关系通过指定相同的BrokerName,不同的BrokerId来定义,BrokerId为0表示Master,非0表示Slave;
3.Producer
消息队列的生产者,需要与NameServer建立连接,从NameServer获取Topic路由信息,并向提供Topic服务的Broker Master建立连接;Producer无状态,看集群部署;
4.Consumer
消息队列的消费者,同样与NameServer建立连接,消费者每隔30秒拉取(pull)Topic路由信息,并向提供Topic服务的Broker Master,Slave建立连接;
5.Topic和Message Queue
在介绍完以上4个角色以后,还需要重点介绍一下上面提到的Topic和Message Queue;字面意思就是主题,用来区分不同类型的消息,发送和接收消息前都需要先创建Topic,针对Topic来发送和接收消息,为了提高性能和吞吐量,引入了Message Queue,一个Topic可以设置一个或多个Message Queue,有点类似kafka的分区(Partition),这样消息就可以并行往各个Message Queue发送消息,消费者也可以并行的从多个Message Queue读取消息;
在RocketMQ中一般有两种获取消息的方式,一个是拉(pull,消费者主动去broker拉取),一个是推(push,主动推送给消费者)如图
push(消息推送)(DefaultMQPushConsumer)
实时性高,但增加服务端负载,消费端能力不同,如果push的速度过快,消费端会出现很多问题。
例子:一个包子铺不停的出炉包子,出炉的包子会立马给客户吃掉,当出炉速度太快,客户没法消化的过来,会导致消费端的压力过大。
pull(轮训拉取)(DefaultMQPullConsumer过时,可用DefaultLitePullConsumer)
消费者从server端拉消息,主动权在消费端,可控性好,但是时间间隔不好设置,间隔太短,则空请求会多,浪费资源,间隔太长,则消息不能及时处理。实现类需要自己处理持久化之类,较复杂灵活
例子:一个包子铺不停的出炉包子,客户在每隔一定时间内去的时候内去吃,如果时间太短,包子没有出炉客户就回去了,那会浪费请求资源,如果时间过长,包子出炉却不能及时的被客户吃掉。
长轮询(默认的消费方式)(默认实现类DefaultMQPushConsumerImpl)
兼具了Push和Pull的有点, Client发送消息请求,Server端接受请求,如果发现Server队列里没有新消息,Server端不立即返回,而是持有这个请求一段时间(通过设置超时时间来实现,默认15秒),在这段时间内轮询Server队列内是否有新的消息,如果有新消息,就利用现有的连接返回消息给消费者;如果这段时间内没有新消息进入队列,则返回空。
1.如果发现Server队列里没有新消息,Server端不立即返回,等待的时长15秒,且Server端是开启线程去获取,线程里有个for循环,每次执行都休眠5秒在去检查是否有数据到来,直到超出15秒则返回null,否则有数据就会立即返回。BROKER_SUSPEND_MAX_TIME_MILLIS = 1000 * 15;
#服务端源码 org.apache.rocketmq.broker.longpolling.PullRequestHoldService#run
2.客户端也需要阻塞等待结果,也不能无限制等待下去,如果超过30秒还没收到返回,那么我本地也需要做对应处理。 CONSUMER_TIMEOUT_MILLIS_WHEN_SUSPEND=1000*30.
#客户端源码 org.apache.rocketmq.client.impl.consumer.PullMessageService#run
#源码博客 https://segmentfault.com/a/1190000018411470#item-3
例子:一个包子店不停的出炉包子,客户去的时候内去吃包子还没有出炉,包子店让客户等15秒不要走那快,在这15秒内每5秒都会检查一下有没有包子可以出炉的,如果有就给客户拿去吃掉。但此时检查没有包子可以出炉就在等5秒直到有或是到了15秒则让客户回去重新来。
消息发送模式
发送同步消息
发送会进行阻塞,等待响应之后才能发送下一条消息。一般用于重要通知消息。
发送异步消息
异步发送,发送出去之后无需mq响应会接着继续发送,发送构造需要实现 SendCallback接口,重写接口中提供了异步回调方法onSuccess,以及异步发送异常的回调方法onException。一般用于可能链路耗时较长而对响应时间敏感的业务场景
发送单向消息
发送单向消息无返回值,一般用于日志打印之类,允许消息丢失不可靠的场景。
消息消费模式
均衡负载(默认)
由生产者生产发送多条消息,可以被多个consumer消费,但这每一条消息只能有一个consumer能消费,能力越强消费的越多,一般情况均匀消费,也就是消费总数是与发送数量一致。
广播模式
由生产者生产发送一条消息,可以被多个consumer消费,即使这些consumer属于同一个ConsumerGroup,消息也会被ConsumerGroup中的每个Consumer都消费一次。如果要设置该模式可consumer.setMessageModel(MessageModel.BROADCASTING);//广播模式
顺序消息
消息顺序(Message Order)有两种:顺序消费(Orderly)和并行消费(Concurrently)。顺序消费表示消息消费的顺序同生产者为每个消息队列发送的顺序一致,所以如果正在处理全局顺序是强制性的场景,需要确保使用的主题只有一个消息队列。并行消费不再保证消息顺序,消费的最大并行数量受每个消费者客户端指定的线程池限制
消息投递到指定的queue
可在创建Topic的时候指定queue的数量,或是配置文件中,默认数量为4,在消息producer.send(msg,接口,0)投递到指定的queue序号中,从而可以达到顺序消费。
延迟消息
不希望这条消息马上被消费,而是推迟到当前时间点之后的某个时间点后再投递到queue中让consumer进行消费,延迟消息的使用场景很多,一种比较常见的场景就是在电商系统中,订单创建后,会有一个等待用户支付的时间窗口。可在配置中指定或是代码中指定该延时的时长
官方提供的时间,不可自定义"1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h" message.setDelayTimeLevel(3);//取得数组中的下标,要想自定义时间只能去改源代码编译
批量发送消息
批量发送则需要创建一个集合例如:List
过滤消息的方式
tag过滤
Consumer端在订阅消息时除了指定Topic还可以指定TAG,如果一个消息有多个TAG,可以用||分隔。其中,Consumer端会将这个订阅请求构建成一个 SubscriptionData,发送一个Pull消息的请求给Broker端
sql语句过滤
例如consumer.subscribe("FilterTest", Message.bySql("a between 0 and 3"));
事务消息的实现( new TransactionMQProducer("producer1") )
事务消息发送及提交:
事务消息的补偿流程:
RocketMQ执行流程
1、启动 Namesrv,Namesrv起 来后监听端口,等待 Broker、Producer、Consumer 连上来,相当于一个路由控制中心。
2、Broker 启动,跟所有的 Namesrv 保持长连接,定时发送心跳包。
3、收发消息前,先创建 Topic 。创建 Topic 时,需要指定该 Topic 要存储在 哪些 Broker上。也可以在发送消息时自动创建Topic。
4、Producer 发送消息。
5、Consumer 消费消息。
消息重复消费的原因
消息是回馈机制的。正常情况下,消费者在消费消息时候,消费完毕后,会发送一个ACK确认信息给消息队列(broker),消息队列(broker)就知道该消息被消费了,就会将该消息从消息队列中删除。
但网络不是百分百可靠的,如果生产者发送消息给消费者的时候,未得到消费的返回正确响应,则会触发消息重试。
消费者在收到消息,在处理完业务代码之后返回响应时,由于网络闪退,导致业务处理完成却响应失败,导致生产者这边会重新发送消息。
消息重试时间
如果消息重试16次后仍然失败。消息将不再投送,如果严格按照上述重试时间执行,某条消息在一直有失败的情况下,将会在接下来的4小时46分钟之内进行16次重试,超过这个时间息将不再重试投送,将会把该消息转移到死信队列。
不使用用默认的机制,我们可在代码中去设置重试次数,重试的间隔时间,也可以在代码中去捕获异常,响应正确状态。
如果使用均衡负载策略,消费者在消费的时候发生了宕机,这条消息会由生产者重新发送,此时也会导致,不同消费者消费了同一条消息。
解决消息重复消费
幂等性:(处理必须唯一) 无论这个业务请求被(consumer)执行多少次,我们的数据库的结果都是唯一的,不可变的。
业务去重:唯一订单号,唯一的id等保证接口的幂等性。
死信队列
死信队列中的消息不会在被消费,一般需要人工去处理。可在控制台中去查看。
Offset(偏移量)
可以认为一条逻辑的message queue是无限长的数组。一条消息进来下标就会涨1。下标就是offset。
一条message queue中的max offset表示消息的最大offset。从源码上看,max_offset并不是最新的那条消息的offset,而是表示最新消息的offset+1。而min offset则标识现存在的最小offset。
由于消息存储一段时间后,消费会被物理地从磁盘删除,message queue的min offset也就对应增长。这意味着比min offset要小的那些消息已经不在broker上了,无法被消费。
Consumer Offset
消费者拉取消息的时候需要指定offset,broker不主动推送消息,而是接受到请求的时候把存储的对应offset的消息返回给客户端。这个offset在成功消费后会更新到内存,并定时持久化。在集群消费模式下,会同步持久化到broker。在广播模式下,会持久化到本地文件。
实例重启的时候会获取持久化的consumer offset,用以决定从哪里开始消费。
存储文件结构:
commitLog:消息存储文件,所有消费主题的消息都存储在CommitLog文件中。
config:运行期间一些配置信息【consumerFilter.json-主题消息过滤信息;consumerOffset.json-集群消费模式消息消费进度;delayOffSet.json-延时消息队列拉取进度;subscriptionGroup.json-消息消费组配置信息;topics.json-topic配置属性】
consumerqueue:消息消费队列,消息到达CommitLog文件后,将异步转发到消息消费队列,供消息消费者消费
index:消息索引文件,主要存储消息Key 与 Offset的对应关系。
abort:如果存在abort文件说明Broker非正常关闭,该文件默认启动时创建,正常退出之前删除。
checkPoint:文件检测点,存储CommitLog文件最后一次刷盘时间戳、consumeQueue最后一次刷盘时间、index索引文件最后一次刷盘时间戳。
RocketMQ源码主要分为以下几个package:
rocketmq-broker:mq的核心,它能接收producer和consumer的请求,并调用store层服务对消息进行处理。HA服务的基本单元,支持同步双写,异步双写等模式。
rocketmq-client:mq客户端实现,目前官方仅仅开源了java版本的mq客户端,c++,go客户端有社区开源贡献。
rocketmq-common:一些模块间通用的功能类,比如一些配置文件、常量。
rocketmq-example:官方提供的例子,对典型的功能比如order message,push consumer,pull consumer的用法进行了示范。
rocketmq-filter:消息过滤服务,相当于在broker和consumer中间加入了一个filter代理。
rocketmq-namesrv:命名服务,更新和路由发现 broker服务。
rocketmq-remoting:基于netty的底层通信实现,所有服务间的交互都基于此模块。
rocketmq-srvutil:解析命令行的工具类ServerUtil。
rocketmq-store:存储层实现,同时包括了索引服务,高可用HA服务实现。
rocketmq-tools:mq集群管理工具,提供了消息查询等功能。
BUG问题
---------------------------------------------------------------------------------------------------------------
Exception in thread "main" org.apache.rocketmq.client.exception.MQClientException: No route info of this topic, xxxx
先查看 Message 对象指定的 topic 是否存在,如果不存在则需要手动创建或开启下面的配置
# 是否允许 Broker 自动创建 Topic,建议线下开启,线上关闭 !!!
autoCreateTopicEnable=true
---------------------------------------------------------------------------------------------------------------
Exception in thread "main" org.apache.rocketmq.remoting.exception.Remoting
TooMuchRequestException: sendDefaultImpl call timeout
这是因为你连接超时,有可能是服务不通,或是网络太慢导致的。
#broker.conf 配置里指定外网ip地址,docker部署采坑了。
brokerIP1=192.168.1.161
//代码里加上设置连接超时 本地虚拟机连接就花了7秒,发送也花了7秒
producer.setSendMsgTimeout(20000);
#测试发送成功数据
SendResult [sendStatus=SEND_OK, msgId=C0A80106341418B4AAC26F1D63630000, offsetMsgId=C0A801A100002A9F0000000000000000, messageQueue=MessageQueue [topic=TestDemo, brokerName=broker-a, queueId=0], queueOffset=0]
#分析数据
queueId=0 //这个是投递的消息放入那个queue,取值范围0~你给定的值
----------------------------------------配置文件-----------------------------------------------
# 所属集群名字
brokerClusterName=DefaultCluster
# broker 名字,注意此处不同的配置文件填写的不一样,如果在 broker-a.properties 使用: broker-a,
# 在 broker-b.properties 使用: broker-b
brokerName=broker-a
# 0 表示 Master,> 0 表示 Slave
brokerId=0
# nameServer地址,分号分割
# namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
# 启动IP,如果 docker 报 com.alibaba.rocketmq.remoting.exception.RemotingConnectException: connect to <192.168.0.120:10909> failed
# 解决方式1 加上一句 producer.setVipChannelEnabled(false);,解决方式2 brokerIP1 设置宿主机IP,不要使用docker 内部IP
brokerIP1=192.168.1.161
# 在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
# 是否允许 Broker 自动创建 Topic,建议线下开启,线上关闭 !!!这里仔细看是 false,false,false
autoCreateTopicEnable=true
# 是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
# Broker 对外服务的监听端口
listenPort=10911
# 删除文件时间点,默认凌晨4点
deleteWhen=04
# 文件保留时间,默认48小时
fileReservedTime=120
# commitLog 每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
# ConsumeQueue 每个文件默认存 30W 条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
# destroyMapedFileIntervalForcibly=120000
# redeleteHangedFileInterval=120000
# 检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
# 存储路径
# storePathRootDir=/home/ztztdata/rocketmq-all-4.1.0-incubating/store
# commitLog 存储路径
# storePathCommitLog=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/commitlog
# 消费队列存储
# storePathConsumeQueue=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/consumequeue
# 消息索引存储路径
# storePathIndex=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/index
# checkpoint 文件存储路径
# storeCheckpoint=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/checkpoint
# abort 文件存储路径
# abortFile=/home/ztztdata/rocketmq-all-4.1.0-incubating/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
# 发消息线程池数量
# sendMessageThreadPoolNums=128
# 拉消息线程池数量
# pullMessageThreadPoolNums=128
----------------------------------------默认配置文件-----------------------------------------------
NameServer配置属性 |
|||
参数名 |
参数类型 |
描述 |
默认参数(时间为单位ms,数据单位为byte) |
rocketmqHome |
String |
RockerMQ主目录,默认用户主目录 |
|
namesrvAddr |
String |
NameServer地址 |
|
kvConfigPath |
String |
kv配置文件路径,包含顺序消息主题的配置信息 |
|
configStorePath |
String |
NameServer配置文件路径,建议使用-c指定NameServer配置文件路径 |
|
clusterTest |
boolean |
是否开启集群测试,默认为false |
|
orderMessageEnable |
boolean |
是否支持顺序消息,默认为false |
|
NameServer、Broker、filter网络配置属性 |
|||
accessMessageInMemoryMaxRatio |
int |
访问消息在内存中比率,默认为40 |
40 |
adminBrokerThreadPoolNums |
int |
服务端处理控制台管理命令线程池线程数量 |
16 |
autoCreateSubscriptionGroup |
boolean |
是否自动创建消费组 |
true |
autoCreateTopicEnable |
boolean |
是否自动创建主题 |
true |
bitMapLengthConsumeQueueExt |
int |
ConsumeQueue扩展过滤bitmap大小 |
112 |
brokerClusterName |
String |
Broker集群名称 |
TestCluster |
brokerFastFailureEnable |
boolean |
是否支持broker快速失败 如果为true表示会立即清除发送消息线程池,消息拉取线程池中排队任务 ,直接返回系统错误 |
true |
brokerId |
int |
brokerID 0表示主节点 大于0表示从节点 |
0 |
brokerIP1 |
String |
Broker服务地址 |
|
brokerIP2 |
String |
BrokerHAIP地址,供slave同步消息的地址 |
|
brokerName |
String |
Broker服务器名称morning服务器hostname |
broker-a |
brokerPermission |
int |
Broker权限 默认为6表示可读可写 |
6 |
brokerRole |
enum |
broker角色,分为 ASYNC_MASTER SYNC_MASTER, SLAVE |
ASYNC_MASTER |
brokerTopicEnable |
boolean |
broker名称是否可以用做主体使用 |
true |
channelNotActiveInterval |
long |
|
60000 |
checkCRCOnRecover |
boolean |
文件恢复时是否校验CRC |
true |
cleanFileForciblyEnable |
boolean |
是否支持强行删除过期文件 |
true |
cleanResourceInterval |
int |
清除过期文件线程调度频率 |
10000 |
clientAsyncSemaphoreValue |
int |
|
65535 |
clientCallbackExecutorThreads |
int |
|
8 |
clientChannelMaxIdleTimeSeconds |
int |
|
120 |
clientCloseSocketIfTimeout |
boolean |
|
false |
clientManagerThreadPoolQueueCapacity |
int |
客户端管理线程池任务队列初始大小 |
1000000 |
clientManageThreadPoolNums |
int |
服务端处理客户端管理(心跳 注册 取消注册线程数量) |
32 |
clientOnewaySemaphoreValue |
int |
|
65535 |
clientPooledByteBufAllocatorEnable |
boolean |
|
false |
clientSocketRcvBufSize |
long |
客户端socket接收缓冲区大小 |
131072 |
clientSocketSndBufSize |
long |
客户端socket发送缓冲区大小 |
131072 |
clientWorkerThreads |
int |
|
4 |
clusterTopicEnable |
boolean |
集群名称是否可用在主题使用 |
true |
commercialBaseCount |
int |
|
1 |
commercialBigCount |
int |
|
1 |
commercialEnable |
boolean |
|
true |
commercialTimerCount |
int |
|
1 |
commercialTransCount |
int |
|
1 |
commitCommitLogLeastPages |
int |
一次提交至少需要脏页的数量,默认4页,针对 commitlog文件 |
4 |
commitCommitLogThoroughInterval |
int |
Commitlog两次提交的最大间隔,如果超过该间隔,将忽略commitCommitLogLeastPages直接提交 |
200 |
commitIntervalCommitLog |
int |
commitlog提交频率 |
200 |
compressedRegister |
boolean |
|
false |
connectTimeoutMillis |
long |
链接超时时间 |
3000 |
consumerFallbehindThreshold |
long |
消息消费堆积阈值默认16GB在disableConsumeifConsumeIfConsumerReadSlowly为true时生效 |
17179869184 |
consumerManagerThreadPoolQueueCapacity |
int |
消费管理线程池任务队列大小 |
1000000 |
consumerManageThreadPoolNums |
int |
服务端处理消费管理 获取消费者列表 更新消费者进度查询消费进度等 |
32 |
debugLockEnable |
boolean |
是否支持 PutMessage Lock锁打印信息 |
false |
defaultQueryMaxNum |
int |
查询消息默认返回条数,默认为32 |
32 |
defaultTopicQueueNums |
int |
主体在一个broker上创建队列数量 |
8 |
deleteCommitLogFilesInterval |
int |
删除commitlog文件的时间间隔,删除一个文件后等一下再删除一个文件 |
100 |
deleteConsumeQueueFilesInterval |
int |
删除consumequeue文件时间间隔 |
100 |
deleteWhen |
String |
磁盘文件空间充足情况下,默认每天什么时候执行删除过期文件,默认04表示凌晨4点 |
04 |
destroyMapedFileIntervalForcibly |
int |
销毁MappedFile被拒绝的最大存活时间,默认120s。清除过期文件线程在初次销毁mappedfile时,如果该文件被其他线程引用,引用次数大于0.则设置MappedFile的可用状态为false,并设置第一次删除时间,下一次清理任务到达时,如果系统时间大于初次删除时间加上本参数,则将ref次数一次减1000,知道引用次数小于0,则释放物理资源 |
120000 |
disableConsumeIfConsumerReadSlowly |
boolean |
如果消费组消息消费堆积是否禁用该消费组继续消费消息 |
false |
diskFallRecorded |
boolean |
是否统计磁盘的使用情况,默认为true |
true |
diskMaxUsedSpaceRatio |
int |
commitlog目录所在分区的最大使用比例,如果commitlog目录所在的分区使用比例大于该值,则触发过期文件删除 |
75 |
duplicationEnable |
boolean |
是否允许重复复制,默认为 false |
false |
enableCalcFilterBitMap |
boolean |
是否开启比特位映射,这个属性不太明白 |
false |
enableConsumeQueueExt |
boolean |
是否启用ConsumeQueue扩展属性 |
false |
enablePropertyFilter |
boolean |
是否支持根据属性过滤 如果使用基于标准的sql92模式过滤消息则改参数必须设置为true |
false |
endTransactionPoolQueueCapacity |
int |
处理提交和回滚消息线程池线程队列大小 |
100000 |
endTransactionThreadPoolNums |
int |
处理提交和回滚消息线程池 |
24 |
expectConsumerNumUseFilter |
boolean |
布隆过滤器参数 |
32 |
fastFailIfNoBufferInStorePool |
boolean |
从 transientStorepool中获取 ByteBuffer是否支持快速失败 |
false |
fetchNamesrvAddrByAddressServer |
boolean |
是否支持从服务器获取nameServer |
false |
fileReservedTime |
String |
文件保留时间,默认72小时,表示非当前写文件最后一次更新时间加上filereservedtime小与当前时间,该文件将被清理 |
120 |
filterDataCleanTimeSpan |
long |
清除过滤数据的时间间隔 |
86400000 |
filterServerNums |
int |
broker服务器过滤服务器数量 |
0 |
filterSupportRetry |
boolean |
消息过滤是否支持重试 |
false |
flushCommitLogLeastPages |
int |
一次刷盘至少需要脏页的数量,针对commitlog文件 |
4 |
flushCommitLogThoroughInterval |
int |
commitlog两次刷盘的最大间隔,如果超过该间隔,将fushCommitLogLeastPages要求直接执行刷盘操作 |
10000 |
flushCommitLogTimed |
boolean |
表示await方法等待FlushIntervalCommitlog,如果为true表示使用Thread.sleep方法等待 |
false |
flushConsumeQueueLeastPages |
int |
一次刷盘至少需要脏页的数量,默认2页,针对 Consume文件 |
2 |
flushConsumeQueueThoroughInterval |
int |
Consume两次刷盘的最大间隔,如果超过该间隔,将忽略 |
60000 |
flushConsumerOffsetHistoryInterval |
int |
fushConsumeQueueLeastPages直接刷盘 |
60000 |
flushConsumerOffsetInterval |
int |
持久化消息消费进度 consumerOffse.json文件的频率ms |
5000 |
flushDelayOffsetInterval |
long |
延迟队列拉取进度刷盘间隔。默认10s |
10000 |
flushDiskType |
enum |
刷盘方式,默认为 ASYNC_FLUSH(异步刷盘),可选值SYNC_FLUSH(同步刷盘) |
ASYNC_FLUSH |
flushIntervalCommitLog |
int |
commitlog刷盘频率 |
500 |
flushIntervalConsumeQueue |
int |
consumuQueue文件刷盘频率 |
1000 |
flushLeastPagesWhenWarmMapedFile |
int |
用字节0填充整个文件的,每多少页刷盘一次。默认4096页,异步刷盘模式生效 |
4096 |
forceRegister |
boolean |
是否强制注册 |
true |
haHousekeepingInterval |
int |
Master与save长连接空闲时间,超过该时间将关闭连接 |
20000 |
haListenPort |
int |
Master监听端口,从服务器连接该端口,默认为10912 |
10912 |
haMasterAddress |
String |
Master服务器IP地址与端口号 |
|
haSendHeartbeatInterval |
int |
Master与Slave心跳包发送间隔 |
5000 |
haSlaveFallbehindMax |
int |
允许从服务器落户的最大偏移字节数,默认为256M。超过该值则表示该Slave不可用 |
268435456 |
haTransferBatchSize |
int |
一次HA主从同步传输的最大字节长度,默认为32K |
32768 |
heartbeatThreadPoolNums |
int |
心跳线程池线程数 |
8 |
heartbeatThreadPoolQueueCapacity |
int |
心跳线程队列数量 |
50000 |
highSpeedMode |
boolean |
当前版本未使用 |
false |
listenPort |
int |
服务端监听端口 |
10911 |
longPollingEnable |
boolean |
是否开启长轮训 |
true |
mapedFileSizeCommitLog |
int |
单个conmmitlog文件大小默认1GB |
1073741824 |
mapedFileSizeConsumeQueue |
int |
单个consumequeue文件大小默认30W*20表示单个Consumequeue文件中存储30W个ConsumeQueue条目 |
6000000 |
mappedFileSizeConsumeQueueExt |
int |
ConsumeQueue扩展文件大小默认48MB |
50331648 |
maxDelayTime |
int |
当前版本未使用 |
40 |
maxErrorRateOfBloomFilter |
int |
布隆过滤器参数 |
20 |
maxHashSlotNum |
int |
单个索引文件hash槽的个数,默认为五百万 |
5000000 |
maxIndexNum |
int |
单个索引文件索引条目的个数,默认为两千万 |
20000000 |
maxMessageSize |
int |
默认允许的最大消息体默认4M |
4194304 |
maxMsgsNumBatch |
int |
一次查询消息最大返回消息条数,默认64条 |
64 |
maxTransferBytesOnMessageInDisk |
|
一次服务消息端消息拉取,消息在磁盘中传输允许的最大字节 |
65536 |
maxTransferBytesOnMessageInMemory |
int |
一次服务端消息拉取,消息在内存中传输允许的最大传输字节数默认256kb |
262144 |
maxTransferCountOnMessageInDisk |
int |
一次消息服务端消息拉取,消息在磁盘中传输允许的最大条数,默认为8条 |
8 |
maxTransferCountOnMessageInMemory |
int |
一次服务消息拉取,消息在内存中传输运行的最大消息条数,默认为32条 |
32 |
messageDelayLevel |
String |
延迟队列等级(s=秒,m=分,h=小时) |
1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h |
messageIndexEnable |
boolean |
是否支持消息索引文件 |
true |
messageIndexSafe |
boolean |
消息索引是否安全,默认为 false,文件恢复时选择文件检测点(commitlog.consumeque)的最小的与文件最后更新对比,如果为true,文件恢复时选择文件检测点保存的索引更新时间作为对比 |
false |
messageStorePlugIn |
String |
消息存储插件地址默认为空字符串 |
|
namesrvAddr |
String |
nameServer地址 |
|
notifyConsumerIdsChangedEnable |
|
消费者数量变化后是否立即通知RebalenceService线程,以便马上进行重新负载 |
true |
offsetCheckInSlave |
boolean |
从服务器是否坚持 offset检测 |
false |
osPageCacheBusyTimeOutMills |
long |
putMessage锁占用超过该时间,表示 PageCache忙 |
1000 |
pullMessageThreadPoolNums |
int |
服务端处理消息拉取线程池线程数量 默认为16加上当前操作系统CPU核数的两倍 |
32 |
pullThreadPoolQueueCapacity |
int |
消息拉去线程池任务队列初始大小 |
100000 |
putMsgIndexHightWater |
int |
当前版本未使用 |
600000 |
queryMessageThreadPoolNums |
int |
服务端处理查询消息线程池数量默认为8加上当前操作系统CPU核数的两倍 |
16 |
queryThreadPoolQueueCapacity |
int |
查询消息线程池任务队列初始大小 |
20000 |
redeleteHangedFileInterval |
int |
重试删除文件间隔,配合destorymapedfileintervalforcibly |
120000 |
regionId |
String |
消息区域 |
DefaultRegion |
registerBrokerTimeoutMills |
int |
注册broker超时时间 |
6000 |
registerNameServerPeriod |
int |
broker注册频率 大于1分钟为1分钟小于10秒为10秒 |
30000 |
rejectTransactionMessage |
boolean |
是否拒绝事物消息 |
false |
rocketmqHome |
String |
RocketMQ主目录 |
/home/rocketmq/rocketmq-all-4.3.2-bin-release |
sendMessageThreadPoolNums |
int |
服务端处理消息发送线程池数量 |
1 |
sendThreadPoolQueueCapacity |
int |
消息发送线程池任务队列初始大小 |
10000 |
serverAsyncSemaphoreValue |
int |
异步消息发送最大并发度 |
64 |
serverCallbackExecutorThreads |
int |
netty public任务线程池个数,netty网络设计没根据业务类型会创建不同线程池毛笔如处理发送消息,消息消费心跳检测等。如果业务类型(RequestCode)未注册线程池,则由public线程池执行 |
0 |
serverChannelMaxIdleTimeSeconds |
int |
网络连接最大空闲时间。如果链接空闲时间超过此参数设置的值,连接将被关闭 |
120 |
serverOnewaySemaphoreValue |
int |
send oneway消息请求并发度 |
256 |
serverPooledByteBufAllocatorEnable |
boolean |
ByteBuffer是否开启缓存 |
true |
serverSelectorThreads |
int |
IO线程池线程个数,主要是NameServer.broker端解析请求,返回相应的线程个数,这类县城主要是处理网络请求的,解析请求包。然后转发到各个业务线程池完成具体的业务无操作,然后将结果在返回调用方 |
3 |
serverSocketRcvBufSize |
int |
netty网络socket接收缓存区大小16MB |
131072 |
serverSocketSndBufSize |
int |
netty网络socket发送缓存区大小16MB |
131072 |
serverWorkerThreads |
int |
netty业务线程池个数 |
8 |
shortPollingTimeMills |
long |
短轮训等待时间 |
1000 |
slaveReadEnable |
boolean |
从节点是否可读 |
false |
startAcceptSendRequestTimeStamp |
int |
|
0 |
storePathCommitLog |
String |
Commitlog存储目录默认为${storePathRootDir}/commitlog |
/home/rocketmq/store/commitlog |
storePathRootDir |
String |
broker存储目录 默认为用户的主目录/store |
/home/rocketmq/store |
syncFlushTimeout |
long |
同步刷盘超时时间 |
5000 |
traceOn |
boolean |
|
true |
transactionCheckInterval |
long |
事物回查周期 |
60000 |
transactionCheckMax |
int |
事物回查次数 |
15 |
transactionTimeOut |
long |
事物回查超时时间 |
6000 |
transferMsgByHeap |
boolean |
消息传输是否使用堆内存 |
true |
transientStorePoolEnable |
boolean |
Commitlog是否开启 transientStorePool机制,默认为 false |
false |
transientStorePoolSize |
int |
transientStorePool中缓存 ByteBuffer个数,默认5个 |
5 |
useEpollNativeSelector |
boolean |
是否启用Epoll IO模型。Linux环境建议开启 |
false |
useReentrantLockWhenPutMessage |
boolean |
消息存储到commitlog文件时获取锁类型,如果为true使用ReentrantLock否则使用自旋锁 |
false |
useTLS |
boolean |
是否使用安全传输层协议 |
false |
waitTimeMillsInHeartbeatQueue |
long |
清理broker心跳线程等待时间 |
31000 |
waitTimeMillsInPullQueue |
long |
清除消息拉取线程池任务队列的等待时间。如果系统时间减去任务放入队列中的时间小于waitTimeMillsInPullQueue,本次请求任务暂时不移除该任务 |
5000 |
waitTimeMillsInSendQueue |
long |
清除发送线程池任务队列的等待时间。如果系统时间减去任务放入队列中的时间小于waitTimeMillsInSendQueue,本次请求任务暂时不移除该任务 |
200 |
waitTimeMillsInTransactionQueue |
long |
清理提交和回滚消息线程队列等待时间 |
3000 |
warmMapedFileEnable |
boolean |
是否温和地使用 MappedFile如果为true,将不强制将内存映射文件锁定在内存中 |
false |
connectWhichBroker |
String |
FilterServer连接的Broker地址 |
|
filterServerIP |
String |
FilterServerIP地址,默认为本地服务器IP |
|
compressMsgBodyOverHowmuch |
int |
如果消息Body超过该值则启用 |
|
zipCompresslevel |
int |
Zip压缩方式,默认为5,详细定义请参考java.util.Deflate中的定义 |
|
clientUploadFilterClassEnable |
boolean |
是否支持客户端上传 FilterClass代码 |
|
filterClassRepertoryUrl |
String |
filterClass服务地址,如果 clientUploadFilterClassEnable为false,则需要提供一个地址从该服务器获取过滤类的代码 |
|
fsServerAsyncSemaphorevalue |
int |
FilterServer异步请求并发度,默认为2048 |
|
fsServerCallbackExecutorThreads |
int |
处理回调任务的线程池数量,默认为64 |
|
fsServerWorkerThreads |
int |
远程服务调用线程池数量,默认为64 |
|