消息队列-2 多线程消费如何保证消息不丢

2020-12-05  本文已影响0人  NeXt4

01 提高消息队列消费性能

1.扩容,增加消费机器和partition
2.多线程消费,但如果需要顺序消费那么就不能用这种方式
3.优化代码,提高消费能力

02 多线程模型如何保证消息不丢
消费者拿到多条消息以后,并行消费就不能保证消费顺序,比如拿到消息1, 2, 3。如果先消费了3并返回了ack,然后消费者宕机了,那么重启之后再次收消息时1和2就丢了。

使用关闭钩子
第一种就是考虑kill -15的情况。这种方式比较简单,只要覆盖ShutdownableThread的shutdown方法即可,应用将有机会执行线程池中的任务,确保消费完毕再关闭应用。

@Override
    public void shutdown() {
        super.shutdown();
        executor.shutdown();
}

使用日志
应用oom,或者直接kill -9了,事情就变得麻烦起来。维护一个单独的日志文件(或者本地db),在commit之前写入一条日志,然后在真正执行完毕之后写入一条对应的日志。当系统启动时,读取这些日志文件,获取没有执行成功的任务,重新执行。

使用redis
这种方式与日志方式类似,但由于redis的效率很高(可达数万),而且方便,是优于日志方式的。

可以使用Hash结构,提交任务的同时写入Redis,任务执行完毕删掉这个值,那么剩下的就是出现问题的消息。

在系统启动时,首先检测一下redis中是否有异常数据。如果有,首先处理这些数据,然后正常消费。

上一篇下一篇

猜你喜欢

热点阅读