什么是消息队列?
就是一个中间件,可以用来线程或者进行间进行消息的传递。
消息队列解决了什么问题?
解耦,异步和削峰
解耦:在单机系统中,每个模块之间是耦合的,需要考虑发给谁,谁来取数据,并且消费失败,功能就无法正常完成,所以需要消息队列来解耦。
异步:在系统的服务链越来越长之后,一次请求的调用时间会越来越长,异步可以让那些相对不重要的服务延迟处理,快速响应请求。
削峰:因为mysql的处理能力能力没只有3000左右,如果不削峰,可能会造成数据库崩溃。
MQ给MYSQL快,因为在持久化中,MQ是顺序写,而mysql是随机写
如何解决消息的可靠性?消息不丢失
有三个阶段:
生产者到MQ:主要利用一个confirm机制,就是MQ收到消息之后会给一个回调,表示发送成功,然后发送失败放缓冲这一类的
MQ本身存储信息:配置消息持久化,集群模式,镜像模式
MQ到消费者:这一阶段有两种模式,一种是同步确认和异步确认
1.同步确认,就是消费者接收到消息之后会进行回调,表示消息接收成功了,这种的话有可能会消费失败,用在对安全性不高的场景下
2.异步确认:等到消费者消费完消息之后,才发送一个回调给MQ, 这种会出校超时重发,然后重复消费问题,用在比较重要的场景,如银行转账之类的场景,可以通过redis等幂等性校验来解决重复消费问题。
顺序消费?
只能做到局部有序,不能做到全局有序
实现就是把消息都放到一个队列里面,可以利用hash来取模
重复消费?
重复消费无法避免,因为要保证消息的可靠性,然后就会超时重传,可以利用mysql的唯一约束,或者redis 幂等,分布式锁等解决这个问题