一、什么是MQ
MQ全称是message queue(消息队列),是在消息传输过程中的一个容器,只是暂时保存消息,最终会由消费端处理掉这个消息,多用于分布式系统中的消息通信。
二、MQ的作用
- 应用解耦:使用MQ,一个生产者可以面对多个消费者,一个消费者也可以面对多个生产者,这样就可以轻松实现不同应用间的解耦,提高容错性和可维护性
- 异步提速:通过MQ分发任务给不同的应用处理,提高了系统整体性能
- 肖峰填谷:通过限流措施,在客户端的请求高峰,将请求任务放进MQ中,消费端根据自身性能拉取任务进行处理,避免服务因为瞬间的请求压力过大而使系统瘫痪
三、使用MQ的劣势
因为在系统中加入了MQ,使系统变得复杂,如何保证消息不丢失,消息正确消费是一个难题;另外系统可用性也随之降低,怎么确保MQ不宕机,保证高可用也是需要去考虑的。
四、RabbitMQ 六工作模式
- 简单模式 :简单一对一模式(一个活只能给一个人干)
- 工作队列模式 : 一个队列匹配多个消费者一起消费(一个活分给多个人一起干)
- 发布订阅模式 :通过交换机分发给订阅了这条消息的多个队列(多个人都干同样的活)
- 路由模式(routing):通过交换机分发给定阅了不同主题的队列(多个人每个人只干自己喜欢的活)
- 主题模式(topic) :通过交换机分发给定阅了不同类型主题(可以通配符)的队列(多个人每个人可以干自己喜欢的一批活)
- RPC远程调用模式
五、Rabbit高级特性
- 消费端限流 :设置每次拉取多少条消息,确认接收后再继续拉取
- TTL :消息存活时间
- 死信队列 :消息存活时间到期没被消费、队列超过存放的最大数、被消费者拒收并且不放回原队列的消息都会成为Dead message,都可以放入死信队列中
- 延迟队列 :TTL+死信队列
- 消息可靠性投递 :消息生产者为了能确认消息是否成功投递,可以通过开启监听模式,通过回调接口判断消息投递信息(confirm 确认模式:是否成功投递到交换机;return 退回模式:是否投递到队列被退回)
- 消费端确认接收 :消费端开启手动签收(acknowledge="manual"),正确处理完消息后再确认签收消息(channel.basicAck),否则可以拒绝签收(channel.basicNack)或者采取其他措施确保消息正确被消费
- 消息幂等性保障 :为了避免消息重复消费,可以将每条消费过的消息id存到redis中,在处理消息前都先查询这条消息是否被消费过;或者每条消息都带一个版本号,在写数据时将版本号写入库中,每次写数据都一并判断版本号不等,否则写入失败
- 消息积压解决 :消息积压是因为消费端宕机或者生产端流量大而消费端能力不足导致,可以上线更多的消费者(专门的队列消费服务),或者把消息取出存到数据库中再慢慢处理