了解何时使用RabbitMQ或Apache Kafka

原文: https://content.pivotal.io/rabbitmq/understanding-when-to-use-rabbitmq-or-apache-kafka
(由于本人翻译能力有限,请勿较真...)

背景

RabbitMQ是一个“传统的”消息代理,它实现了多种消息协议。最初是为了实现AMQP而开发的,AMQP是一种开放的,具有强大路由功能的消息协议。虽然Java具有像JMS这样的消息标准,但对于需要分布式消息的非Java应用程序来说,这是非常有限的。对于集成场景,例如微服务或单一的集成都是非常有限。随着AMQP的出现,跨语言及灵活性在AMQP消息代理中变得可行。

Apache Kafka是在Scala开发的,最初是在LinkedIn上连接不同的内部系统。当时LinkedIn正在转向更分散的体系结构,需要重新构建像数据集成和实时流处理这样的功能,摆脱以前针对这些问题的单一方法。Kafka今天在Apache软件基金会的产品生态系统中得到了很好的应用,特别在事件驱动架构中尤其有用。

架构和设计

RabbitMQ被设计为一个通用的消息代理,采用点到点,请求/回复和pub-sub通信模式。它使用一个聪明的消息代理/愚蠢(dumb)的消费者模式,专注于向消费者传递一致的消息,消息代理保持消费者与消费者状态基本一致的速度进行消费。RabbitMQ是成熟的、配置容易、性能良好,同时得到很好的支持(客户端库Java,.NET,node.js,Ruby,PHP等多种语言),并且有几十个插件可以扩展更多的场景。

image.png

参考
*Figure 1 - Simplified overall RabbitMQ architecture. Source: http://kth.diva-portal.org/smash/get/diva2:813137/FULLTEXT01.pdf *

RabbitMQ可以根据需要进行同步或异步通信。生产者将消息发送给交换机(Exchange),消费者从队列中获得消息。通过消息交换将生产者从队列中解耦出来,可以保证生产者不需要硬编码路由。RabbitMQ还提供了许多分布式部署方案。它可以设置为多节点集群来联合集群,并且不依赖于外部服务(但某些集群插件需要使用AWS API,DNS,Consul等)。

Apache Kafka设计用于高容量的发布 - 订阅消息和数据流,提供消息持久化,快速和可扩展功能。就其本质而言,Kafka提供了一个持久的消息存储库,类似于在服务器群集中运行的日志,它将记录流存储在称为主题(Topic)的类别中。


image.png

参考
*Figure 2 - Global Apache Kafka architecture (with 1 topic, 1 partition, replication factor 4). Source: http://kth.diva-portal.org/smash/get/diva2:813137/FULLTEXT01.pdf *

每条消息由一个键,一个值和一个时间戳组成。与RabbitMQ几乎相反,Kafka使用一个愚蠢(dumb)的消息代理,并使用聪明的消费者来阅读消息缓冲区。Apache Kafka并不尝试追踪每个消费者阅读了哪些消息,只保留未读消息; 相反,Kafka将所有消息保留一定的时间,消费者负责跟踪他们在每个日志(消费者状态)中的位置。因此,通过开发人员编写消费者代码,Kafka可以支持大量的消费者,并以很少的开销保留大量的数据。但Kafka需要运行外部服务 如上图所示。 - Apache Zookeeper通常是必须安装和运行。

需求和用例

Apache Kafka除了本身作为消息代理外,Kafka添加了Kafka Streams, 可以替代Apache Spark,Apache Flink,Apache Beam / Google Cloud Data Flow和Spring Cloud Data Flow等流式平台。
例如网站活动跟踪、指标、日志聚合、流处理、事件源和提交日志等用例方面做得很好。简单来说例如:

  • 从A流到B,没有复杂的路由,最大吞吐量(100k / sec +),按分区顺序传递至少一次。
  • 当您的应用程序需要访问流历史记录时,按分区顺序传递至少一次。Kafka可以根据需要“重放”事件流,而不是传统的消息代理,一旦消息被传递,它就会从队列中移除。
  • 流处理
  • 事件源

RabbitMQ是一个通用的消息传递解决方案,通常应用于服务器快速响应请求。将消息分发给多个消费者进行消费或在高负载(20k + /秒)之间做出平衡。当您的需求超出吞吐量时,RabbitMQ提供了很多功能可靠的交付,路由,联合,HA,安全,管理工具和其他功能。最适合RabbitMQ的一些场景,比如:

  • 您的应用程序需要使用现有协议或的任何协议的组合,如AMQP 0-9-1,STOMP,MQTT,AMQP 1.0。
  • 您需要在每条消息的基础上进行更细粒度的一致性控制/保证(死信队列等)。但是,Kafka最近增加了对交易类的很好的支持。
  • 您的应用程序需要点对点,请求/回复以及发布/订阅消息
  • 复杂的路由到消费者,整合多个服务/应用的路由逻辑

RabbitMQ也可以有效地解决上面几个Kafka使用案例,但是需要在附加软件的帮助。当应用程序需要访问流历史记录时,RabbitMQ通常与Apache Cassandra一起使用,或者与需要“无限”队列的应用程序的LevelDB插件一起使用,但RabbitMQ本身并不具备这些功能。

开发者经验

安全与运维

性能

Kafka的在性能上非常耀眼:100k /秒的表现往往是人们选择Kafka的关键。

当然,每秒钟的消息速率很难说明和量化,因为它们依赖于你的环境和硬件,工作负载的性质,使用哪种传输保证(例如,持久代价高昂,镜像更是如此)等等。

每秒20K的消息很容易通过一个单一的RabbitMQ队列来实现。再快就很难了,因为队列由一个简单的Erlang轻量级线程支持,该线程在本地操作系统线程池中进行协作调度 - 因此,单个队列永远不会比CPU周期能够做的事情更多,所以这成为瓶颈的所在。

增加每秒消息通信可以通过消息路由(例如,可以同时运行不同的队列)来打破多个队列中的流量,利用RabbitMq环境中的并行性。当RabbitMQ 每秒钟达到100万条消息时,这个用例基本上完全是这样做的 - 但是在30个RabbitMQ节点上使用了大量的资源。大多数RabbitMQ用户都可以在3到7个RabbitMQ节点获得优异的性能。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容