MQ 原理

  • A+
所属分类:消息队列 面试

一、MQ解决了什么问题

1、异步通信:

有些业务不想也不需要立即处理消息,消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。消息会在队列中堆积,然后在需要的时候再去处理它们

2、解耦

降低工程间的强依赖程度,针对异构系统进行适配。

在项目启动之初来预测项目将来会遇见什么需求,是极其困难的。通过消息系统在处理中间插入一个隐含的,基于数据的接口层,两边的处理过程都要实现这一接口当应用发生变化时,可以独立的扩展或修改两边的处理过程,只要确它们遵守同样的接口约束。

例如:用户下单场景,传统实现为:订单下单->减少库存->通知用户 返回创建订单成功。 如此实现问题是:若减少库存失败会导致订单创建失败。

引用MQ: 订单创建完成返回成功,其他步骤发MQ消息,进行 减少库存、给用户发短信或邮件通知、返还优惠券或等等其他操作。如此降低系统间的耦合程度。

3、冗余(消息重复消费)

有些情况下,数据处理的过程会失败。除非数据被持久化,否则将造成丢失。消息队列把数据进行持久化,直到消息被处理。通过这一方式规避了数据丢失的风险。许多消息队列所采用的“插入-获取-删除”范式中,把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被消费完毕。从而确保你的数据被安全的保存直到使用完毕。

4、扩展性

因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率 很容易的,只要另外增加处理过程即可。不需要改变代码、不需要调节参数。便于分布式扩容。

5、过载保护(流量削峰

在访问量剧增的情况下,应用仍然需要发挥作用,但是如果按处理这样瞬间峰值访问为标准投入资源随时待命无疑是巨大的浪费。使用消息队列可以顶住突发的访问压力。

例如:在秒杀和抢购场景中,瞬间的订单数量可能会非常高,如果即时请求数据库可能导致数据库崩溃,这时可以先按库存量发送消息,订单生成等后续操作可以以正常并发量消费消息执行。

6、可恢复性

系统的一部分组件失效时不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加个队列的消息仍然可以在系统恢复后被消费。

7、顺序保证

在大多数场景下,数据处理的顺序都很重要。大部分消息队列就是排序的,并且能保证数据会按照特定的顺序来处理。

8、缓冲

在任何系统中,都会有需要不同处理时间的元素。消息队列通过一个缓冲层来帮助任务最高效率的执行,该缓冲有助于控制和优化数据流经过系统的速度 。以调节系统响应时间。

9、数据流处理

分布式系统产生的海量数据流,如:业务日志、监控数据、用户行为等,针对这些数据流进行实时或批量的采集汇总,然后进行大数据分析是当前互联网的必备技术,通过消息队列来完成此类的数据收集是最好的选择。

二、MQ模式

1、点对点模式

MQ 原理

  1. 消息生产者生产消息发送到queue中,然后消息消费者从queue中取出并且消费消息。

  2. 消息被消费后,queue中不再有存储,所以消息消费者不可能消费已经被消费的消息。

  3. queue支持存在多个消费者,但对一个消息而且,只会有一个消费者可以消费。

2、发布订阅模式

MQ 原理

  1. 消息生产者将消息发布到topic中,同时多个消费者订阅该消息。

  2. 发布到topic中的消息可以被所有订阅者消费

三、MQ组成

Broker:消息服务器,作用server提供消息核心服务,保存分发消息

Producer:消息生产者,业务的发起方,负责生产消息传输给

Consumer:消息消费者,业务的处理方,负责从Broker获取消息进行业务处理

Topic:主题,发布订阅模式下的消息统一汇集地,不同生产者向Topic发送消息,由mq服务器分发到不同的订阅者,实现消息的广播

Queue:队列,点对点模式下,特定生产者向特定的queue发送消息,消费者订阅特定的queue完成指定消息的接收

Message:消息体,根据不同通信协议定义的固定格式进行编码的数据包,来封装业务数据,实现消息的传输。

四、MQ协议

1、AMQP协议:

AMQP即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端和中间件可相互传递消息,并不受客服端、中间件产品的不同、开发语言的不同而限制。

优点:可靠、通用。

AMQP的几个核心概念

--->生产者(Producer ):将消息写入到交换机的一个程序。要做到这一点,该程序创建一个消息,用内容填充消息,给消息一个路由键,并将消息发送到一个交换机。
--->消息主题(Routing Key ):一个字符串,可以用以确定其消息内容发送到指定的队列中
--->交换机(Exchange ):接收生产者消息,并根据消息主题,将消息发送到对象的队列。
--->关系绑定(Binding):定义了一个交换和队列之间的关系、指定的信息应该被路由到一个给定的队列
--->消息队列(Queue ):把信息提供给顾客而言的订阅队列。
--->消费者(Consumer):程序读取的消息,从尾巴读取。

2、MQTT协议

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)上IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有物联网物品和外部连接起来,被用来当作传感器和致动器(比如通过Twitter让房屋联网)的通信协议。

优点:格式简洁、战胜带宽小、移动端通信、PUSH、嵌入式系统

3、STOMP协议

  STOMP(Streaming Text Orientated Message Protocol)是流文本定向消息协议,是一种为MOM(Message Oriented Middleware,面向消息的中间件)设计的简单文本协议。STOMP提供一个可互操作的连接格式,允许客户端与任意STOMP消息代理(Broker)进和交互。

优点:命令模式(非topic\queue模式)

4、XMPP协议

XMPP(可扩展消息处理现场协议,Extensible Messaging and Presence Protocol)是基于可扩展标记语言(XML)的协议,多用于即时消息(IM)以及在线场探测。适用于服务器之间的准即时操作。核心是基于XML流传输,这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息,即使其操作系统和浏览器不同。

优点:通用公开、兼容性强、可扩展、安全性高、但XML编码格式占用带宽大

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: