什么时候该用RabbitMQ ,什么时候该用 Apache Kafka

人类如何做出决策? 在日常生活中,情感总是短路因素,导致在复杂或压倒性的决定上扣动扳机。但对于做有长期影响,复杂决策,的表意识,不可能是纯粹的冲动。高性能的人通常使用断路器,“本能,” “直觉,” 或其他的情绪,只有一次他们的表意识,潜意识吸收了作出决定所需的所有事实。

今天有很多的消息传递技术, 数不清的 ESBs, 和近100 iPaaS供应商在市场上。 自然,这导致了有关如何为您的需要-特别是那些已经投资在一个特定的选择,选择正确的消息传递技术的问题 。我们批发选择吗? 用正确的工具做正确的工作?我们有没有正确地布置手头的工作以满足业务需求? 鉴于此,对我来说,合适的工具是什么? 更糟糕的是,详尽的市场分析可能永远无法完成,但由于集成代码的平均寿命,尽职调查是至关重要的。

这篇文章致力于给予潜意识,表意识 一些公平的考虑,从今天最现代,最受欢迎的选择: RabbitMQ和Apache Kafka。 每个都有自己的起源故事, 设计意图,使用案例,被应用, 整合能力,和开发人员的经验。对于任何的软件,起源揭示总体设计意图,都是一个很好的起点。

起源

RabbitMQ 是一个 “传统的” 消息代理,实现多种消息传递协议。 是第一个开源消息代理,达到合理的功能水平, 客户端库,开发工具,和质量文档。 RabbitMQ 最初开发来实现AMQP,具有强大路由功能的消息传递的开放式路由协议。尽管Java有消息传递标准像JMS,但对需要传递消息的分布式非java应用没有帮助,这严重限制了很多集成方案,微服务或单组件。随着AMQP的到来,跨语言的灵活性,成为真正的开源消息代理。

Apache Kafka是用Scala开发的,起初应用于 LinkedIn ,作为一种简化Hadoop 从 Apache Flume提取消息的方案。 从复数数据源消费和生产的数据,为每个源和目标配对编写独立的数据管道。Kafka 帮助 LinkedIn 标准化数据管道并允许将数据从每个系统中取出一次并存入每个系统一次,使管道 (和操作) 更简单。Kafka是如今Apache Software软件基金会的通用配置。特别地,很好的与Apache Zookeeper集成,形成了Kafka分布式分区的支柱。 许多人认为 Zookeeper的需求并不是那么高,它赋予了Kafka用户集群的益处。

体系结构和设计

RabbitMQ i被设计为通用消息代理,采用点对点的几种变化, 请求/答复,和发布-订阅通信风格模式。它使用智能代理/哑消费者模型,专注于消息传递消费者的一致性,作为代理跟踪消费者的状态,保证以大致相同的速度消费。配置正确时表现良好,成熟,被支持的很好 (客户端库包括 Java, .NET, node.js, Ruby, PHP和很多其他语言),有几十个插件可用,将其扩展到更多用例和集成场景。

简化的整体 RabbitMQ 体系结构(source).

RabbitMQ的通信,根据需要可以是同步或异步。推送者发送消息到交换区,消费者从队列检索消息。 通过发送消息到交换区的形式,将生产者解耦,确保生产者不承担硬编码路由压力。 RabbitMQ 还提供了一些分布式部署方案 (要求所有节点可以解析主机名)。它可以设置为多节点集群为集群联盟,并且不依赖外部服务 (但一些集群形成插件可以使用AWS APIs, DNS, Consul,等)。

Apache Kafka 是专为高容量发布-订阅消息流设计的,意味着经久耐用, 快速,而且可扩展的。在其本质上, Kafka 提供持久的消息存储,在某些方面类似于数据库,在服务器集群中运行,存储流记录的类别称为主题。

 全局 Apache Kafka 体系结构(1 主题, 1 分区, 4 复制因子). (source)

