MQ 功能概述
消息队列
消息队列的全称为Message Queue,也被称为消息中间件,可简称MQ。
它能够解决应用的耦合性、异步消息、流量削峰的问题。
先从Message开始聊起,Message其实就是消息,正如词中所见,它是一种信息媒介,这个信息可以是文本、音乐、或者视频。
其次是Queue,即为队列的意思,队列有一个特点就是FIFO,先进先出,在MQ中用于保存信息。
解耦
MQ的解耦示例:
如我有1个电影城售票的app,当用户下单后可能需要经历一系列的处理,如生成订单交由第三方支付,发送短信供用户确认,通知出票等等,在常规的编程思想中这些行为可能会被整合在一起,造成程序的耦合性加强,如下图所示:
当你使用了MQ后,可以将订单信息放入MQ中,其他的功能被拆分成小模块,从MQ中读取信息并进行处理,这就是MQ解耦的应用:
流量削峰
MQ的流量削峰示例:
如我有1个电商网站平台,到了11.11购物节时上千上万的用户会在我的平台购买商品,由于资源有限我的服务器不足以支持这么大的并发量,可能造成服务器崩溃的局面:
此时可以在用户与应用之间,放置一个MQ,一次只处理定量的数据,缓解服务器压力。
MQ模式
MQ主要分为2大模式,分别为点对点的p2p,与发布订阅(Pub/Sub)
Peer-to-Peer模式里,MQ中的消息一次仅只能被一个接受方所获取,而不能同时被多个接受方所获取:
Pub/Sub模式里,发送方发送基于一个主题的消息,所有订阅了该主题的接受方都可以获取到该消息:
对于这两种模式的区别,如下所示:
1)相同点:
- 消息生产者和消息消费者都通过MQ进行交互,彼此之间互不接触
2)不同点:
- p2p中,一条消息一旦被消费就从MQ中移除,且该模式中拥有生产者、消费者、MQ
- Pub/Sub中,一条消息可以被多个消费者所接受,且该模式中拥有生产者,消费者,MQ,主题
举个例子:
P2P:学校里,班主任与学生家长通过电话进行沟通
Pub/Sub:学校里,xx社团在群里发布了一则公告,仅有该社团的成员能够获取到
常见MQ
以下举例一些常见的消息队列产品:
RabbitMQ:由Erlang编写,支持多协议AMQP,XMPP,SMTP,STOMP。支持负载均衡、数据持久化。同时支 持Peer-to-Peer和发布/订阅模式。
Redis:基于Key-Value对的NoSQL数据库,同时支持MQ功能,可做轻量级队列服务使用。就入队操作而言, Redis对短消息(小于10kb)的性能比RabbitMQ好,长消息性能比RabbitMQ差。
ZeroMQ:较为轻量级,不需要单独的消息服务器或中间件,应用程序本身扮演该角色,Peer-to-Peer。它实质上是 一个库,需要开发人员自己组合多种技术,使用复杂度高。
ActiveMQ:由JMS实现,支持Peer-to-Peer,支持持久化、XA(分布式)事务。
Kafka/Jafka:高性能跨语言的分布式发布/订阅消息系统,数据持久化,全分布式,同时支持在线和离线处理 MetaQ/RocketMQ 纯Java实现,发布/订阅消息系统,支持本地事务和XA分布式事务。
目前比较主流的消息队列产品有RabbitMQ与Kafka,其实关于它们两者还有一些很大的区别,如:
- rabbitmq:吞吐量小,消息确认,订单,对消息可靠性有要求,就用它
- kafka:吞吐量高,注重高吞吐量,不注重消息的可靠性,数据量特别大
如想了解更多。
可点我跳转