MQ(一)消息队列的流派

ぃ、小莉子 提交于 2020-03-01 08:35:54

什么是 MQ

Message Queue(MQ),消息队列中间件。
很多人都说:
MQ 通过将消息的发送和接收分离来实现应用程序的异步和解偶,这个给人的直觉是——MQ 是异步的,用来解耦的,但是这个只是 MQ 的效果而不是目的。
MQ 真正的目的是为了通讯,屏蔽底层复杂的通讯协议,定义了一套应用层的、更加简单的通讯协议。
一个分布式系统中两个模块之间通讯要么是 HTTP,要么是自己开发的 TCP,但是这两种协议其实都是原始的协议。
HTTP 协议很难实现两端通讯——模块 A 可以调用 B,B 也可以主动调用 A,如果要做到这个两端都要背上 WebServer,而且还不支持长连接(HTTP 2.0 的库根本找不到)。
TCP 就更加原始了,粘包、心跳、私有的协议,想一想头皮就发麻。

MQ 所要做的就是在这些协议之上构建一个简单的“协议”——生产者/消费者模型。
MQ 带给我的“协议”不是具体的通讯协议,而是更高层次通讯模型
它定义了两个对象——发送数据的叫生产者,接收数据的叫消费者;
提供一个 SDK 让我们可以定义自己的生产者和消费者实现消息通讯而无视底层通讯协议。


分类:

MQ,分为有Broker的MQ,和没有Broker的MQ。
Broker,代理,经纪人的意思。


无Broker的MQ

无 Broker 的 MQ 的代表是 ZeroMQ。

有Broker的MQ

分为重Topic的MQ和轻Topic的MQ;
Topic,主题,标题的意思;

重Topic的MQ:

代表: Kafka
你需要一条暴力的数据流(在乎性能而非灵活性)那么 kafka 是最好的选择。

轻 Topic的MQ

这种的代表是 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 表达出来。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!