常见问题
关于 RocketMQ 项目的常见问题
1 基础
为什么选择 RocketMQ 而不是其他产品?
我需要安装任何其他软件才能使用 RocketMQ 吗,例如 ZooKeeper?
不需要,RocketMQ 可以独立运行。
2 使用
新创建的 ConsumerGroup 从哪里开始消费消息?
1)5.x SDK 首次上线时,会从服务端最新消息(即队列末尾)开始消费。再次重启后,会从上次消费位置继续消费。
2)3.x/4.x SDK 较为复杂。如果首次启动时,发送消息在三天内,消费者会从服务端第一个保存的消息开始消费。如果发送消息超过三天,消费者会从服务端最新消息(即队列末尾)开始消费。再次重启后,会从上次消费位置继续消费。
消费失败时,如何再次消费消息?
1)集群模式下,消费业务逻辑代码会返回消费失败状态,或者抛出异常。如果消息消费失败,会根据设置的最大重试次数进行重试,然后消息会被丢弃。
2)在广播消费模式下,广播消费仍然保证消息至少消费一次,但不提供重发选项。
消费失败时,如何查找失败消息?
1)使用基于时间的 Topic 查询,可以在一段时间内查询消息。
2)使用 Topic 和消息 ID 精确查询消息。
3)使用 Topic 和消息 Key 精确查询所有具有相同消息 Key 的消息。
消息只会投递一次吗?
RocketMQ 确保所有消息至少投递一次。在大多数情况下,消息不会重复。
如何添加新的 Broker?
1)启动一个新的 Broker,并将其注册到 NameServer 的 Broker 列表中。
2)默认情况下,只有内部系统 Topic 和 Consumer Group 会自动创建。如果您希望在新节点上拥有您的业务 Topic 和 Consumer Group,请从现有 Broker 复制它们。我们提供管理工具和命令行来处理此问题。
3 配置依赖
以下答案为默认值,可以通过配置进行修改。
消息在服务端可以保存多长时间?
消息最多存储 3 天。超过 3 天未使用的消息将被删除。
消息体的最大大小限制是多少?
通常为 256KB。
如何设置消费者线程数?
启动消费者时,可以设置此属性。参数名称因版本而异。
4 错误
APPLY_TOPIC_URL
异常信息
topic[xxx] not exist, apply first please!
原因
1)当生产者发送消息或消费者消费消息时,如果无法获取 Topic 的路由信息,则会发生此异常。
解决方案
1)确保 NameServer 确实包含 Topic 的路由信息。您可以使用管理工具或 Web 控制台通过 TopicRoute 从 NameServer 查询路由信息;
2)确保 Broker 和消费者连接到同一个 NameServer 集群;
3)确保 Topic 的队列权限对于生产者为 6 (rw-) 或对于消费者至少为 2 (-w-);
如果找不到 Topic,请通过管理工具命令 updateTopic 或 Web 控制台在 Broker 上创建它。
NAME_SERVER_ADDR_NOT_EXIST_URL
异常信息
No name server address, please set it
或
connect to xxx failed, maybe the domain name xxx not bind in /etc/hosts
原因
1)生产者或消费者,获取 NameServer 地址信息时出错。
解决方案
1)请参考:5.1 客户端寻址
GROUP_NAME_DUPLICATE_URL
异常信息
The producer group[xxx] has been created before, specify another name please.
原因
1)同名 Consumer Group 已启动且注册失败。
解决方案
1)重命名一个新的 Consumer Group。
2)同名 Consumer Group 正常关闭后再次启动。
CLIENT_PARAMETER_CHECK_URL
异常信息
consumerGroup can not equal ...
或
allocateMessageQueueStrategy is null ...
或
Long polling mode, the consumer consumerTimeoutMillisWhenSuspend must greater than brokerSuspendMaxTimeMillis ...
除了上述异常,可能还有其他未在此列出的异常。
原因
1)消费者参数验证失败。
解决方案
1)请参考: 5.2 客户端配置
SUBSCRIPTION_GROUP_NOT_EXIST
异常信息
subscription group not exist
原因
1)如果 Consumer Group 或 DelayQueue 在获取订阅信息时遇到错误。
解决方案
1)确保消费者的 Topic 订阅信息与 NameServer 中的 Topic 信息一致。
2)确保 Broker 和消费者连接到同一个 NameServer 集群。
3)确保 Topic 的队列权限对于生产者为 6 (rw-) 或对于消费者至少为 2 (-w-)
CLIENT_SERVICE_NOT_OK
异常信息
The xxx service state not OK, maybe started once
原因
1)在同一个 JVM 中使用相同的生产者/消费者组启动多个生产者/消费者实例可能会导致客户端启动失败。
解决方案
1)确保每个生产者/消费者组的 JVM 只启动一个生产者/消费者实例。
NO_TOPIC_ROUTE_INFO
异常信息
No route info of this topic:
原因
1)如果消息发送到一个生产者不可用的 Topic,就会发生这种情况。
解决方案
1)确保生产者能够连接到 NameServer 并从中检索路由元数据。
2)确保 NameServer 包含 Topic 的路由元数据。您可以使用管理工具或 Web 控制台通过 TopicRoute 从 NameServer 查询路由元数据。
3)确保您的 Broker 正在向您的生产者所连接的 NameServer 列表发送心跳。
4)确保 Topic 具有权限 6 (rw-) 或至少 2 (-w-)。
如果找不到 Topic,请通过管理工具命令 updateTopic 或 Web 控制台在 Broker 上创建它。
LOAD_JSON_EXCEPTION
异常信息
readLocalOffset Exception
原因
1)在广播模式下,消费者加载本地 offsets.json 文件时出现错误。
2)损坏的 fastjson 文件也可能导致同样的问题。
解决方案
1)检查使用的 fastjson 版本和 RocketMQ 版本是否一致。
2)升级 fastjson 版本。
SAME_GROUP_DIFFERENT_TOPIC
异常信息
the consumer's group info/subscription not exist
原因 1)消费者订阅的 Topic 信息不存在。
解决方案
1)检查消费者所属的 Consumer Group 是否存在。
2)检查消费者订阅的 Topic 是否存在。
MQLIST_NOT_EXIST
异常信息
Can not find Message Queue for this topic
原因 1)对于生产者,无法根据 Topic 获取相应的队列信息。
解决方案
1)确保已正确配置 Topic 的队列信息。
2)确保 Topic 对应的队列至少具有 2 (-w-) 权限。
SEND_MSG_FAILED
异常信息
Send [xxx] times, still failed, cost [xxx]ms, Topic: xxx, BrokersSent ...
原因 1)生产者消息发送异常。SYNC 模式下总共发送 3 次,ASYNC 和 ONEWAY 模式下发送 1 次。
解决方案 1)生产者发送消息的超时参数是否太小。
2)确保 Broker 正常。
3)确保生产者与 Broker 之间的连接正常。
UNKNOWN_HOST_EXCEPTION
异常信息
InetAddress java.net.InetAddress.getLocalHost() throws UnknownHostException
原因
1)主机上可能存在多个网络接口,并且一个接口可能绑定多个 IP 地址。
解决方案
1)确保主机对应的 IP 可以正常访问,并使用 Ping 等网络命令检查网络情况。
5 其他
Broker 崩溃有什么影响?
1)主节点崩溃
消息无法再发送到 Broker 集群,但如果您有另一个可用的 Broker 集群,只要 Topic 存在,消息仍然可以发送。消息仍然可以从从节点消费。
2)部分从节点崩溃
只要有另一个正常工作的从节点,发送消息将不受影响。消费消息将不受影响,除非消费者组设置为优先从从节点消费。默认情况下,消费者组从主节点消费。
3)所有从节点崩溃
向主节点发送消息将不受影响,但如果主节点是 SYNC_MASTER,生产者将收到 SLAVE_NOT_AVAILABLE,表示消息未发送到任何从节点。消费消息将不受影响,除非消费者组设置为优先从从节点消费。默认情况下,消费者组从主节点消费。