MessageQueue --- Intro

本文介绍了MQ的基本概念,阐述了使用MQ的原因,包括流量削峰、应用解耦和异步处理,并列举了常见MQ如Kafka、RabbitMQ、RocketMQ和ActiveMQ的优缺点。MQ作为跨进程通信机制,常用于解决高并发和系统解耦等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MessageQueue Intro

什么是MQ

  • MQ全称是Message Queue,消息的队列,因为是队列,所以遵循FIFO 先进先出的原则,它是一种跨进程的通信机制,用于上下游传递消息.
  • 目前主要有两种MQ协议:AMQP和MQTT

AMQP

  • AMQP(Advanced Message Queuing Protocol)
  • 设计目标: AMQP 是一种企业级消息协议,旨在提供可靠、灵活和跨平台的消息传递。它的设计目标是解决复杂的消息路由、高可靠性和事务性需求,适合企业应用集成和金融、电信等领域

核心组件

  • 消息(Message):
    消息是传递的数据单元,包含消息头(Headers)、属性(Properties)和消息体(Body)。
    消息头用于存储元数据(如优先级、时间戳等)。
    消息体是实际的数据内容。
  • 队列(Queue):
    队列是消息的存储容器,消息按照先进先出(FIFO)的顺序存储。
    队列可以持久化,确保消息在系统崩溃后不会丢失。
  • 交换机(Exchange):
    交换机是消息的路由中心,负责将消息分发到队列。
    交换机根据绑定规则(Bindings)和路由键(Routing Key)决定消息的去向。
  • 绑定(Binding):
    绑定是交换机和队列之间的连接规则,定义了消息如何从交换机路由到队列。
  • 生产者(Producer):
    生产者是创建并发送消息的应用程序或服务。
  • 消费者(Consumer):
    消费者是从队列中获取并处理消息的应用程序或服务。
    使用AMQP的场景

使用场景
流量削峰:解决高并发问题

  • 例如秒杀活动,可能会在短时间内产生大量请求同时打到服务端,如果后端对每个请求都进行数据库读写操作,定会造成服务器压力过大,产生服务异常甚至不可用。我们可以通过使用MQ实现流量缓冲,将所有请求先放入消息队列中,服务端每次处理业务先从消息队列获取,从而实现流量削峰,解决高并发问题
    在这里插入图片描述

应用解耦:提升系统可用性

  • 例如电商应用中有订单系统、库存系统、物流系统、支付系统,当用户创建订单后,先后调用库存系统、物流系统、支付系统,任何一个子系统出了故障,都会造成下单失败。引入消息队列后,系统间耦合调用的问题会减少,任何一个子系统出现故障都不会影响用户下单,子系统故障恢复后,会继续处理消息,提升系统可用性。
    在这里插入图片描述

异步处理:提升响应速度

  • 当用户在客户端提交了一个同步请求,后端处理需要耗时很久才能响应,这对用户体验来说无疑是致命的。如果说用户并不关心请求是否处理完成,对于一些耗时的非事务性的业务处理,可以使用消息队列异步请求的方式,将请求信息放入消息队列,直接返回客户端响应,后端监听队列自行处理,提升响应速度
    在这里插入图片描述

常见的AMQP
Kafka

  • 大数据领域内的消息传输,则绕不开Kafka,这款为大数据而生的消息中间件,以其百万级TPS的吞吐量名声大噪
  • 优点:单机写入TPS约在百万条/秒,最大的优点,就是吞吐量高。时效性ms级可用性非常高,kafka是分布式的,一个数据多个副本,少数机器宕机,不会丢失数据,不会导致不可用,消费者采用Pull方式获取消息,消息有序,通过控制能够保证所有消息被消费且仅被消费一次;有优秀的第三方Kafka Web管理界面Kafka-Manager;在日志领域比较成熟,被多家公司和多个开源项目使用;主要支持简单的MQ功能,在大数据领域的实时计算以及日志采集场景中大规模使用。
  • 缺点:单机超过64个队列/分区,Load会发生明显的飙高现象,队列越多,Load越高,发送消息响应时间变长,使用短轮询方式,实时性取决于轮询间隔时间,消费失败不支持重试;支持消息顺序,但是一台代理宕机后,就会产生消息乱序,社区更新较慢

RabbitMQ

  • 2007年发布,是一个在AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最主流的消息中间件之一。
  • 优点:由于erlang语言的高并发特性,性能较好;吞吐量到万级,MQ功能比较完备、健壮、稳定、易用、跨平台、支持多种语言,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX文档齐全;开源提供的管理界面非常棒,用起来很好用,社区活跃度高,更新频率相当高。
  • 缺点:商业版需要收费,学习成本较高

RocketMQ

  • 2007年发布,是一个在AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最主流的消息中间件之一。
  • 优点:由于erlang语言的高并发特性,性能较好;吞吐量到万级,MQ功能比较完备、健壮、稳定、易用、跨平台、支持多种语言,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX文档齐全;开源提供的管理界面非常棒,用起来很好用,社区活跃度高,更新频率相当高。
  • 缺点:商业版需要收费,学习成本较高

ActiveMQ

  • ActiveMQ是一款非常古老的MQ。
  • 优点:单机吞吐量万级,时效性ms级,可用性高,基于主从架构实现高可用性,消息可靠,丢失数据的概率较低。
  • 缺点:官方社区现在对ActiveMQ 5.x维护越来越少, 高吞吐量场景较少使用。

来源: https://mp.weixin.qq.com/s?__biz=MzIxODQxMjc0MA==&mid=2247521998&idx=1&sn=d7d939e7820c884a1830c994755c5a64&chksm=97e83565a09fbc736e9f240ef0d89e70bd68ef08745cbb53b3f943647da666ef88128e322c78&scene=27

MQTT

  • MQTT(Message Queuing Telemetry Transport)
  • 设计目标
    MQTT 是一种轻量级消息协议,专为低带宽、不稳定的网络环境设计。它的设计目标是实现高效的发布/订阅通信,适合物联网(IoT)和移动设备等资源受限的场景

核心组件

  • 消息(Message):
    消息是传递的数据单元,包含主题(Topic)和负载(Payload)。
    主题用于标识消息的类型或来源。
    负载是实际的数据内容。
  • 主题(Topic):
    主题是消息的分类标识,采用分层结构(如 sensors/temperature)
    消费者通过订阅主题来接收消息。
  • 代理(Broker):
    代理是消息的中转站,负责接收发布者的消息并将其分发给订阅者。
  • 发布者(Publisher):
    发布者是创建并发送消息的设备或应用程序。
  • 订阅者(Subscriber):
    订阅者是接收并处理消息的设备或应用程序。

工作流程

  • 发布者将消息发送到代理,并指定主题。
    代理根据主题将消息分发给所有订阅该主题的订阅者。
    订阅者接收消息并进行处理。

高级特性

  • 服务质量(QoS):
    提供三种消息传递质量级别:
    QoS 0:最多一次(消息可能丢失)。
    QoS 1:至少一次(消息可能重复)。
    QoS 2:恰好一次(消息不丢失且不重复)。
  • 持久会话(Persistent Session):
    订阅者可以设置持久会话,代理会保存离线期间的消息并在订阅者重新连接时重新投递。
  • 遗言(Last Will and Testament, LWT):
    发布者可以设置遗言消息,当发布者异常断开时,代理会发布该消息。
  • 轻量级:
    协议头部开销小,适合资源受限的设备。

适用场景

  • 物联网(IoT):设备之间的实时通信。
    移动应用:推送通知和实时更新。
    远程监控:传感器数据的采集和传输

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值