写点什么

聊聊 RabbitMQ RabbitMQ 相关面试题,kafka 入门教程步骤

用户头像
极客good
关注
发布于: 刚刚

如何保证消息的顺序性




为什么要使用消息队列




目前我所在公司是一家互联网电商,开发电商小程序,我们订单的模块就用到了 RabbitMQ,那为什么我们要使用 RabbitMQ 呢?



  • 无需担心订单接口是否异常,用户下订单直接把订单发送到消息队列去,返回下单成功,订单接口订阅消息队列,消费消息,保存订单~



? ? ? ? ?



  • 解耦:多个系统(B,C,D)调用同一系统(A),多个系统严重耦合,引入消息队列,A 发送消息至消息队列,BCD 订阅消息队列,无需关心任何其他因素。


  • 异步:若系统 A 接收到一个请求,需要在在自己的本地写库,又需要在 BCD 系统写库,传统方式,A -> B -> C -> D ,速度极慢。引入消息队列时,A 在本地写库,同时把消息发送至消息队列中,BCD 同时写入数据库,时间大大算短。


![](https://static001.geekbang.org/infoq/ed/ed89fa4b63aaadd686c7ecc6a86e5694.png)


  • 削峰:减少高峰期对服务器的压力。大量请求(5000 条请求/s)访问系统时,若系统 B 每秒只能处理 1000 请求,那么系统 B 就会崩溃挂掉了。引入消息队列,这 5000 条请求发送到消息队列中,系统 B “慢慢 ”的消费这些消息,减少了其对服务器的压力。


消息队列的缺点?




凡事都有利弊。



  • 系统可用性降低


? ? 消息队列一旦挂掉,下游的接口或者服务则无法得到消息,那么该模块就宕机了。。。


  • 系统复杂性提高


? ? 消息的重复消费,消息丢失,消息的顺序性等等。。。


  • 系统的一致性


? ? 由图二,本来是A,B,C,D都完成之后才会相应给用户操作成功,现引入Rabbit MQ之后,A操作成功就会相应给用户,若BCD其中有服务宕机或操作异常造成的数据问题。。。


各大消息队列的优缺点




[参考链接](


)


如何保证 RabbitMQ 的高可用




  • 镜像集群模式


? ??![](https://static001.geekbang.org/infoq/55/55b73d59afa613e641922eda06f57ba9.png)



??要开启镜像集群模式,需要在后台新增[镜像集群模式策略](


),也就是要求把 queue 中的元数据和消息同步到所有其他的 MQ 节点中,也可以指定同步到指定数量的节点。



??????好处:?任何一个MQ节点宕机了,都不会影响整个集群数据的完整性,因为剩下的其他未宕机的MQ节点都有queue的完整数据,当进行消息消费的时候,连接其他的服务器节点一样也能获取到数据。  


? ? ?缺点:性能开销大,因为需要整个集群内部同步所有实例的数据;无法线性扩容,因为每一个服务器中都包含整个集群服务节点中的所有数据,这样一旦单个服务器节点的容量满了就不容易对容量进行线性拓展。



如何保证消息的幂等性




?可以结合 redis,Set 来实现消息的幂等性



[rabbitmq 保证消息的幂等性](


)



生产者每次发送消息都会给消息赋一个唯一值。消费者消费消息时,记录消息的唯一值,下次消费消息的时候来判断唯一值是否存在。以此保证消息的幂等性。


如何保证消息不被丢失

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
聊聊RabbitMQ RabbitMQ相关面试题,kafka入门教程步骤