每条消息包含一个键,一个值和一个时间戳。 同RabbitMQ几乎相反, Kafka使用了笨代理, 并使用智能消费者读取其缓冲区。 Kafka不尝试跟踪那些被消费者消费的消息,只保留未读消息;相反, Kafka保留所有消息的一组时间,消费者负责跟踪他们在每个日志的位置 (消费状态)。 因此,用正确的开发者人才 创建消费者代码, Kafka 可以支持大量的消费者并且保留大量数据以很少的开销。如上图所示,Kafka确实需要外部服务运行 – 在这种情况下,Apache Zookeeper, 通常被认为是必要,理解,设置,和操作的。

需求和用例

许多开发人员开始探索消息传递,当他们意识到他们必须把很多东西连接在一起,和其他集成模式,如共享数据库是不可行的或太危险的时候。

Apache Kafka 将其描述为分布式流媒体平台,但更为人知的是一个持久的存储库,有着很好的Hadoop/Spark 支持。文档做得很好,讨论流行的用例,比如网站活动跟踪,指标,日志聚合,流处理,事件溯源和提交日志。这些用例之一,它描述了消息,可能产生一些混乱。 所以让我们打开一点,看的更清晰,关于哪种消息方案更适合Kafka,比如:

  • 从A到B的流没有复杂的路由, 有最大吞吐量(100k/sec+),按分区顺序交付至少一次。
  • 当你的应用程序需要访问流历史,按分区顺序交付至少一次。Kafka是持久的消息存储和客户可以得到一个 “replay” 事件流的需求,相对于更传统的消息代理,一旦一个消息被交付,就会从队列中移除。
  • 当你有聪明的消费者,能可靠地跟踪他们的日志偏移。
  • 如果您的应用程序需要 “无限的” 队列。

RabbitMQ是一个通用消息传递解决方案,通常用于, 当用户等待结果时,允许web服务器快速响应请求,而不是被迫执行重资源程序。也有利于分发消息到多个消费者进行消费, 或在高负荷条件下平衡worker之间的荷载 (20k+/sec)。当你的需求超越吞吐量, RabbitMQ有很多提供: 特性,可靠消息传递, 路由,联合会, HA, 安全, 管理工具和其他特性。让我们看看一些最适合RabbitMQ的场景,比如:

  • 您的应用程序需要,与现有协议组合,比如AMQP 0-9-1, STOMP, MQTT, AMQP 1.0.
  • 你需要成熟,容易理解的一致性保证,为您的信息传递。
  • 你的应用需要多种类型的点对点协议,请求/应答,和发布/订阅 消息.
  • 复杂的消费者路由,整合多个服务/应用程序,使用难以掌握的路由逻辑。
  • 当与你现有的 IT 基础设施整合很重要, RabbitMQ 更好。

RabbitMQ 也可以有效地解决几个上面的Kafka强有力的用例,但要借助额外的软件。RabbitMQ经常与Apache Cassandra配合使用,当应用程序需要访问流历史时,或与LevelDB插件,对于应用程序需要 “无限” 队列, 但都不是RabbitMQ自带的。

开发经验

RabbitMQ正式支持Java, Spring, .NET, PHP, Python, Ruby, JavaScript, Go, Elixir, Objective-C, Swift – 与许多其他 客户和开发工具,通过社区插件。RabbitMQ 客户端库是成熟且良好文档的。

Apache Kafka 在这一领域已经取得了长足进步,虽然他主要是Java客户端,有越来越多的社区目录 开放源码客户端, 生态系统项目,以及作为适配器 SDK 允许您建立自己的系统集成。大部分的配置已经设定好了,通过.properties 文件或编程方式。

这两个选项的流行,在许多其他软件供应商,有很强的影响力,确保RabbitMQ 和Kafka正常工作,通过他们的技术。

安全和操作

安全和操作都是RabbitMQ的强项。 RabbitMQ管理插件提供了HTTP API,一个基于浏览器的 UI 用于管理和监控,加上CLI工具给予操作员。 外部工具,如果长期监测数据存储,比如CollectD, Datadog或者New Relic也是需要的。 RabbitMQ还提供了API和监控工具,审核和应用故障排除。除了支持TLS,RabbitMQ附带RBAC支持通过内置数据存储, LDAP或外部基于HTTPS的供应商,并支持身份验证使用x509证书,代替用户名/密码对。额外的身份验证方法 可以使用插件相当直接地扩展。

