跳至主要内容
版本: 5.0

常见问题解答

关于 RocketMQ 项目的常见问题

1 基本

  1. 为什么我们应该使用 RocketMQ 而不是选择其他产品?

    请参考 为什么选择 RocketMQ

  2. 我是否需要安装任何其他软件才能使用 RocketMQ,例如 ZooKeeper?

    不需要,RocketMQ 可以独立运行。

2 使用

  1. 新创建的 ConsumerGroup 从哪里开始消费消息?

    1)当 5.x SDK 首次上线时,它将从服务器上的最新消息开始消费,从队列尾部开始。再次重启后,它将继续从上次消费位置开始消费。

    2)3.x/4.x SDK 更加复杂。如果首次启动是在发送消息后的三天内,消费者将从服务器上保存的第一条消息开始消费。如果发送的消息超过三天,消费者将从服务器上的最新消息开始消费,从队列尾部开始。再次重启后,它将继续从上次消费位置开始消费。

  2. 消费失败时,如何重新消费消息?

    1)在集群模式下,消费业务逻辑代码将返回消费失败状态,或抛出异常。如果消息消费失败,它将根据设置的最大重试次数进行重试,然后消息将被丢弃。

    2)在广播消费模式下,广播消费仍然保证消息至少被消费一次,但没有提供重发选项。

  3. 消费失败时,如何找到失败的消息?

    1)使用基于时间的主题查询可以查询一段时间内的消息。

    2)使用主题和消息 ID 可以准确地查询消息。

    3)使用主题和消息 Key 可以准确地查询具有相同消息 Key 的所有消息。

  4. 消息只会被传递一次吗?

    RocketMQ 确保所有消息至少被传递一次。在大多数情况下,消息不会重复。

  5. 如何添加新的 Broker?

    1)启动一个新的 Broker 并将其注册到 NameServer 的 Broker 列表中。

    2)默认情况下,只有内部系统主题和消费者组会自动创建。如果您希望在新节点上拥有您的业务主题和消费者组,请从现有 Broker 中复制它们。我们提供管理工具和命令行来处理此问题。

3 配置依赖

以下答案是默认值,可以通过配置修改。

  1. 消息可以在服务器上保存多长时间?

    消息最多保存 3 天。超过 3 天未使用的消息将被删除。

  2. 消息体的尺寸限制是多少?

    通常是 256KB。

  3. 如何设置消费者线程的数量?

    启动消费者时,您可以设置属性。参数名称因版本而异。

