美文网首页
消息队列-2 多线程消费如何保证消息不丢

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

作者: NeXt4 | 来源:发表于2020-12-05 16:32 被阅读0次

    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中是否有异常数据。如果有,首先处理这些数据,然后正常消费。

    相关文章

      网友评论

          本文标题:消息队列-2 多线程消费如何保证消息不丢

          本文链接:https://www.haomeiwen.com/subject/eiugwktx.html