美文网首页
消息队列-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 多线程消费如何保证消息不丢

    01 提高消息队列消费性能 1.扩容,增加消费机器和partition2.多线程消费,但如果需要顺序消费那么就不能...

  • 消息队列

    为什么使用消息队列?消息队列有什么优点和缺点? 如何保证消息队列高可用?如何保证消息不被重复消费? kafka,a...

  • SpringBoot整合RabbitMQ——RabbitMQ进阶

    rabbitMQ如何保证如果消息发送失败,保证其消息不丢失、怎么设置消息过期时间以及死信队列是如何在消息消费失败时...

  • 消息队列常见问题

    如何保证消息队列的高可用? 如何保证消息不被重复消费(幂等性问题)? 如何保证消息的可靠性传输(消息丢失问题)? ...

  • RabbitMQ总结

    生产者、交换机、队列、消费者关系 如何保证RabbitMQ的高可用 避免消息堆积 避免消息丢失 如何保证不重复消费...

  • 消息队列的消费语义和投递语义

    消费语义 如何保证消息最多消费一次 如何保证消息至少消费一次 如何保证消息恰好消费一次 投递语义 如何保证消息最多...

  • 消息队列如何保证消息不丢失

    消息从生产到消费可以经历三个阶段:生产阶段、存储阶段和消费阶段。 生产阶段:在这个阶段,从消息在Producer创...

  • 消息的确认与拒绝

    确认消息     为了保证消息从队列可靠的到达消费者, RabbitMQ 提供了消息确认机制,消费者在订阅队列时,...

  • 消息队列核心-如何保证消息不丢失

    使用消息队列,绕不开的一个问题就是如何保证消息不丢失,现在主流的消息中间件都提供了完整的消息可靠性保证机制,可以确...

  • Rabbitmq如何保证不丢消息

    背景介绍: 笔者最近研究了下rabbitmq,便很好奇它是怎么保证不丢失消息的呢?于是便整理了这篇文章来跟大家分享...

网友评论

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

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