定义
回溯消费是指 Consumer 已经消费成功的消息,由于业务上需求需要重新消费,要支持此功能,Broker 在向 Consumer 投递成功消息后,消息仍然需要保留。并且重新消费一般是按照时间维度,例如由于 Consumer 系统故障,恢复后需要重新消费 1 小时前的数据,那么 Broker 要提供一种机制,可以按照时间维度来回退消费进度。RocketMQ 支持按照时间回溯消费,时间维度精确到毫秒。
Demo
我们仍然是利用 Spring Cloud Stream 的编程模型 + Spring Cloud Alibaba RocketMQ 来实现。
理论
在消费时,可以设置一个字段 ConsumeFromWhere(源码位置在:org.apache.rocketmq.common.consumer.ConsumeFromWhere),从哪开始消费。可选参数,去掉 Deprecated 的,剩下的就是
public enum ConsumeFromWhere {
CONSUME_FROM_LAST_OFFSET,
CONSUME_FROM_FIRST_OFFSET,
CONSUME_FROM_TIMESTAMP,
}
- CONSUME_FROM_LAST_OFFSET:从最后的偏移量开始消费
- CONSUME_FROM_FIRST_OFFSET:从最小偏移量开始消费
- CONSUME_FROM_TIMESTAMP:从某个时间开始消费
我们需要设置从某个时间开始消费,即配置 CONSUME_FROM_TIMESTAMP
并设置好具体的时间点。
实现
首先还是看一下配置文件
server:
port: 8080
servlet:
context-path: /mq-example
spring:
application:
name: mq-example
cloud:
stream:
bindings:
input-backtracking:
content-type: application/json
destination: test-topic3
group: backtracking-consumer-group
# 定义 name 为