大话消息队列的流派之争

  • 时间:
  • 浏览:0
  • 来源:大发彩神iphone版—电脑版大发彩神8

本文来自云栖社区战略协作伙伴"DBAplus",原文发布时间:2016-10-20

MQ真正的目的是为了通讯,屏蔽底层繁杂的通讯协议,定义了一套应用层的、更加简单的通讯协议。十个 多分布式系统中十个 多模块之间通讯要么是HTTP,要么是自己开发的TCP,就让 这有一种协议嘴笨 全是原始的协议。HTTP协议真难实现两端通讯——模块A可不时要调用B,B也可不时要主动调用A,肯能要做到类似于 两端全是背上WebServer,就让 还不支持长连接(HTTP 2.0的库根本这样)。

kafka、JMS就属于类似于 流派,生产者会发送key和数据到Broker,由Broker比较key就让 决定给哪个消费者。这是亲戚亲戚类似于 人 最常见的模式,是亲戚亲戚类似于 人 对MQ最多的印象。在类似于 模式下十个 多topic往往是十个 多比较大的概念,甚至十个 多系统中就肯能只十个 多多topic,topic有一种意义上也不 queue,生产者发送key共要说:“hi,把数据插进key的队列中”。

答案与非 定了,首先ZeroMQ支持请求->应答模式;其次RabbitMQ提供了RPC是地地道道的同步通讯,不到JMS、kafka类似于 架构才不到做异步。亲戚亲戚类似于 人 类似于 人第一次接触MQ全是JMS类似于的类似于 类似于 才会产生类似于 错觉。

重Topic流

kafka在乎的是性能,传输速度

肯能你拿ZeroMQ来做大数据量的传输功能,全是生产者的内存“爆掉”也不 消费者被“压死”;肯能你用kafka做通讯总线那绝对的我太少 快不到迅速;你你要RabbitMQ实现分布式,那真的是难为它。

有broker

类似于 的代表是RabbitMQ(肯能说是AMQP)。生产者发送key和数据,消费者定义订阅的队列,Broker收到数据就让 会通过一定的逻辑计算出key对应的队列,就让 把数据交给队列。

kafka,ZeroMQ,RabbitMQ代表了有一种全部不同风格的MQ架构;关注点全部不同:

顿悟多会儿?Actor模型,ZeroMQ嘴笨 也不 十个 多跨语言的、重量级的Actor模型邮箱库。你要把自己的系统进程池池想象成十个 多actor,ZeroMQ也不 提供邮箱功能的库;ZeroMQ可不时要实现同一台机器的IPC通讯也可不时要实现不同机器的TCP、UDP通讯。肯能你时要十个 多强大的、灵活、野蛮的通讯能力,别犹豫ZeroMQ

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

这篇文章的标题真难起,网上一翻全是各种MQ的性能比较,很容易你要以为我也是不到 “粗俗”的人。我这篇文章你要表达的是——它们根本就十个 多多东西,有毛的性能好比较?

列出功能表来比较MQ差异肯能来一场“MQ性能大比武”的做法全是比较扯的,首真难做的事情应该是分类。我理解的MQ分为十个 多流派:

注意到多会儿?类似于 模式下解耦了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头部元数据非常丰富就让 可不时要自定义)。

如上图所示,Broker定义了十个 多队列,key1,key2,key3,生产者发送数据的就让 会发送key1和data,Broker在推送数据的就让 则推送data(也肯能把key带上)。嘴笨 架构一样就让 kafka的性能要比JMS的性能你也不知道高到好多个倍,类似于 基本类似于 类型的MQ不到kafka有一种备选方案。肯能你时要两根暴力的数据流(在乎性能而非灵活性)不到 kafka是最好的选着。

RabbitMQ追求的是灵活

此门派是AMQP的“叛徒”,某位道友嫌弃AMQP太“重”(那是他没看了用Erlang实现的就让 是多么的行云流水) 类似于 设计了ZeroMQ。这位道友非常睿智,他非常敏锐的意识到——MQ是更高级的Socket,它是解决通讯问提的。类似于 ZeroMQ被设计成了十个 多“库”而就十个 多多底下件,类似于 实现也可不时要达到——不到 broker的目的。

类似于 行态的架构给通讯带来了很大的灵活性,亲戚亲戚类似于 人 能想到的通讯措施都可不时要用这有一种exchange表达出来。肯能你时要十个 多企业数据总线(在乎灵活性)不到 RabbitMQ绝对的值得一用。

ZeroMQ追求的是轻量级、分布式

无broker

TCP就更加原始了,粘包、心跳、私有的协议,想一想头皮就发麻。MQ所要做的也不 在类似于 协议之上构建十个 多简单的“协议”——生产者/消费者模型。MQ带给我的“协议”全是具体的通讯协议,也不 更高层次通讯模型。它定义了十个 多对象——发送数据的叫生产者;消费数据的叫消费者, 提供十个 多SDK让亲戚亲戚类似于 人 可不时要定义自己的生产者和消费者实现消息通讯而无视底层通讯协议。

节点之间通讯的消息全是发送到彼此的队列中,每个节点都既是生产者又是消费者。ZeroMQ做的事情也不 封装出一套类似于于scoket的API可不时要完成发送数据,读取数据。肯能你仔细想一下嘴笨 ZeroMQ是就让 的:

Message Queue(MQ),消息队列底下件。类似于 人都说:MQ通过将消息的发送和接收分离来实现应用系统进程池池的异步和解偶,类似于 给人的直觉是——MQ是异步的,用来解耦的,就让 类似于 也不 MQ的效果而全是目的。

轻Topic流