这些领域对Apache Kafka.构成了挑战。在安全方面,最近的Kafka 0.9版本附加了TLS,,JAAS基于角色的访问控制,Kerberos/plain/scram认证,使用CLI管理安全策略。 这使得早期版本大幅改善,当时您只能在网络级别锁定访问权限,对于共享或多用户,这不起作用。

Kafka使用管理CLI由shell脚本、 属性文件组成,特别是格式化JSON文件。 Kafka 经纪人,生产者,和消费者排放指标 通过Yammer / JMX,但不维护任何历史,这实际意味着使用第三方监测系统。使用这些工具,操作能够管理分区和主题,检查消费者偏移位置,与使用Apache Zookeeper为Kafka提供的HA和FT功能。例如,一个3节点Kafka 集群 即使两个节点失败也能提供功能。然而,如果你想支持Zookeeper最大数目的失败,你需要额外的5个Zookeeper节点 ,Zookeeper是基于法定人数的系统,只能容忍 N/2+1的失败。这明显的不应该共存与Kafka节点 – 因此,要建立的3节点卡夫卡系统,您需要大约八台服务器。 运营商当推理任何卡夫卡系统的可用性时,考虑到ZK集群属性,无论是资源消耗还是设计。

性能

Kafka照以下设计:100k/sec性能往往是人们选择 Apache Kafka的关键驱动力。它的实现很大依赖开发者能够写出聪明的消费者代码。

当然,每秒消息速率是很难状态和量化,因为他们依赖很多,包括你的环境和硬件,工作负载的性质,使用哪种交货保证 (e.g. 持久性是昂贵的,镜像更是如此), etc.

20K/sec是很容易使用一个Rabbit队列实现的, 事实上跟多一些也不是很难,只要没有太多要求的担保。队列的支持,通过一个, 在本地操作系统线程池上进行协作调度的,轻量级的Erlang线程 – 因此,它自然成为了单队列的关键点或瓶颈,永远不会做比CPU周期内能得到的更多的工作。

增加信息秒速率通常归结为妥善利用可用的并行性环境,通过诸如通过聪明的路由打破交通跨多个队列 (从而可以同时运行不同的队列)。当RabbitMQ实现一百万每秒的消息传递, 它通常会明智的慢下来 – 但通过使用大量的资源,周围 30 RabbitMQ节点。 大多数RabbitMQ使用者享受由三到七个RabbitMQ节点提供的高性能。

Making the Call

市场上的其他高级选项的一些研究。如果你想深入与最流行的选择,查看 Nicolas Nannoni硕士论文 ,它独具特色的一面,比较表在4.4节 (page 39) 两年后仍然相当准确 – 值得一读。

在研究时,尽可能形成涉众和业务的循环。理解商业用例是为你的情况做出正确的选择的最大的单因素 。 然后, 如果你是流行技术粉,你最好的办法就是睡在上面, 让它渗透,让你的本能接管。 你就明白了。

本文作者:佚名

来源:51CTO

时间: 2024-09-14 00:30:31

什么时候该用RabbitMQ ,什么时候该用 Apache Kafka的相关文章

RabbitMq、ActiveMq、ZeroMq、kafka之间的比较,资料汇总

本文转载自:http://blog.csdn.net/linsongbin1/article/details/47781187 ---------------------------------------------------------------------------------------------------- MQ框架非常之多,比较流行的有RabbitMq.ActiveMq.ZeroMq.kafka.这几种MQ到底应该选择哪个?要根据自己项目的业务场景和需求.下面我列出这些MQ

Kafka、RabbitMQ、RocketMQ 消息中间件的对比 | 消息发送性能篇

阿里云消息队列测试小组 出品 分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦.现在开源的消息中间件有很多,我们自家的产品 RocketMQ (阿里云消息队列(MQ)的内核) 也顺利开源,得到大家的关注. 那么,消息中间件性能究竟哪家强? 带着这个疑问,我们消息队列测试小组对常见的三类消息产品(Kafka.RabbitMQ.RocketMQ)做了性能比较. Kafka是LinkedIn开源的分布式发布-订阅消息系统,目前归属于Apache定级项目.Kafka主要特点是基于P

