一、什么是MQ
MQ(Message Queue)本质是个队列,只不过队列中存放的内容是message而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ是一种非常常见的上下游“逻辑解耦+物理解耦”的消息通信服务
二、为什么要用MQ
1、流量消峰
例如在正常情况订单系统最多可以处理一万次订单,但是在高峰期,如果有两万次下单情况下订单系统是处理不了的。
- 方式一,只能限制订单超过一万以后不允许用户下单,这样体验较差
- 方式二,使用消息队列做缓冲,无需限制用户下单,把一秒内下的订单分散成一段时间来处理,这会造成用户延时收到订单成功操作,但是这比方式一要好一些
2、应用解耦
以电商引用为例,应用中有订单系统、库存系统、物流系统、支付系统。用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个系统出现了故障,都会造成下单操作异常。 image.png
-
使用消息队列应用解耦,上述系统间不会直接调用而是通过消息队列,如果某个系统停止一段时间并不会阻塞其他系统业务,而该系统的消息也不会丢失,当该系统重启后还可以继续处理堆积的消息任务
image.png
3、异步处理
有些服务间调用是异步的,例如 A 调用 B,B需要花费很长时间执行无法立即给 A 响应,但是 A 需要知道 B 的执行响应
- 方式一,A过一段时间再去调用 B 的查询 API 查询
- 方式二,A提供一个 CallBack API,B 执行完之后调用 API 通知 A
- 方式三,使用消息队列,可以很方便解决这个问题,A 调用 B 服务后,只需要监听 B 处理完成的消息就可以了,当 B 服务执行完毕后,发送一条消息给 MQ,A 会监听到MQ中的消息 image.png
三、MQ的分类
1、ActiveMQ
优点:单机吞吐量万级,时效性ms级,可用性高,基于主从架构实现高可用性,消息可靠性较低的概率丢失数据
缺点:维护越来越少
2、kafka
大数据的杀手锏,以其百万级TPS的吞吐量名声大噪,迅速成为大数据领域宠儿
优点
- 性能卓越,单机写入TPS约在百万条/秒,最大的优点,就是吞吐量高
- 时效性 ms 级可用性非常高
- kafka是分布式的
- Web管理界面 kafka-Manager
- 在日志领域比较成熟
缺点
- 单机超过 64 个队列/分区,load会发生明显的飚高现象,队列越多,load越高,发送消息响应时间变长
- 消息失败不支持重试
- 支持消息顺序,但是宕机后就会产生消息乱序
3、RocketMQ
RocketMQ 出自阿里巴巴的开源项目,使用Java实现
优点
- 单机吞吐量十万级,可用性非常高,分布式架构,消息可以做到0丢失
缺点
- 支持的客户端语言不多
- 社区活跃度一般
4、RabbitMQ
2007年发布,是一个在AMQP(高级消息队列协议)基础上完成的,可服用的企业消息系统,是当前最主流的消息中间件之一
优点
- 由于erlang语言的高并发特性,性能较好
- 吞吐量万级
- 功能比较完备,健壮,稳定,易用,跨平台,支持多语言
- 社区活跃度高
缺点
- 商业版需要收费
网友评论