- 面试题
- 为什么要使用MQ
- 在项目中使用MQ实现了什么功能
- MQ如何确保消息发送和消息接收
- 如何防止消息丢失
- 如何保证消息不被重复消费(幂等性)
- 如何解决消息堆积问题
- MQ中的死信队列、延时队列
- 结语
- 异步
异步是在程序中就是在相同的时间做不同的事情,只在乎过程,不在意结果,与线程类似。
在上图中,在同步更新库存表时采用将其丢进消息中去,由MQ去给相应的商品微服务更新库存。 - 解耦
相应的两个程序互不影响。如上图,加入了MQ之后,订单微服务与商品微服务相互不影响。假设在下单过程中,商品微服务突然挂了,因为没有服务进行消费,MQ会先将消息存取,在商品微服务上线之后进行消费,互不影响。 - 削峰填谷
请求量太大,可以先把消息存在MQ中,在用户量访问不大的时候再进行消费处理。
主要是使用MQ实现了数据同步及其异步处理发送消息的功能。
- 数据同步:MySQL和Redis、ES之间的数据同步
- 异步发送消息:发送短信验证码、发送代办信息、与微服务通信
-
消息发送确认
1、confirmCallback
是一个回调接口,消息发送到broke后触发回调函数,确认消息是否到达Broke服务器,这个方法也仅仅是确认消息是否成功发送到交换机中。
2、ReturnCallback
启动消息失败返回,这个接口由交换机向队列中失败时进行回调,这个方法可以不使用。
如果消息发送失败,MQ会采取的重试机制,一直发。 -
消息接受确认
MQ消息确认机制是自动确认的,自动确认会在消息发送给消费者后确认,当发送成功之后会发送一条携带ACK的标识给MQ,这时候因为消息已经消费了,MQ就会将这个消息从队列中删除掉。
消息丢失可以分为生产者消息丢失、消息队列消息丢失、消费者消息丢失。
消息队列开启重试机制,然后在本地创建一个消息表来记录消息是否被消费,在消息发送成功后将其状态设为0,在消费成功后设为1,可以保证消息成功被消费。
总结:持久化建表+消息重试机制+手动确认
- 为什么会出现消息重复消费
在正常情况下,消息消费成功后,会发送一个ACK的标识给MQ,然后这条消息就会在队列中进行删除。但是由于网络传输等因素,MQ挂了,这就导致消息已经消费成功了,但是没有发送确认消费的标识给MQ,这时候MQ以为没有消费成功,就会采用重试机制继续发送消息,这就导致了重复消费的问题。 - 解决方案
保证消息的唯一性,在写入消息队列的数据做唯一标识,做一个MQ消费的中间表,更新状态,消费消息时,根据唯一标识判断是否消费过此条消息。
-
消费慢
1、可以采用的是优化代码结构,开启线程等方式让消息快速消费
2、可以对消息队列部署集群模式 -
队列容量不够
可以对其进行扩容
-
死信队列
当队列中的消息被拒绝、过期就会加入到死信队列。死信队列可以重新发布到另一个交换机中。
造成的原因:
1、消息被拒绝
2、消息超时
3、超过了队列的最大长度 -
延时队列
当消息被发布出去后,并不立即投递给消费者进行消费,而是在指定时间之后进行投递。在日常比较常见的就是各大APP中的消息推送,比如xxx时间点准时进行推送。
这个月打算提桶跑路了,在外包也干了整整9个月了,总体而言,学到的东西还是挺多的。但是还是想跑,不知道是换项目组还是跑路。但是最终还是要自己多多准备面试题,简历上的知识点一定要多看多背。之后将会整理出简历上的知识面试题了~
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)