RabbitMQ之TTL(Time-To-Live 过期时间)

1. 概述 RabbitMQ可以对消息和队列设置TTL. 目前有两种方法可以设置.第一种方法是通过队列属性设置,队列中所有消息都有相同的过期时间.第二种方法是对消息进行单独设置,每条消息TTL可以不同.如果上述两种方法同时使用,则消息的过期时间以两者之间TTL较小的那个数值为准.消息在队列的生存时间一旦超过设置的TTL值,就称为dead message, 消费者将无法再收到该消息. 2. 设置队列属性 通过队列属性设置消息TTL的方法是在queue.declare方法中加入x-message-t

软件架构模式转载

概要介绍 最近一两年,转载文章越来越少了,之所以转载这篇文章,是因为看这篇文章,弄明白了我的一些问题.所以梳理了一下,结合了几篇文章. 架构模式可以帮助你定义程序的基本特征和行为.例如一些架构模式很自然让程序成为大规模(scalable)的程序.有些模式让程序变得灵巧敏捷(agile).知道这些架构的特征,优点和缺点,你就可以根据你特定的业务需求和目标从容的选择一种架构模式.作为一位架构师,你总会为自己架构选择做解释,尤其你选择一个特别的架构模式的时候.O'Reilly的这本书提供了充足的信息来

Hadoop学习资源集合

Hadoop是一个由Apache基金会所开发的开源分布式系统基础架构.用户可以在不了解分布式底层细节的情况下,开发分布式程序,充分利用集群的威力进行高速运算和存储.Hadoop得以在大数据处理应用中广泛应用得益于其自身在数据提取.变形和加载(ETL)方面上的天然优势.Hadoop的分布式架构,将大数据处理引擎尽可能的靠近存储. 目录: Awesome Hadoop Hadoop YARN NoSQL Hadoop上的SQL 数据管理 工作流.生命周期及管理 数据提取与整合 DSL 库和工具 实时

Kafka Producer拦截器

Kafka中的拦截器(Interceptor)是0.10.x.x版本引入的一个功能,一共有两种:Kafka Producer端的拦截器和Kafka Consumer端的拦截器.本篇主要讲述的是Kafka Producer端的拦截器,它主要用来对消息进行拦截或者修改,也可以用于Producer的Callback回调之前进行相应的预处理. 使用Kafka Producer端的拦截器非常简单,主要是实现ProducerInterceptor接口,此接口包含4个方法: 1. ProducerRecord

Kafka源码环境搭建

本文主要讲述的是如何搭建Kafka的源码环境,主要针对的Windows操作系统下IntelliJ IDEA编译器,其余操作系统或者IDE可以类推. 1.安装和配置JDK 确认JDK版本至少为1.7,最好是1.8及以上.使用java -version命令来查看当前JDK的版本,示例如下: C:\Users\hidden> java -version java version "1.8.0_112" Java(TM) SE Runtime Environment (build 1.8

大数据,数据分析,机器学习,架构等相关系统名称名词解释

常用的一些软件或其他 1.日志(日志收集,日志处理) 风来了.fox 1.1 Logstash Logstash是一款轻量级的日志搜集处理框架,可以方便的把分散的.多样化的日志搜集起来,并进行自定义的处理,然后传输到指定的位置,比如某个服务器或者文件. 1.2 Filebeat Filebeat是一个开源的文件收集器,主要用于获取日志文件,并把它们发送到logstash或elasticsearch 1.3 Scribe Scribe是Facebook开源的日志收集系统,在Facebook内部已经

基于.NET平台常用的框架整理

原文:基于.NET平台常用的框架整理 转:http://www.cnblogs.com/hgmyz/p/5313983.html 自从学习.NET以来,优雅的编程风格,极度简单的可扩展性,足够强大开发工具,极小的学习曲线,让我对这个平台产生了浓厚的兴趣,在工作和学习中也积累了一些开源的组件,就目前想到的先整理于此,如果再想到,就继续补充这篇日志,日积月累,就能形成一个自己的组件经验库. 分布式缓存框架: Microsoft Velocity:微软自家分布式缓存服务框架. Memcahed:一套分