SOFAMQ 常见问题

消息队列是否可以在公网访问?

暂不支持,消息的生产者和消费者需要和消息队列所在的 region 网络处于联通状态。

新创建的 Group ID 从哪里开始消费?

  • 如果这个 Group ID 是第一次启动,对于最近新建且消息量较少的 Topic,会从头开始消费,所有的历史消息有可能重复消费一遍;如果是存在时间较长的 Topic,则会忽略历史消息,从启动之后发送的消息开始消费。

  • 如果这个 Group ID 是第二次启动,那么从上次消费的位置开始消费。

  • 如果想从特定位置开始消费,可以通过消息队列控制台的消费位点重置功能,指定到具体的时间开始消费。每次重置只针对特定 Group ID 下的特定 Topic,不会影响其他 Group ID。

消息队列消费失败如何重新消费消息?

  • 集群消费方式

    消费业务逻辑代码如果返回 Action.ReconsumerLater,或者 NULL,或者抛出异常,消息都会走重试流程,最多重试 16 次。如果重试 16 次后,仍然失败,则消息丢弃。您可以通过调用 message.getReconsumeTimes() 方法来获取消息的重试次数。

    每次重试的间隔时间如下:

    第几次重试

    每次重试间隔时间

    1

    10 秒

    2

    30 秒

    3

    1 分钟

    4

    2 分钟

    5

    3 分钟

    6

    4 分钟

    7

    5 分钟

    8

    6 分钟

    9

    7 分钟

    10

    8 分钟

    11

    9 分钟

    12

    10 分钟

    13

    20 分钟

    14

    30 分钟

    15

    1 小时

    16

    2 小时

  • 广播消费方式

    广播消费方式可以保证一条消息至少被消费一次,但消费失败后不做重试操作。

消息发送了,但是没有收到怎么办?

消息队列提供了多种 消息查询 方式:

  • 使用 Topic 按时间范围进行消息查询,可以查询到一段时间内某 Topic 收到的所有消息。

  • 使用 Topic 和 Message ID 对消息进行精准查询。

  • 使用 Topic 和 Message Key 较为精准地查询具有相同 Message Key 的一类消息。

上述方式可以查询到消息的具体内容以及消费情况,如果需要追踪一条消息从生产者发出到被消费者消费的整个链路中各个相关节点的时间地点,可以使用消息队列最新的消息轨迹查询功能,具体使用方式请参考 查询消息轨迹

消息队列是否能保证消息不重复?

绝大多数情况下,消息是不重复的。作为一款分布式消息中间件,在网络抖动、应用处理超时等异常情况下,可以保证消息不丢失,但是无法保证消息不重复。

控制台显示的消息堆积量是否包含了 Topic 下所有 Tag 的消息?

是。

消息生产者将所有类型的 Tag 都发送至同一个 Topic 中,消息按照先后顺序在队列中排列,并维护一个消息写入位点;Group ID 启动时会指明需要订阅的 Tag,并从服务端获取当前的消费位点;服务端从当前 Group ID 的消费位点开始遍历队列中的消息,判断如果消息的 Tag 符合 Group ID 订阅的 Tag 即投递给 Group ID,不符合则跳过该消息。

如下图所示,Group ID 消费位点往前移动,Tag2、Tag3 的消息会在服务端被过滤掉,Tag1 的消息为 Group ID 所需要的,会投递给 Group ID。

消息堆积总量

因此消费者状态页面显示的消费堆积量是未被过滤的堆积总量,包含了所有 Tag 的消息量。