RocketMQ 详解

 

RocketMQ 详解_第1张图片

(部分资料是网上收集整理)

 

关于为什么使用RocketMQ?

      RocketMQ是一款分布式、队列模型的消息中间件,是由阿里巴巴设计的,RocketMQ历经多次天猫双十一海量消息考验,有亿级消息堆积能力,这么强大的一个部件,一个新生的黑马!具有以下特点:

  • 支持严格的消息顺序
  • 支持Topic与Queue两种模式
  • 亿级消息堆积能力
  • 比较友好的分布式特性
  • 同时支持Push与Pull方式消费消息
  • 历经多次天猫双十一海量消息考验
  • RocketMQ是纯java编写,基于通信框架Netty。

场景解决:

  • 削峰填谷(主要解决瞬时写压力大于应用服务能力导致消息丢失、系统奔溃等问题)
  • 系统解耦(解决不同重要程度、不同能力级别系统之间依赖导致一死全死)
  • 提升性能(当存在一对多调用时,可以发一条消息给消息系统,让消息系统通知相关系统)
  • 蓄流压测(线上有些链路不好压测,可以通过堆积一定量消息再放开来压测)

 

目前主流的MQ主要是Rocketmq、kafka、Rabbitmq,Rocketmq相比于Rabbitmq、kafka具有主要优势特性有:

• 支持事务型消息(消息发送和DB操作保持两方的最终一致性,rabbitmq和kafka不支持)

• 支持结合rocketmq的多个系统之间数据最终一致性(多方事务,二方事务是前提)

• 支持18个级别的延迟消息(rabbitmq和kafka不支持)

• 支持指定次数和时间间隔的失败消息重发(kafka不支持,rabbitmq需要手动确认)

• 支持consumer端tag过滤,减少不必要的网络传输(rabbitmq和kafka不支持)

• 支持重复消费(rabbitmq不支持,kafka支持)

RocketMQ 详解_第2张图片

整体可以分成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,主动推送给消费者)如图

RocketMQ 详解_第3张图片

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 messages = new ArrayList<>();然后方可 producer.send(messages);由于批量消息的1M限制,所以一般情况下在集合中添加消息需要先计算当前集合中消息对象的大小是否超过限制,如果超过限制也可以使用分割消息的方式进行多次批量发送。

 

过滤消息的方式

tag过滤

Consumer端在订阅消息时除了指定Topic还可以指定TAG,如果一个消息有多个TAG,可以用||分隔。其中,Consumer端会将这个订阅请求构建成一个 SubscriptionData,发送一个Pull消息的请求给Broker端

 

sql语句过滤

例如consumer.subscribe("FilterTest", Message.bySql("a between 0 and 3"));

 

事务消息的实现( new TransactionMQProducer("producer1") )

事务消息发送及提交:

  1. 发送消息(half消息)
  2. 服务端响应消息写入结果
  3. 根据发送结果执行本地事务(如果写入失败,此时half消息对业务不可见,本地逻辑不执行)
  4. 根据本地事务状态执行Commit或Rollback(Commit操作生成消息索引,消息对消费者可见)

事务消息的补偿流程:

  1. 对没有Commit/Rollback的事务消息(pending状态的消息),从服务端发起一次“回查”
  2. Producer收到回查消息,检查回查消息对应的本地事务的状态
  3. 根据本地事务状态,重新Commit或者Rollback

 

 

RocketMQ执行流程

 

1、启动 Namesrv,Namesrv起 来后监听端口,等待 Broker、Producer、Consumer 连上来,相当于一个路由控制中心。

 

2、Broker 启动,跟所有的 Namesrv 保持长连接,定时发送心跳包。

 

3、收发消息前,先创建 Topic 。创建 Topic 时,需要指定该 Topic 要存储在 哪些 Broker上。也可以在发送消息时自动创建Topic。

 

4、Producer 发送消息。

 

5、Consumer 消费消息。

 

消息重复消费的原因

消息是回馈机制的。正常情况下,消费者在消费消息时候,消费完毕后,会发送一个ACK确认信息给消息队列(broker),消息队列(broker)就知道该消息被消费了,就会将该消息从消息队列中删除。

但网络不是百分百可靠的,如果生产者发送消息给消费者的时候,未得到消费的返回正确响应,则会触发消息重试。

消费者在收到消息,在处理完业务代码之后返回响应时,由于网络闪退,导致业务处理完成却响应失败,导致生产者这边会重新发送消息。

 

消息重试时间

RocketMQ 详解_第4张图片

如果消息重试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,用以决定从哪里开始消费。

 

存储文件结构:

RocketMQ 详解_第5张图片

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

 

 

你可能感兴趣的:(RocketMQ 详解)