MQ 功能概述

消息队列

消息队列的全称为Message Queue,也被称为消息中间件,可简称MQ。

它能够解决应用的耦合性、异步消息、流量削峰的问题。

先从Message开始聊起,Message其实就是消息,正如词中所见,它是一种信息媒介,这个信息可以是文本、音乐、或者视频。

其次是Queue,即为队列的意思,队列有一个特点就是FIFO,先进先出,在MQ中用于保存信息。

image-20210408233106383

解耦

MQ的解耦示例:

如我有1个电影城售票的app,当用户下单后可能需要经历一系列的处理,如生成订单交由第三方支付,发送短信供用户确认,通知出票等等,在常规的编程思想中这些行为可能会被整合在一起,造成程序的耦合性加强,如下图所示:

image-20210408234758192

当你使用了MQ后,可以将订单信息放入MQ中,其他的功能被拆分成小模块,从MQ中读取信息并进行处理,这就是MQ解耦的应用:

image-20210408234926665

流量削峰

MQ的流量削峰示例:

如我有1个电商网站平台,到了11.11购物节时上千上万的用户会在我的平台购买商品,由于资源有限我的服务器不足以支持这么大的并发量,可能造成服务器崩溃的局面:

image-20210408235555605

此时可以在用户与应用之间,放置一个MQ,一次只处理定量的数据,缓解服务器压力。

image-20210409000040038

MQ模式

MQ主要分为2大模式,分别为点对点的p2p,与发布订阅(Pub/Sub)

Peer-to-Peer模式里,MQ中的消息一次仅只能被一个接受方所获取,而不能同时被多个接受方所获取:

image-20210409000754751

Pub/Sub模式里,发送方发送基于一个主题的消息,所有订阅了该主题的接受方都可以获取到该消息:

image-20210409001131120

对于这两种模式的区别,如下所示:

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:吞吐量高,注重高吞吐量,不注重消息的可靠性,数据量特别大

如想了解更多。

点我跳转

posted @ 2021-04-09 00:24  云崖君  阅读(429)  评论(0编辑  收藏  举报