01-MQ的基本概念

MQ的基本概念

一、MQ概述

MQ全称Message Queue(消息队列),是在消息的传输过程中保存消息的容器

多用于分布式系统之间进行通信。

分布式系统通信有两种方式:直接远程调用借助第三方完成间接通信

发送方称为生产者,接收方称为消费者

MQ概述-01

二、MQ的优势和劣势

2.1、优劣概述

优势:

  • 应用解耦
  • 异步提速
  • 削峰填谷

劣势:

  • 系统可用性降低
  • 系统复杂性提高
  • 一致性问题

2.2、优势

1.应用解耦

系统的耦合性越高,容错性就越低,可维护性就越低。

以电商系统为例,用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障或者因为升级等原因暂时不可用,都会造成操作异常,影响用户体验。

优势-应用解耦-01

使用消息队列解耦合,提升容错性和可维护性。

比如物流系统发生故障,需要几分钟才能修复,在这段时间内,物流系统需要处理的数据被缓存到消息队列中,用户的下单操作正常完成。当物流系统恢复后,补充处理存在消息队列中的订单消息即可,终端系统感知不到物流系统发生过几分钟故障。

优势-应用解耦-02

2.异步提速

一个下单操作耗时:20 + 300 + 300 + 300 = 920ms

用户点击完下单按钮后,需要等待920ms才能得到下单响应,速度太慢。

优势-异步提速-01

用户点击完下单按钮后,只需等待25ms就能得到下单响应(20 + 5 = 25ms)。

提升用户体验和系统吞吐量(单位时间内处理请求的数目)。

优势-异步提速-02

3.削峰填谷

优势-削峰填谷-01

优势-削峰填谷-02

优势-削峰填谷-03

使用了MQ之后,限制消费消息的速度为1000,这样一来,高峰期产生的数据势必会被积压到MQ中,高峰就被“削”掉了,

但是因为消息积压,在高峰期过后的一段时间内,消费消息的速度还是会维持在1000,直到消费完积压的消息,这就叫做“填谷”。

使用MQ后,可以提高系统稳定性。

4.小结

  • 应用解耦:提高系统容错性和可维护性
  • 异步提速:提升用户体验和系统吞吐量
  • 削峰填谷:提高系统稳定性

2.3、劣势

劣势

  • 系统可用性降低

    系统引入的外部依赖越多,系统稳定性越差。一旦MQ宕机,就会对业务造成影响。

    如何保证MQ的高可用?

  • 系统复杂度提高

    MQ的加入大大增加了系统的复杂度,以前系统间是同步的远程调用,现在是通过MQ进行异步调用。

    如何保证消息没有被重复消费?怎么处理消息丢失情况?怎么保证消息传递的顺序性?

  • 一致性问题

    A系统处理完业务,通过MQ给B、C、D三个系统发消息数据,如果B系统、C系统处理成功,D系统处理失败。

    如何保证消息处理的一致性?

小结

既然MQ有优势又有劣势,那么使用MQ需要满足什么条件呢?

  1. 生产者不需要从消费者处得到反馈。引入消息队列之前的直接调用,其接口的返回值应该为空,这才让明明下层的动作还没做,上层却当成动作做完了继续往后走,即所谓异步成为了可能。
  2. 容许短暂的不一致性。
  3. 确实是用了有效果。即解耦、提速、削峰这些方面的收益,超过加入MQ,管理MQ的这些成本。

三、常见的MQ产品

目前业界有很多的MQ产品,例如RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMQ等,也有直接使用Redis充当消息队列的案例,而这些消息队列产品,各有侧重,在实际选型时,需要结合自身需求及MQ产品特征,综合考虑。

MQ产品对比

四、RabbitMQ简介

AMQP,即Advanced Message Queuing Protocol(高级消息队列协议),是一个网络协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端、不同中间件产品、不同的开发语言等条件的限制。

2006年,AMQP规范发布,类比HTTP

RabbitMQ简介-01

2007年,Rabbit技术公司基于AMQP标准开发的RabbitMQ 1.0发布。RabbitMQ采用Erlang语言开发,Erlang语言由Ericsson(爱立信)公司,专门为开发高并发和分布式系统的一种语言,在电信领域使用广泛。

RabbitMQ基础架构如下图:

RabbitMQ基础架构

RabbitMQ中的相关概念

  • Broker:接收和分发消息的应用,RabbitMQ Server就是Message Broker。
  • Virtual Host:处于多租户和安全因素设计的,把AMQP的基本组件划分到一个虚拟的分组中,类似于网络中的namespace概念。当多个不同的用户使用同一个RabbitMQ Server提供的服务时,可以划分多个VHost,每个用户在自己的VHost创建Exchange/Queue等。
  • Connection:Publisher/Consumer和Broker之间的TCP连接。
  • Channel:如果每一次访问RabbitMQ都建立一个Connection,在消息量大的时候建立TCP Connection的开销是巨大的,效率也较低。Channel是在Connection内部建立的逻辑连接,如果应用程序支持多线程,通常每个Thread创建单独的Channel进行通讯,AMQP Method包含了Channel Id 帮助客户端和Message Broker识别Channel,所以Channel之间是完全隔离的。Channel作为轻量级的Connection极大减少了操作系统建立TCP Connection的开销。
  • Exchange:Message到达Broker的第一站,根据分发规则,匹配查询表中的Routing Key,分发消息到Queue中。常用的类型有:direct(point-to-point),fanout(multicast)和topic(publish-subscribe)。
  • Queue:消息最终被送到这里等待Consumer取走。
  • Binding:Exchange和Queue之间的虚拟连接,Binding中可以包含Routing Key。Binding信息被保存到Exchange中的查询表中,用于Message的分发依据。

RabbitMQ提供了6种工作模式:简单模式、Work Queues、Publish/Subscribe发布与订阅模式、Routing路由模式、Topics主题模式、RPC远程调用模式(远程调用,不太算MQ,暂不做介绍)。

官网对应模式介绍:https://www.rabbitmq.com/getstarted.html

RabbitMQ六种工作模式

五、JMS

  • JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件的API。
  • JMS是JavaEE规范中的一种,类比JDBC。
  • 很多消息中间件都实现了JMS规范,例如:ActiveMQ。RabbitMQ官方没有提供JMS的实现包,但是开源社区有。

六、小结

  • RabbitMQ是基于AMQP协议使用Erlang语言开发的一款消息队列产品。
  • RabbitMQ提供了6种工作模式,我们学习5种。重点。
  • AMQP是协议,类比HTTP。
  • JMS是API规范接口,类比JDBC。

参考

posted @   lannntuuu  阅读(55)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示