4 错误

  1. APPLY_TOPIC_URL

    • 异常信息

      topic[xxx] not exist, apply first please!
    • 原因

      1)当 Producer 发送消息或 Consumer 消费消息时,如果无法获取 Topic 的路由信息,就会发生此异常。

    • 解决方案

      1)确保 NameServer 确实包含 Topic 的路由信息。您可以使用管理工具或 Web 控制台通过 TopicRoute 从 NameServer 查询路由信息;

      2)确保 Broker 和 Consumer 连接到同一个 NameServer 集群;

      3)确保主题的队列权限对 Producer 为 6 (rw-),或对 Consumer 至少为 2 (-w-);

      如果找不到主题,请通过管理工具命令 updateTopic 或 Web 控制台在 Broker 上创建它。

  2. 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)Producer 或 Consumer,在获取 NameServer 地址信息时出现错误。

    • 解决方案

      1)请参考:5.1 客户端寻址

  3. 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 正常关闭,然后再次启动。

  4. CLIENT_PARAMETER_CHECK_URL

    • 异常信息

      consumerGroup can not equal ...

      allocateMessageQueueStrategy is null ...

      Long polling mode, the consumer consumerTimeoutMillisWhenSuspend must greater than brokerSuspendMaxTimeMillis ...

      除了上述异常外,还可能存在此处未列出的其他异常。

    • 原因

      1)Consumer 参数验证失败。

    • 解决方案

      1)请参考: 5.2 客户端配置

  5. SUBSCRIPTION_GROUP_NOT_EXIST

    • 异常信息

      subscription group not exist
    • 原因

      1)如果 Consumer Group 或 DleayQueue 在获取订阅信息时遇到错误。

    • 解决方案

      1)确保 Consumer 对 Topic 的订阅信息与 NameServer 中的 Topic 信息一致。

      2)确保 Broker 和 Consumer 连接到同一个 NameServer 集群。

      3)确保主题的队列权限对 Producer 为 6 (rw-),或对 Consumer 至少为 2 (-w-)

  6. CLIENT_SERVICE_NOT_OK

    • 异常信息

      The xxx service state not OK, maybe started once
    • 原因

      1)在同一个 JVM 中使用相同的 Producer/Consumer Group 启动多个 Producer/Consumer 实例可能会导致客户端无法启动。

    • 解决方案

      1)确保只为给定的 Producer/Consumer Group JVM 启动一个 Producer/Consumer 实例。

  7. NO_TOPIC_ROUTE_INFO

    • 异常信息

      No route info of this topic:
    • 原因

      1)如果消息被发送到 Producer 不可用的主题,就会发生这种情况。

    • 解决方案

      1)确保 Producer 能够连接到 NameServer 并从中检索路由元数据。

      2)确保 NameServer 包含主题的路由元数据。您可以使用管理工具或 Web 控制台使用 TopicRoute 从 NameServer 查询路由元数据。

      3)确保您的 Broker 向 Producer 连接到的同一个 NameServer 列表发送心跳。

      4)确保主题具有 6 (rw-) 权限,或至少 2 (-w-) 权限。

      如果找不到主题,请通过管理工具命令 updateTopic 或 Web 控制台在 Broker 上创建它。

  8. LOAD_JSON_EXCEPTION

    • 异常信息

      readLocalOffset Exception
    • 原因

      1)在广播模式下,消费者在加载本地 offsets.json 文件时出现错误。

      2)损坏的 fastjson 文件也会导致相同的问题。

    • 解决方案

      1)检查使用的 fastjson 版本和 RocketMQ 版本是否一致。

      2)升级 fastjson 版本。

  9. SAME_GROUP_DIFFERENT_TOPIC

    • 异常信息

      the consumer's group info/subscription not exist
    • 原因 1)Consumer 对 Topic 的订阅信息不存在。

    • 解决方案

      1)检查 Consumer 所属的 Consumer Group 是否存在。

      2)检查 Consumer 订阅的 Topic 是否存在。

  10. MQLIST_NOT_EXIST

    • 异常信息

      Can not find Message Queue for this topic
    • 原因 1)对于 Producer,无法根据 Topic 获取相应的 Queue 信息。

    • 解决方案

      1)确保已为 Topic 正确配置 Queue 信息。

      2)确保与 Topic 相对应的 Queue 至少具有 2 (-w-) 权限。

  11. SEND_MSG_FAILED

    • 异常信息

      Send [xxx] times, still failed, cost [xxx]ms, Topic: xxx, BrokersSent ...
    • 原因 1)Producer 消息发送异常。在 SYNC 模式下总共发送 3 次,在 ASYNC 和 ONEWAY 模式下发送 1 次。

    • 解决方案 1)Producer 发送消息的超时参数是否过小。

      2)确保 Broker 正常。

      3)确保 Producer 和 Broker 之间的连接正常。

  12. UNKNOWN_HOST_EXCEPTION

    • 异常信息

      InetAddress java.net.InetAddress.getLocalHost() throws UnknownHostException
    • 原因

      1)主机上可能存在多个网络接口,一个接口可能绑定到多个 IP 地址。

    • 解决方案

      1)确保与主机对应的 IP 可以正常访问,并使用 Ping 等网络命令检查网络状况。

5 其他

  1. Broker 崩溃的影响是什么?

    1)主节点崩溃

    消息将无法再发送到 Broker 集群,但如果您还有另一个可用的 Broker 集群,只要主题存在,消息仍然可以发送。消息仍然可以从从节点消费。

    2)一些从节点崩溃

    只要有另一个工作从节点,发送消息就不会受到影响。消费消息不会受到影响,除非消费者组设置为首先从从节点消费。默认情况下,消费者组从主节点消费。

    3)所有从节点崩溃

    发送消息到主节点不会受到影响,但如果主节点是 SYNC_MASTER,Producer 将收到 SLAVE_NOT_AVAILABLE,表明消息未发送到任何从节点。消费消息不会受到影响,除非消费者组设置为首先从从节点消费。默认情况下,消费者组从主节点消费。