复习下MQ
常见的几种mq:
1.activemq:java自己写的,工作模式单一只有queue(多对一)和topics(广播),支持集群和主从复制就是几台服务器,一台挂了可以复制消息到其他服务器上。
2.rabbitmq:基于AMQP协议,erlang语言开发,稳定性好,工作模式有4种direct、fanout、topic、header,通过交换机和路由来定位监听。
3.kafka:是为分布式而生的,只有topic模式,引入了subscriber和consumer group的概念,可以进行分区操作,一个topic的消息可以冗余存储到多台服务器上。rabbitmq和activemq都是消费后就删除消息,没有重复消费的功能,而kafka 队列中的内容按策略存储一定时间。缺点因为是分布式一个topic需要同步数据到多台服务器,这样创建一个topic就显得比较重(如果用集群可以用这个)
为什么会选择使用MQ(优点):模块解耦,流量消峰,异步
(异步)短息功能是由阿里云提供的,我们只要直接回应用户短息发送就行了,这样响应用户的速度就快了。订单模块下单使用mq后通知购物车模块删除下单的商品也是也是如此。用户下了后,购物车监听下单的MQ异步去删除,订单模块下单接口,不用去同步调用购物车模块删除的接口。
缺点:
多了一个QM模块,系统可用性降低(MQ挂了),可以搞集群(镜像集群:每个节点都有queue的镜像)。
系统的复杂度变高了,会出现一些其他问题如:
数据丢失了怎么办?:采用confim机制
ack(消费者确认)生产者确认(publisher confirm):生产者发送消息后,等待mq的ACK,如果没有收到或者收到失败信息,则重试。如果收到成功消息则业务结束;持久化(mq服务器对消息持久化)
消息堆积,有很多消息没有处理怎么办?:通过同一个队列多消费者监听,实现消息的争抢,加快消息消费速度
数据有可能有顺序的问题?:确保接口幂等性(简单点来说就是:加入消费一个mq就是写入一条数据,来了几条数据,要先判断数据库中是否已经存在,存在就不写,mysql就判断一下,redis的话就用set就行了)