谈谈消息队列的流派
2020-07-18 12:57
393 查看
关于 MQ 的定义
Message Queue(
MQ)消息队列中间件,通常我们在网上看到的对其定义是将消息的发送和接受分离来实现应用程序的异步和解耦,给人的直觉是
MQ是异步的,用来解耦的。但这个只是
MQ的效果,而不是目的。
MQ真正的目的是为了通讯,屏蔽底层复杂的通讯协议,定义了一套应用层上更加简单的通讯协议。
一套分布式系统中两个模块之间通讯要么是
HTTP,要么是
TCP,但这两种协议其实都是原始的协议。前者实现通讯就必须要做到各客户端都有
WebServer,而且不支持长连接;后者就更加原始了 — 粘包、心跳、私有的协议。
而
MQ所要做就是在基于这些现有的协议之上构建一个更简单的通讯(生产者/消费者)模型。它定义了两个对象 —发送数据的叫生产者,接受数据的叫消费者,提供一个 SDK 给我们自己定义生产者和消费者实现消息通讯,且无视底层通讯协议。
带 Broker 的流派
这个流派通常有一台服务器作为
Broker,所有的消息都通过它进行中转。生产者把消息发送给它就结束自己的任务了,最后
Broker则把消息主动推送给消费者(或者消费者主动轮询)。
重 Topic 的 MQ
Kafka、
Active MQ就属于这个流派:生产者发送
key和数据到
Broker,由
Broker比较
key之后决定给哪个消费者。
在这种模式下,
Topic(主题消息)往往是一个比较大的概念,甚至一个系统中就可能只有一个
Topic。
虽然这两种消息队列的架构一样,但是
Kafka的性能要比
Active MQ的性能不知道高到多少倍,所以基本这种类型的
MQ只有
Kafka一种备选方案。
轻 Topic 的 MQ
这种的代表是
RabbitMQ(
AMQP)。生产者发送
key和数据,
Borker收到数据之后会根据
key通过一定的逻辑计算出相应的队列,最后消费者订阅队列。
在这种架构中
Queue是非常轻量级的(在
RabbitMQ中它的上限取决于你的内存),消费者关心的只是自己的
Queue;生产者不必关心数据最终给谁,只要指定
key就行了。中间的那层映射在
AMQP中叫
exchange(交换机)。
AMQP中有四种
exchange:
Direct exchange
:key
等于queue
。Fanout exchange
:无视key
,给所有的queue
都来一份。Topic exchange
:key
可以用 “宽字符” 模糊匹配queue
。Headers exchange
:无视key
,通过查看消息的头部元数据来决定发给哪个queue
。
这种架构给通讯带来了极大的灵活性,我们能想到的通讯方式都可以用这四种
exchange表达出来。
不带 Broker 的流派
ZeroMQ
不带
Broker的
MQ代表就是
ZeroMQ。可以说是解决通讯问题的更高级
Socket,它被设计成了一个 “库” 而不是一个中间件,这种实现也可以达到没有
Broker的目的。
各节点之间的通讯都是发送到彼此的队列中,每个节点即是生产者也是消费者。类似于一套
Socket的
API,可以完成发送和读取数据。
文章作者:彭超
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 彭超 | Blog!
相关文章推荐
- 消息队列的流派之争
- 消息队列的流派之争
- 消息队列的流派之争
- 谈谈你是如何理解JS异步编程的,EventLoop、消息队列都是做什么的,什么是宏任务,什么是微任务
- 大话消息队列的流派之争
- MQ(一)消息队列的流派
- 消息队列的流派之争
- 消息队列的流派之争
- 【转】消息队列的流派之争
- Linux进程通信IPC--消息队列MessageQueue
- NET中使用消息队列通讯
- POSIX和SYSTEM的消息队列应该注意的问题
- 进程间通信----使用消息队列
- 第二十五章:Go语言使用NSQ消息队列
- .NET消息队列(存档)
- 开源消息队列FastMQ V0.1.0 发布
- 《Linux程序设计》——信号量、共享内存和消息队列
- PHP消息队列httpsqs安装与使用
- 主流消息队列RabbitMQ Kafka ActiveMQ RocketMQ使用对比
- android之旅9 网络编程与消息队列