消息队列的流派

大家好,我是尚影嫣,一名Java后端程序媛。如果您喜欢我的文章,欢迎点赞➕关注❤️,让我们一起成为更好的我们~

消息队列的流派

一、什么是 MQ

Message Queue(MQ)是一种消息队列中间件。MQ 真正的目的是为了通讯,屏蔽底层复杂的通讯协议,定义了一套更简单的应用层的通讯协议。分布式系统中模块之间的通讯无非是HTTP或TCP,这两种协议都是原始的协议,MQ 在这些协议之上构建了一个简单的“协议” —— 生产者/消费者模型。它定义了两个对象——生产者和消费者,生产者是发送数据方,消费者是接收数据方,提供SDK让我们定义自己的生产者和消费者实现消息通讯,无视底层通讯协议。

二、有 Broker 的 MQ

这类MQ通常有一台服务器作为Broker,所有的消息都通过它进行中转。生产者只需要将消息发送给它就完成任务了,Broker再将消息主动推送给消费者(或由消费者主动轮询)。

重 Topic

kafka、JMS(ActiveMQ)属于此流派,生产者会发送key和数据到Broker,由Broker对比key后决定发给哪个消费者。这种模式是我们最常见的模式,此模式中一个topic往往是一个较大的概念,甚至一个系统中可能只有一个topic,某种意义上讲topic就是queue。

消息队列的流派_第1张图片

如上图所示,Broker定义了三个队列,key1,key2,key3,生产者发送数据的时候会发送key1和data,Broker 在推送数据的时候则推送data(也可能带上key)。

虽然架构一样,但kafka的性能要比JMS的性能高很多倍,所以重Topic类型的MQ优选kafka。܉

轻 Topic

轻Topic的代表是RabbitMQ(AMQP)。生产者发送key和数据,消费者定义订阅的队列,Broker收到数据后,通过一定逻辑计算出key对应的队列,并将数据交给队列。此模式解耦了key和queue,在这种架构中queue是轻量级的,消费者只关心自己的queue,生产者不必关心数据最终给谁,只需要指定key就行,中间的那层映射在AMQP中叫exchange交换机。

消息队列的流派_第2张图片

AMQP中有四种exchange:

  1. Direct exchange:key等于queue;
  2. Fanout exchange:无视key,会给所有queue各发一份;
  3. Topic exchange:key可以用“宽字符”模糊匹配queue;
  4. Headers exchange:无视key,通过查看消息的头部元数据来决定发给哪个queue。

三、无 Broker 的 MQ

无Broker的MQ的代表是ZeroMQ。MQ是更高级的Socket,它是用来解决通讯问题的,ZeroMQ被设计成了一个库,而不是一个中间件,这种实现也可以达到无Broker的目的。

消息队列的流派_第3张图片

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

本文参与了思否技术征文,欢迎正在阅读的你也加入。

你可能感兴趣的:(javakafka思否技术征文)