消息中间件(Message Queue)简介

本文探讨了消息队列MQ的核心概念,包括其解耦和通讯目的,详细介绍了有Broker的重Topic(如Kafka和JMS)和轻Topic(如RabbitMQ)的区别,以及无Broker的ZeroMQ。重点对比了Kafka的高性能与可能的丢包、RabbitMQ的灵活性和RabbitMQ的AMQP交换机制,以及RocketMQ的全面功能。

消息中间件简介

1:简介

Message Queue(MQ),消息队列中间件。很多人都说:MQ通过将消息的发送和接受分离来实现应用程序的异步和解耦,这给人的直觉是:MQ是异步的,用来解耦的,但是MQ这个只是效果而不是目的。MQ真正的目的是为了通讯,屏蔽底层复杂的通讯协议,定义了一套应用层的、更加简单的通讯协议。

传统系统中两个模块之间通讯要么是HTTP,要么是自己开发的TCP,这两种协议都是原始的协议,实现起来很困难。

MQ定义了两个对象:发送数据的叫生产者,接受数据的叫消费者。它提供一个SDK让我们可以定义自己的生产者和消费者实现消息通讯而无视底层通讯协议。

2:分类

1.1:有Broker(代理中间件)的MQ

这个流派通常有一台服务器作为Broker,所有的消息都通过它中转。生产者把消息发送给它就结束自己的任务了,Broker则把消息主动推送给消费者(或者消费者主动轮询)。

有Broker的又分为两种:

1.1.1 重Topic

kafka、JMS(ActiveMQ,升级版RecketMQ)就属于这个流派,生产者会发送key和数据到Broker,由Broker比较key之后决定给哪个消费者。这种模式是最常见的模式,使我们对MQ最多的印象。Topic某种意义上就是queue(先进先出的缓存策略)。
在这里插入图片描述

虽然架构一样,但是kafka的性能要比jms的性能不知道高多多少倍,所以基于这种类型的MQ只有kafka一种备选方案。如果你需要一条暴力的数据流(在乎性能而不在乎灵活性),那么kafka是最好的选择(性能好,但有可能丢包,一般用于传不那么重要且数据量大的数据)。

Kafka速度的秘诀在于,它把所有的消息都变成一个的文件。通过mmap提高I/O速度,写入数据的时候它是末尾添加所以速度最优;读取数据的时候配合sendfile直接暴力输出

1.1.2 轻Topic

这种的代表是RabbitMQ(或者说AMQP)。生产者发送key和数据,消费者定义订阅的队列,Broker收到数据后会通过一定的逻辑计算出key对应的队列,然后把数据交给队列。
在这里插入图片描述

这种模式下解耦了key和queue,在这种架构中queue是非常轻量级的(在RabbitMQ中它的上线取决于你的内存),消费者关心的只是自己的queue,生产者不必关心数据最终给谁了,只要指定key就行了,中间的那层映射在AMQP中叫exchange(交换机)。这个中间商不赚差价!

AMQP中有四种exchange:

  • Direct exchange:key等于queue
  • Fanout exchange:无视key,给所有的queue都来一份
  • Topic exchange:key可以用“宽字符”模糊匹配queue
  • Headers exchange:无视key,通过查看消息头部元数据来决定发给哪个queue(AMQP头部元数据非常丰富,且可以自定义)

这种结构的架构给通讯带来了很大的灵活性,我们能先到的通讯方式都可以用这四种exchange表达出来。如果你需要有一个企业数据总线(在乎灵活性),那么RabbitMQ绝对是值得一用的。

1.2:无Broker的MQ

无Broker的MQ代表是ZeroMQ。
在这里插入图片描述

节点之间通讯的消息都是发送到批次的队列中,每个节点都既是生产者也是消费者。ZeroMQ做的事情就是封装出一套类似Socket的API可以完成发送数据、读取数据。

ZeroMQ其实就是一个跨语言的、重量级的Actor模型的邮箱库。你可以把自己的程序想象成一个Actor,ZeroMQ就是提供邮箱功能的库;ZeroMQ可以实现同一台机器的RPC通讯业可以实现不同机器的TCP、UDP通讯,如果你需要一个强大的、灵活的、野蛮的通讯能力,ZeroMQ会是一个很好的选择。

3、几大MQ产品的比较

常见的MQ产品包括Kafka、RabbitMQ、RocketMQ。

优点缺点使用场景
Kafka吞吐量非常大、性能非常好、集群高可用会丢数据、功能比较单一日志分析、大数据采集
RabbitMQ消息可靠性高、功能全面吞吐量比较低、消息积累会影响性能、erlang语言不好定制小规模场景
RocketMQ高吞吐、高性能、高可用、功能全面开源功能不如云上版、官方文档比较简单、客户端只支持java几乎全场景
消息队列(Message Queue)是一种应用间的通信方式,消息发送后可立即返回,由消息系统确保消息的可靠传递。消息发布者只需把消息发布到 MQ 中,不用管谁来取;消息使用者只管从 MQ 中取消息,不用管是谁发布的,发布者和使用者都无需知道对方的存在[^1]。 在 Linux 系统中,消息队列是进程间通信(IPC)的一种方式,允许一个进程将结构化的数据块(消息)发送到队列中,另一个进程可按照特定规则从队列中获取消息。与管道(pipe)或命名管道(FIFO)相比,消息队列具有一定优势[^4]。 RabbitMQ 是一个功能强大的消息队列中间件,被广泛应用于分布式系统、微服务架构和异步任务处理等场景,它提供了丰富的特性和灵活的配置选项,能满足各种不同的需求。不过,RabbitMQ 只是消息队列的一种[^3]。 在 Linux 系统下使用消息队列,涉及以下操作: 1. **创建,访问一个消息队列**:通过特定函数来创建或访问已有的消息队列。 2. **添加消息到队列中**:将需要传递的消息添加到消息队列里。 3. **从消息队列中获取消息**:按照规则从队列中取出消息。 4. **消息队列的控制函数**:用于对消息队列进行管理和控制等操作[^2]。 消息队列的适用场景主要是异步处理。在一些业务场景中,某些任务不需要立即处理,或者处理过程比较耗时,使用消息队列可以将这些任务异步处理,提高系统的响应速度和吞吐量[^1]。 ```python # 以下是一个简单的伪代码示例,展示消息队列的基本使用思路 # 模拟消息队列 message_queue = [] # 模拟消息发布者 def publish_message(message): message_queue.append(message) print(f"消息 {message} 已发布到队列") # 模拟消息使用者 def consume_message(): if message_queue: message = message_queue.pop(0) print(f"从队列中获取到消息: {message}") else: print("队列中没有消息") # 发布消息 publish_message("Hello, Message Queue!") # 消费消息 consume_message() ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值