NATS JetStream故障重启后如何从未完成任务的START_JOB开始消费
现有环境
拥有一个生产者,发布的流消息格式如下:
- START_JOB 1 - do_task 1_1 - do_task 1_2 [...] - do_task 1_X - END_JOB 1 - START_JOB 2 - do_task 2_1 - do_task 2_2 - END_JOB 2 - START_JOB 3 - do_task 3_1 - do_task 3_2 [...] - do_task 3_X - END_JOB 3
消息序列遵循以下规则:
START_JOB <job_nr>- 任意数量的
do_task <job_nr>_<task_nr> END_JOB <job_nr>
需求
消费者崩溃或重启后,必须从未确认对应END_JOB的最后一条START_JOB开始,按正确顺序接收后续消息。例如,若消费者在处理do_task 12_34时崩溃,重启后应从START_JOB 12开始,按时间顺序接收所有后续消息。
无效尝试
尝试以下多种配置组合后,重启后仍偶尔出现消息顺序错误:
- 推送/拉取消费者模式
- 使用
AckPolicy All,仅在收到END_JOB时发送ack - 调整
AckWait参数,在启动消费者前延迟AckWait+2秒
问题猜测
推测问题与确认设置有关,可能是当前“START_JOB”->“END_JOB”序列的消息尚未过期导致。调整设置后情况有所改善,但仍受生产者速度、任务间隔等因素影响,也可能存在其他未知问题。
内容的提问来源于stack exchange,提问作者rmweiss
相关产品推荐
相关产品推荐

