mq怎么保证消息不丢失 高并发场景下,如何保证生产者投递到消息中间件的消息不丢失?
高并发场景下,如何保证生产者投递到消息中间件的消息不丢失?
消息中间件消息不丢失主要从以下几个方面考虑
投递
生产者向消息中间件投递消息是push的方式,这种方法会出现以下情况
1、生产者挂掉了
情况是这样的,你的生产者收到了数据,并存到了数据库中,同时生产者要降消息push到消息中间件做异步处理。这时候如果生产者挂掉了,就导致消息数据没有push到消息中间件里,也就会出现数据不一致的问题。
这时候我们可以在数据库设置是否投递成功标志位,在生产者push之后,再将标志位设置为已经投递。另外,客气启动一个定时任务,检测是否有消息没有投递,保证消息数据一定会进入中间件。
2、消息重试
生产者没有挂掉,但是因为网络等其他问题,导致生产者不知道有没有投递成功。这时候生产者可以失败重试,这保证消息可以再次投递。但是这有可能会出现重复投递,导致出现中间件消息数据重复。
存储
消息中间件是存到磁盘上的,存入磁盘的消息一般是不会丢失的,同时磁盘文件还会做备份。如果一个丢失了,可以通过备份文件恢复。
消费
一般消费者需要在消费者消费成功之后再设置提交消费位点。如果消费失败,消费者不提交消费位点还是可以消费该数据的。这就引出一个问题就是消息重复消费。这个问题和上边提到的消息重复投递相同,都会导致重复消费,这就需要考虑消费的幂等性,可以做消费记录,防止重复消费。
JAVA面试如何保证消息不被重复消费?如何保证消息消费的幂等性?
我是闲着没事干,来这里玩的,开始在各个网络找技术资料,后就以《头条》为主了。由找资料转向了交朋友了。因为我想的东西落后了时代,有些的想的,由于自己程度不高。在脑子里只是勾思,达不到实际!!!
如何设计一个MQ消息队列?
1.先上图,明确一个消息发送和消费的流程
2.消息消息首先需要定义消息协议,比如ActiveMQ,Stomp,XMPP等
3.消息协议定义好了,明确消息队列需要满足什么场景
是否需要保证消息可靠性,如果需要就要做存储的高可用
是否需要支持同步和异步消息
是否需要保证消息的顺序
是否需要支持延时消息
具体可以参照很多开源实现的特性,比如RocketMQ就是高可靠的,Kafka就是高吞吐量的,但是不是高可靠的。
如何保障消息中间件100%消息投递成功?如何保证消息幂等性?
这个是互联网公司使用 MQ 基本要捷俊的问题,本质上还是问你使用消息队列如何保证幂等性,以kafka来举例,Kafka 有个 offset 的概念,每个消息写进去,都有一个 offset,代表消息的序号,消费者消费之后,每隔一段时间会定时定期的 会把一消费过的消息的 offset 提交一下,表示已经消费过,下次我重重启或者服务死掉在重启的时候,会继续从上次消费到的 offset 来继续消费。但是还是得结合业务来思考,比如你拿个数据要写库,你先根据主键查一下,如果这数据都有了,你就别插入了,update 一下好吧,最终还是要在数据方面在做一次去重操作
mq怎么保证消息不丢失 rocketmq保证消息不会重复 rocketmq消息回查实现
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。