面试官:如何保障消息100%投递成功、消息幂等性?
关注“Java后端技术全栈” 回复“面试”获取全套面试资料 来源:kil57.cn/TcIUf 一、前言 [ 金三银四,如何涨薪看这里] 我们小伙伴应该都听说够消息中间件MQ,如:RabbitMQ,RocketMQ,Kafka等。引入中间件的好处可以起到抗高并发,削峰,业务解耦的作用。 如上图: (1)订单服务投递消息给MQ中间件 (2)物流服务监听MQ中间件消息,从而进行消费 我们这篇文章讨论一下,如何保障订单服务把消息成功投递给MQ中间件,以RabbitMQ举例。 二、分析问题 小伙伴们对此会有些疑问,订单服务发起消息服务,返回成功不就成功了吗?如下面的伪代码: 上面代码中,一般发送消息就是这么写的,小伙伴们觉得有什么问题吗? 下边说一个场景,如果MQ服务器突然宕机了会出现什么情况?是不是我们订单服务发过去的消息全部没有了吗?是的,一般MQ中间件为了提高系统的吞吐量会把消息保存在内存中,如果不作其他处理,MQ服务器一旦宕机,消息将全部丢失。这个是业务不允许的,造成很大的影响,关注公众号码猿技术专栏,获取更多面试资源。 三、持久化 有经验的小伙伴会说,我知道一个方法就是把消息持久化,RabbitMQ中发消息的时候会有个durable参数可以设置,设置为true,就会持久化。 这样的话MQ服务器即使宕机,重启后磁盘文件中有消息的存储,这样就不会丢失了吧