记一次 RocketMQ 消息重复的排查
2025 年的最后一天,记录一下今年遇到的一个 RocketMQ 重复投递消息的问题。本质上是对 Consumer 参数设置的不正确所导致的。
观察到系统在使用 pullConsumer 时存在重复消费的问题,遂查询文档。发现 RocketMQ 存在消费重试。
什么时候消费重试
- 业务处理报错,且错误不可重试:业务当前无法处理这个消息,即使业务重试也不可能成功时,可以使用消费重试进行延迟处理。
- 业务处理报错,且错误可以重试:建议业务在 handler 中自己实现业务重试逻辑。如果确认不成功,再返回错误给 RocketMQ。
延迟时间
无法自定义延迟时间,延迟时间完全取决于重试次数。
| 重复次数 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|
| 延迟时间 | 10s | 30s | 1m | 2m | 3m | 4m | 5m | 6m |
本次排查也是因为观察到重复消费的间隔正好是 15m,与 7 次重试的累计延迟时间是对应的才确定的问题
相关配置
ConsumeTimeoutMillis 不能设置得太小,否则在时限内没有消费则消息会被重复投递。
rmq_client.go
configuration := config.NewDefaultConsumerConfig(settings.ConsumerGroup, settings.Topic, settings.Cluster)
configuration.ConsumeFromWhere = pb.SubscribeRequest_CONSUME_FROM_LATEST
configuration.ConsumeMessageBatchMaxSize = 1
configuration.PullTimeout = time.Millisecond * 10
configuration.SubExpr = settings.Tag
configuration.MaxInFlight = 1
configuration.ConsumeTimeoutMillis = 10 * 1000贡献者
更新日志
2025/12/31 08:27
查看所有更新日志
fd44f-feat(docs): add new articles于