RocketMQ 的 TPS 上限区分发送和接收吗?
TPS 上限区分发送和接收,分别进行限流控制。当发送 TPS 或消费 TPS 超过各自的上限时,服务端会分别触发发送限流或消费限流。您可以在控制台查看和调整发送和接收的 TPS 上限配置。
RocketMQ 实例治理结果为什么不符合预期?
实例治理功能为辅助分析工具,其扫描结果仅供参考。用户需对扫描结果进行二次确认和评估,不建议直接依据扫描结果做资源下线等决策。
实例公网访问的每秒入 bit 数统计的是什么流量?
该指标统计所有数据流入流量的总和,包括 TCP 长连接心跳流量和消费者长轮询产生的流量,而非仅统计消息体数据的流量。
HTTP 协议支持死信重投吗?
不支持。HTTP 协议采用短连接方式,当消息进入死信队列后,服务端无法找到对应的客户端连接进行重投。如需处理死信消息,建议使用长连接协议(如 TCP 或 gRPC)接入。
GetConsumerGroupLag 接口查询顺序 Topic 的堆积量为什么不符合预期?
使用 GetConsumerGroupLag 接口查询顺序 Topic 的堆积量时,需确保使用顺序类型的 Group 搭配顺序类型的 Topic 进行组合查询。如果 Group 类型或 Topic 类型不匹配,查询结果可能不准确。
RocketMQ 可以使用默认密钥的主密钥吗?
不可以。RocketMQ 不支持使用默认密钥的主密钥,需要创建实例后单独创建专用的 AccessKey 密钥对。
访问控制白名单如何配置?
VPC 接入点仅限同一 VPC 内的资源访问。如需跨 VPC 访问,可通过云企业网打通 VPC 之间的网络。
重要提示:RocketMQ 的访问控制作用在业务层而非网络层。即使网络层面可以 ping 通接入点地址,也不代表业务请求能够正常访问。请确保在控制台正确配置访问控制白名单。
如何变更安全组?
您可以通过升配操作变更安全组。请注意,变更前后的安全组类型必须保持一致,否则变更操作会失败并报错。
云消息队列 RocketMQ 版与开源 RocketMQ 的版本是否对应?
云消息队列 RocketMQ 版(商业版)的版本号与开源 Apache RocketMQ 的版本号不存在直接对应关系。
如何通过 Terraform 创建 5.x Serverless 实例?
请参见alicloud_rocketmq_instance文档进行配置。
以下参数需要特别注意:
commodity_code 需设置为 "ons_rmqsrvlesspost_public_cn"。
security_group_ids 参数的类型为 String。
如果仅通过 VPC 访问,internet_info 配置如下:
internet_info {
internet_spec = "disable"
flow_out_type = "uninvolved"
}如果需要开启公网访问,internet_info 配置如下:
internet_info {
internet_spec = "enable"
flow_out_type = "payByTraffic"
}安全组的生效范围是什么?
安全组仅对内网接入点(即 VPC 接入点)生效。公网接入点的访问限制通过访问控制功能实现,访问控制在请求到达 RocketMQ 服务端后进行校验。
同步任务中将 Topic 消息同步到另一个 Topic 的逻辑是什么?
同步任务的工作逻辑为:使用源端配置的 Group ID 消费源 Topic 的消息,然后通过事件总线(EventBridge)将消息发送到目标 Topic。
注意:
在同步任务配置中,如果使用的 Group ID 与源 Topic 已有业务使用的 Group ID 相同,同步任务会作为该消费组的一个消费者参与消费,导致部分源 Topic 的消息被同步任务消费,影响原有业务。
建议为同步任务配置一个独立的、未被其他业务使用的 Group ID,避免影响已有的消息收发。
配置 RocketMQ Global Replicator 有哪些注意事项?
对于阿里云实例,需要注意以下权限配置:
1)源集群的 ACL 用户需要具备该 Group ID 的全部权限以及源 Topic 的读权限。目标集群的 ACL 用户需要具备目标 Topic 的写权限。
2)如果 ACL 用户配置了 IP 白名单:源集群 ACL 用户的白名单应至少包含源集群的 vSwitch 网段,目标集群 ACL 用户的白名单应至少包含目标集群的 vSwitch 网段。Global Replicator 默认通过 VPC 访问。
Spring Boot 如何设置重试次数?
可通过以下两种方式设置:
方式一:配置文件方式(全局生效)
在配置文件中添加以下配置:
rocketmq.consumer.maxReconsumeTimes=3方式二:注解方式(单个消费者生效)
在 @RocketMQMessageListener 注解中指定 maxReconsumeTimes 参数:
@RocketMQMessageListener(maxReconsumeTimes = 28)报错 Error accessing configuration file 如何解决?
完整报错信息为 java.util.ServiceConfigurationError: Error accessing configuration file,原因是 SPI 配置文件在运行时丢失。
解决方案:确保在全局范围内仅初始化一次 ClientServiceProvider.loadService(),避免多次加载导致 SPI 文件冲突。
报错 No route info of this topic 如何解决?
可能由以下原因导致:
原因一:SDK 版本不支持公网访问。Remoting 协议 SDK 的 5.0.0 版本不支持通过公网接入点访问,请升级 SDK 至 5.3.3 或更高版本。
原因二:IP 白名单变化导致连接异常。服务端 IP 白名单发生变化时,客户端可能无法正常连接。请检查实例的访问控制白名单配置。
Python 消费消息时消息体编码异常如何解决?
需要根据发送端的编码方式,在接收端显式设置 Base64 解码参数。如果发送端对消息体进行了 Base64 编码,接收端需要在消费时指定 base64=True 进行相应的解码处理。如果发送端未设置 Base64 编码,消费时也需要显式指定 base64=False,否则会导致解码异常。
ECS 上访问 RocketMQ 正常,迁移到 ACK 后报错如何解决?
从 ECS 迁移到 ACK(容器服务)环境后,可能出现 SSL 依赖缺失或 Topic Route 找不到等问题。请按以下步骤排查:
检查容器内的域名解析和网络连通性,确认容器能够正常访问 RocketMQ 接入点。
如果使用 ONS SDK 2.x 版本,可能存在容器环境兼容性问题,建议降级到 1.9.1 版本。
Docker 镜像建议使用
openjdk:8替代 alpine 版本,或在项目中引入 Jetty NPN 相关依赖以解决 SSL 握手问题。
RocketMQ 消费节点注册失败如何解决?
铂金版实例升级后,资源会迁移到独占集群。迁移期间,原集群中的队列上消费者暂时无消息可消费,断连后系统会自动恢复。对于定时消息类型的 Topic,断连持续时间可能较长。如需提前断连以加速恢复,可提交工单联系技术支持处理。
报错 GRPC_CALL_ERROR_TOO_MANY_OPERATIONS 是什么原因?
该错误表示客户端的 gRPC 请求数超过了最大并发操作限制。请检查客户端是否存在过多的并发请求,适当降低并发度。
OXS 区的服务如何访问 RocketMQ?
OXS 区仅支持访问售卖区的 VPC 接入点,2021 年之后不再支持 OXS 新接入。如需接入,可通过公网接入点方式访问。
Spring 框架下使用 RocketMQMessageListener 注解报错订阅关系不一致如何解决?
@RocketMQMessageListener 注解的 topic 参数仅支持配置单个 Topic。如果同一 Group 需要监听多个 Topic,需要创建多个 PushConsumer 类分别监听不同的 Topic。这种方式会导致控制台显示订阅关系不一致的提示,此为已知问题,不影响消息的正常消费。
创建 Producer 时有哪些注意事项?
Producer 应设计为单例模式,避免每次使用时创建和销毁。建议在应用启动时创建 Producer,在应用关闭时销毁 Producer,使其与应用保持相同的生命周期。
Producer 使用长连接并通过心跳机制保持连接状态。即使在业务空闲期间,连接也不会断开。
重启服务时报错 DEADLINE_EXCEEDED 如何处理?
请确认客户端是否执行了优雅下线操作。如果客户端未正确执行优雅下线,可能会导致服务端在超时后返回 DEADLINE_EXCEEDED 错误。
迁移上云时报错 IP 地址不可用如何处理?
请参见迁移上云操作,并按以下步骤排查:
1)除确认网络地址可达外,还需确认自建集群中至少存在一个自定义 Topic。迁移上云流程会校验集群元数据是否存在,如果没有自定义 Topic 会导致校验失败。
2)获取报错的 RequestId。如果页面未直接显示,可以通过浏览器开发者工具(F12)查看 Network 中 api.json?action=ListMigrationOperations 请求的响应,获取 RequestId。
3)如果使用 VPC 接入方式,Broker 地址需要手动录入内网地址,避免自动获取到公网地址导致网络不通。
什么情况下可以使用 VPC 接入点访问 RocketMQ?
4.x 实例不依赖 VPC 网络,无需打通 VPC,只要在阿里云同地域的内网环境中即可访问,但不支持跨地域访问。5.x 实例基于 VPC 网络,VPC 打通后即可访问。
报错 UnsupportedOperationException: Client service provider not found 如何处理?
调用 ClientServiceProvider.loadService() 时抛出此异常,通常是因为 ClientServiceProvider 未设计为全局单例,在并发场景下重复加载导致冲突。
请确保 ClientServiceProvider 实例在应用中全局唯一。
同时,Producer 也应设计为单例。避免每次发送消息时都创建新的 Producer 实例且不关闭,这样会导致资源泄漏。
4.x SDK 消息轨迹获取的 IP 不符合预期如何处理?
该问题通常由 SDK 版本过低导致。请将 SDK 升级到最新版本后重试。
如何通过 ModifyInstance 接口变更 RocketMQ 实例?
调用 ModifyInstance 接口时,需要设置 Parameter 中的以下参数:
主系列:key=series_type,可选值为 standard(标准版)、professional(专业版)、ultimate(铂金版)。
实例规格:key=msg_process_spec。
注意:实例创建成功后,主系列仅支持单向升级,不支持降级。升级顺序为:标准版 > 专业版 > 铂金版。
更多信息,请参见实例变更服务。
RocketMQ 的消息收发计费项为什么出现小数?
请确认计量单位。消息收发的计费单位可能为百万条或其他较大的计量单位,因此实际用量在该单位下会显示为小数。
RocketMQ 批量发送如何计算 TPS?
批量发送仍按发送条数和消息体大小计算 TPS。例如,一次批量发送 10 条消息,10 条消息总大小为 4 KB,此时 TPS 计为 10。
批量发送的主要优势在于提升客户端的 QPS 吞吐能力,使业务在同一时间内能够处理更多的请求。
控制台 Group 设置重试次数不生效?
5.0 实例中,Remoting 协议客户端以客户端侧配置为准,控制台设置的重试次数不会生效。gRPC 协议客户端支持通过控制台设置重试次数。
为什么看不到消息轨迹?
Remoting 协议客户端默认未开启消息轨迹功能。需要在客户端代码中进行以下设置:
// 设置接入方式为阿里云,在使用云上消息轨迹的时候,需要设置此项;如果不开启消息轨迹功能,则不需要运行此项。
producer.setAccessChannel(AccessChannel.CLOUD);
// 5.3.0版本及以上SDK开启消息轨迹除需设置AccessChannel外,需要增加,EnableTrace参数
producer.setEnableTrace(true);注意:如果消息轨迹超过存储时长,也会看不到消息轨迹;消息轨迹的存储时长与实例规格相关,详见消息轨迹。
为什么在控制台查不到消息?
消息存储时长默认为 3 天,超过存储时长的消息会被自动清除。对于 5.0 版本实例,您可以在实例详情页调整消息保存时长(24~720 小时);4.0 版本实例默认保存 3 天,无法调整。如果在控制台的消息查询页面查不到消息,请确认查询的时间范围在消息存储时长之内。
RocketMQ 控制台消息轨迹与实际执行时间不匹配?
Remoting 协议下的 4.0 版本客户端采用批量定时提交位点的机制。控制台中的消息轨迹时间基于 Remoting 操作日志的记录时间,可能与消息的实际消费时间存在偏差。如需获取准确的消费时间数据,建议以监控指标数据为准。
广播模式下控制台消息堆积显示不准确?
广播消费模式下,服务端不维护消费位点,位点由各客户端在本地独立维护。因此控制台无法准确获取每个客户端的消费进度,导致消息堆积数据显示不准确。此外,广播模式不支持位点重置功能。
PushConsumer 客户端指标监控在什么情况下有数据?
仅当客户端通过 gRPC 方式接入时,PushConsumer 客户端监控面板才会显示指标数据。使用 Remoting 协议接入的客户端不支持该监控功能。
为什么消息轨迹中的查询数量和消息查询中的查询数量不一致?
消息轨迹和消息本身的保存时长不同,因此在不同时间范围内查询时,两者的数量可能存在差异。
为什么消息轨迹没有显示多个 Group 的消费记录?
不同协议(gRPC 和 Remoting)客户端产生的消息轨迹无法在同一视图中同时显示。请注意:ONS Client 2.x 版本使用 gRPC 协议,1.x 版本使用 Remoting 协议。
监控 TPS 上涨,如何判断是否符合预期?
监控面板中显示的 TPS 取的是每分钟内的峰值 TPS。以发送 TPS 为例,如果一分钟内的消息发送速率不均匀,存在突发流量,则峰值 TPS 可能偏高,导致监控图表上显示的 TPS 偏大,但整体发送量可能仍然平稳。建议结合消息发送总量综合判断。
5.x 实例为什么无法使用一键消息收发功能?
请按以下步骤逐项排查:
1)在控制台的访问控制 > 智能身份识别页面,确认已开启内网免身份识别开关。
2)检查是否配置了白名单。一键消息收发功能通过函数计算(FC)调用实例的 VPC 地址,如果实例配置了白名单,需要将实例所在 VPC 网段添加至白名单中。
3)确认账户是否存在欠费。一键消息收发功能会调用函数计算服务,该服务会产生相应费用。
消息查询结果的数量为什么不准确?
原因:
当消息体较大时,消息查询可能因数据量限制导致返回结果不完整。
解决方案:
1)缩小查询时间范围,使查询条件更加精确。
2)控制单条消息体大小,建议不超过 1 KB。
HTTP 协议的消费组为什么看不到订阅关系?
HTTP 协议通过拉取请求获取订阅关系信息。如果拉取频率过低,服务端可能未能及时获取到数据,导致订阅关系无法显示。建议适当提高拉取频率后再查看。
通过 Topic 和消息 ID 查询的消息体大小为什么不一致?
通过 Topic 查询返回的消息体大小为压缩后的大小,而通过消息 ID 查询返回的是消息的实际大小。
5.0 实例 gRPC 协议 SDK 如何给消息设置 Key?
使用 rocketmq-v5-client-spring-boot-starter(版本 2.3.1 及以上)时,设置消息 Key 需要进行头部键名转换:
setHeader(toRocketHeaderKey(RocketMQHeaders.KEYS), key)5.x gRPC SDK 是否支持发送消息时开启压缩?
不支持。5.x 系列实例的 gRPC SDK 暂不支持在发送消息时开启压缩功能。
开源 RocketMQ 客户端如何发送和验证顺序消息?
发送顺序消息:
使用开源客户端发送顺序消息时,需要通过 MessageQueueSelector 接口实现分区选择逻辑,将具有相同 ShardingKey 的消息发送到同一个队列,从而实现分区顺序。
请注意,分区顺序性仅在单个发送者且使用相同 ShardingKey 的前提下才能保证。不同发送者之间不保证顺序性。
验证顺序消息:
您可以通过打印日志来验证消息的发送和消费是否满足顺序性要求:
生产者:通过 SendResult 中的返回信息,确认消息发送到了哪个 Broker 的哪个队列。
消费者:通过消息对象中的信息,确认该消息来自哪个 Broker 的哪个队列。
如何使用批量发送消息功能?
使用批量发送功能需要同时满足以下条件:
1)实例为 5.x 系列。
2)服务端版本不低于 5.0-rmq-20250721-1。您可以在控制台的实例详情页查看当前服务端版本号。
3)仅开源 4.x 和 5.x 客户端支持批量发送,商业版 SDK 暂不支持。
更多信息,请参见各版本SDK说明。
消息延迟消费如何排查?
消息延迟消费时,请检查以下两方面:
是否存在消息堆积:查看控制台中的消息堆积量指标,确认消费速度是否跟上生产速度。
TPS 是否超过实例上限导致限流:当消费 TPS 超过实例规格上限时,服务端会触发限流,导致消费延迟。
使用 SimpleConsumer 批量消费时可以并发拉取消息吗?
单次拉取上限为 32 条消息。支持多线程并发拉取,无需等待前一批消息 ACK 完成即可发起新的拉取请求。
但对于顺序消息,最大并发度受限于队列数量。同一队列中的消息必须先 ACK 前一批,才能拉取下一批,以保证消费顺序。
RocketMQ 消息重复消费如何解决?
使用批量拉取模式时,同一批消息需要在不可见时间内全部完成 ACK。如果部分消息未在不可见时间内完成 ACK,整批消息都会被重新投递,导致重复消费。建议根据实际消费耗时合理设置不可见时间,并在业务侧做好幂等处理。
消费位点是同步提交还是异步提交?
消费位点采用异步提交机制。客户端在本地缓存消费位点,然后定时批量提交到服务端。Remoting 协议客户端的默认提交间隔约为 5 秒,gRPC 协议客户端的重复投递量相对更少。如果客户端宕机,本地缓存的消费位点可能尚未提交到服务端,重启后会从服务端记录的旧位点开始消费,导致部分消息被重复消费。
本地拉取消息的线程和消费消息的线程是同一个线程池吗?
不是同一个线程池。拉取线程和消费线程分别使用独立的线程池。当 InFlight 消息量(已拉取但未消费完成的消息数)过大时,客户端会暂停拉取新消息,以避免内存溢出。
消息没有被消费的可能原因是什么?
可能是由于消息的 Tag 发生了变化,导致消费者的订阅过滤条件与消息 Tag 不匹配,消息被过滤而未被投递给消费者。请检查生产端发送消息时设置的 Tag 与消费端订阅时指定的 Tag 是否一致。
HTTP 协议的重试策略是什么?
consumeMessage() 方法不区分消息类型,对所有失败消息采用固定 5 分钟间隔的重试策略。如果需要消费顺序消息,请使用 consumeMessageOrderly() 方法,该方法会执行顺序消息的重试策略。
消息重复消费的可能原因是什么?
消费轨迹中显示消费成功,不代表消费位点已成功提交到服务端。消费位点是异步提交的,当 Rebalance 发生在位点尚未提交时,新的消费者会从旧的 offset 开始消费,导致部分消息被重复消费。建议在业务侧实现幂等处理以应对消息重复。
订阅关系不一致如何排查?
同一 Group 下的所有消费者必须订阅相同的 Topic 和 Tag,否则会出现订阅关系不一致的问题。
如何判断是否存在订阅关系不一致?
可通过以下方式判断:
参考行为约束,检查代码中同一 Group 下各消费者的订阅配置。
在控制台的 Group 详情页,使用查看分布功能,对比该Group下不同订阅关系的消费者是否一致,如果不一致,也会导致订阅关系不一致。注意:消费者频繁上下线可能导致间歇性的订阅关系不一致。
订阅关系不一致可能导致哪些问题?
订阅关系不一致可能导致多种消费异常,包括但不限于消费延迟、消息丢失、消费停滞等。可通过查看客户端日志中的 Rebalance 记录来辅助排查。
顺序消息为什么不同的线程消费了同一个 MessageGroup 的消息?
这是符合预期的行为。在顺序投递模式下,多个线程可以消费同一分区的消息,但系统会保证前一个线程处理完当前消息后,后续线程才能消费该分区的下一条消息,从而确保消费顺序。
广播消费模式下新增消费者会触发 Rebalance 吗?
不会。广播消费模式下,每个消费者独立消费全量消息,新增消费者不会触发 Rebalance。
RocketMQ 广播消费模式有哪些注意事项?
广播消费模式下,客户端重启后会从最新的消息位点开始消费。需要注意的是,"最新消息"是指重启时刻 Topic 中最新的一条消息,而非客户端重启后才生产的消息。如果重启之后没有新的消息生产,则会消费最近的一条消息。
控制台的明文消息体如何在代码中解析?
使用以下代码将消息体解析为字符串:
CharBuffer msgBody = StandardCharsets.UTF_8.decode(messageView.getBody());为什么客户端与服务端消费消息的打印时间不一致?
服务端记录的消息推送时间基于 TCP 层面的确认时间,而客户端记录的时间是业务侧接收到消息时的时间。由于网络传输延迟等因素,客户端记录的接收时间可能会晚于服务端的推送确认时间,这属于正常现象。
HTTP 协议顺序消费的重试次数为什么不准确?
通过 HTTP 协议进行顺序消费时,消费端需要串行处理每批拉取到的消息。同一批消息共用一个重试次数,以最先提交的消息为准,而非每条消息各自维护独立的重试次数。
因此,部分消息的重试次数可能被重置。建议业务逻辑不要依赖此重试次数进行判断。
顺序消费有哪些注意事项?
使用 Remoting 协议的客户端,顺序消费以客户端实际消费逻辑为准,不需要在控制台将消费组的消息投递顺序设置为顺序投递。
对普通消息设置顺序投递(即普通消息类型的消费组设置为顺序投递模式),也会按 TPS*5 计算计费量。
通过 GetConsumerGroupLag 查询消费组堆积量为什么为 0?
原因:
如果消费组从未成功拉取过消息,服务端的消费位点尚未初始化,此时查询堆积量会返回不准确的结果。
解决方案:
请先使用该消费组正常消费一批消息,等待消费位点初始化完成后,即可正常查询堆积量。
修改重试策略后为什么未生效?
修改重试策略后,需要重启客户端才能使新的重试策略生效。
4.x 实例的死信消息下载后如何解码?
下载死信消息后,消息体为 Base64 编码格式,需要通过以下方式进行解码:
StandardCharsets.UTF_8.decode(ByteBuffer.wrap(Base64.getDecoder().decode("xxxxxxx")))
消息超时时间与设置值不一致是什么原因?
客户端重启会导致服务端重置消息状态,使消息重新变为可消费状态。此时消息的超时时间会被重新计算,可能与最初设置的超时时间不一致。
重启后,已超时的消息将被重新投递消费。