十分钟简单了解MQ相关知识

MQ简介

MQ,Message Queue,是一种提供消息队列服务的中间件,也称为消息中间件,是一套提供了消息生 产存储消费全过程API的软件系统。消息即数据。一般消息的体量不会很大。

MQ用途

削峰填谷

将系统的超量请求暂存起来,以便于系统后续慢慢进行处理,避免请求的丢失或系统崩溃。

使用了 MQ 之后,限制消费消息的速度为1000,这样一来,高峰期产生的数据势必会被积压在 MQ 中,高峰就被“削”掉了,但是因为消息积压,在高峰期过后的一段时间内,消费消息的速度还是会维持在1000,直到消费完积压的消息,这就叫做“填谷”。

image-20240708231059583

image-20240708231114749

异步解耦

上游系统对下游系统的调用若为同步调用,则会大大降低系统的吞吐量与并发度,且系统耦合度太高。 而异步调用则会解决这些问题。所以两层之间若要实现由同步到异步的转化,一般性做法就是,在这两 层间添加一个MQ层。

比如第一个系统需要时间为300+300+300+20 = 920ms系统才能返回,而第二个系统则只需要20+5 = 25ms系统就可以返回

image-20240708231401124

image-20240708231432261

MQ缺点

系统可用性降低

系统引入的外部依赖越多,系统的稳定性越差,一旦MQ宕机,那么会对业务带来巨大影响。如何保证MQ的高可用?

系统复杂度提高

MQ 的加入大大增加了系统的复杂度,以前系统间是同步的远程调用,现在是通过 MQ 进行异步调用。如何保证消息没有被重复消费?怎么处理消息丢失情况?那么保证消息传递的顺序性?

一致性问题

A 系统处理完业务,通过 MQ 给B、C、D三个系统发消息数据,如果 B 系统、C 系统处理成功,D 系统处理失败。如何保证消息数据处理的一致性?

常见MQ

image-20240708232054077

ActiveMQ

ActiveMQ是使用Java语言开发一款MQ产品。早期很多公司与项目中都在使用。但现在的社区活跃度已 经很低。现在的项目中已经很少使用了。

RabbitMQ

RabbitMQ是使用ErLang语言开发的一款MQ产品。其吞吐量较Kafka与RocketMQ要低,且由于其不是 Java语言开发,所以公司内部对其实现定制化开发难度较大。

Kafka

Kafka是使用Scala/Java语言开发的一款MQ产品。其最大的特点就是高吞吐率,常用于大数据领域的实 时计算、日志采集等场景。其没有遵循任何常见的MQ协议,而是使用自研协议。对于Spring Cloud Net ix,其仅支持RabbitMQ与Kafka。

RocketMQ

RocketMQ是使用Java语言开发的一款MQ产品。经过数年阿里双11的考验,性能与稳定性非常高。其 没有遵循任何常见的MQ协议,而是使用自研协议。对于Spring Cloud Alibaba,其支持RabbitMQ、 Kafka,但提倡使用RocketMQ。

常见MQ协议

JMS

JMS,Java Messaging Service(Java消息服务)。是Java平台上有关MOM(Message Oriented Middleware,面向消息的中间件 PO/OO/AO)的技术规范,它便于消息系统中的Java应用程序进行消 息交换,并且通过提供标准的产生、发送、接收消息的接口,简化企业应用的开发。ActiveMQ是该协 议的典型实现。

STOMP

STOMP,Streaming Text Orientated Message Protocol(面向流文本的消息协议),是一种MOM设计 的简单文本协议。STOMP提供一个可互操作的连接格式,允许客户端与任意STOMP消息代理 (Broker)进行交互。ActiveMQ是该协议的典型实现,RabbitMQ通过插件可以支持该协议。

AMQP

AMQP,Advanced Message Queuing Protocol(高级消息队列协议),一个提供统一消息服务的应用 层标准,是应用层协议的一个开放标准,是一种MOM设计。基于此协议的客户端与消息中间件可传递 消息,并不受客户端/中间件不同产品,不同开发语言等条件的限制。 RabbitMQ是该协议的典型实 现。

MQTT

MQTT,Message Queuing Telemetry Transport(消息队列遥测传输),是IBM开发的一个即时通讯协 议,是一种二进制协议,主要用于服务器和低功耗IoT(物联网)设备间的通信。该协议支持所有平 台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器的通信协议。 RabbitMQ通 过插件可以支持该协议。

MQ基本概念

  1. 生产者(producer):生产消息即发送消息。创建消息,然后发送到代理服务器

  2. 消费者(consumer):每当有消息到达MQ服务器时,会发送给消费者,消费者收到消息时,会进行处理。

  3. 消息(message):在MQ中,把应用程序交由MQ传输的数据,某个应用向应用程序发出的请求处理等都可以称做消息。消息又包括两部分:

    • 消息描述符(message header,消息头),如: 消息的优先级,生命周期,消息ID

    • 消息体(message body),就是用户的数据部份,(又为分永久性的,和非永久性消息)

  4. 队列(queue):存放消息的地方,队列中的消息直到被应用程序消费之后再结束消息的生命周期。

sage body),就是用户的数据部份,(又为分永久性的,和非永久性消息)

  1. 队列(queue):存放消息的地方,队列中的消息直到被应用程序消费之后再结束消息的生命周期。

总结:这篇文章主要是提供给初学者接触MQ了解一些基础知识的,让其有相对应的了解。

  • 29
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值