当前位置: 首页 > 知识库问答 >
问题:

什么时候使用RabbitMQ而不是Kafka?[闭门]

燕承安
2023-03-14

我被要求评估RabbitMQ而不是Kafka,但我发现很难找到一种比Kafka更适合消息队列的情况。有人知道消息队列在吞吐量、持久性、延迟或易用性方面更适合的用例吗?

共有3个答案

司迪
2023-03-14

我们应该选择哪种消息传递系统,还是应该更改现有的消息传递系统?​

上述问题没有一个答案。当您必须决定哪个消息传递系统或应该更改现有系统时,一种可能的审查方法是“评估范围和成本”

皇甫繁
2023-03-14

我每周都听到这个问题。。。RabbitMQ(如IBM MQ或JMS或其他一般消息传递解决方案)用于传统消息传递,而Apache Kafka则用作流媒体平台(消息传递分布式存储数据处理)。两者都是为不同的用例而构建的。

您可以将Kafka用于“传统消息传递”,但不能将MQ用于Kafka特定的场景。

文章“Apache Kafka vs.Enterprise Service Bus(ESB)-朋友、敌人还是朋友(https://www.confluent.io/blog/apache-kafka-vs-enterprise-service-bus-esb-friends-enemies-or-frenemies/)“讨论了为什么Kafka不是竞争对手,而是对集成和消息传递解决方案(包括RabbitMQ)的补充,以及如何将两者集成。

訾淇
2023-03-14

RabbitMQ是一个可靠的通用消息代理,支持多种协议,如AMQP、MQTT、STOMP等。它可以处理高吞吐量。RabbitMQ的一个常见用例是处理后台作业或长时间运行的任务,例如文件扫描、图像缩放或PDF转换。RabbitMQ也在微服务之间使用,它作为应用程序之间通信的一种手段,避免了传递消息的瓶颈。

Kafka是一种消息总线,针对高通量摄取数据流和重播进行了优化。如果需要移动大量数据、实时处理数据或分析一段时间内的数据,请使用Kafka。换句话说,就是需要收集、存储和处理数据的地方。一个例子是,当你想跟踪用户在网店上的活动,并生成建议购买的商品。另一个例子是用于跟踪、摄取、记录或安全的数据分析。

Kafka可以被视为一个持久的消息代理,应用程序可以在其中处理和重新处理磁盘上的流数据。Kafka有一个非常简单的路由方法。如果需要以复杂的方式将消息路由到消费者,RabbitMQ有更好的选项。如果需要支持批量消费者(可能处于脱机状态)或需要低延迟消息的消费者,请使用Kafka。

为了理解如何读取Kafka的数据,我们首先需要了解它的消费者和消费者群体。分区允许您通过在多个节点上拆分数据来并行化主题。分区中的每条记录都由其唯一的偏移量分配和标识。这个偏移量指向分区中的记录。在最新版本的Kafka中,Kafka为分区中的每条记录维护一个数字偏移量。Kafka中的消费者可以定期自动提交偏移量,也可以选择手动控制该提交位置。RabbitMQ将保留有关已使用/已确认/未确认消息的所有状态。我发现Kafka比RabbitMQ的情况更难理解,在RabbitMQ中,消息一经确认就从队列中删除。

RabbitMQ的队列为空时速度最快,而Kafka以极少的开销保留了大量数据——Kafka专为保存和分发大量消息而设计。(如果你计划在RabbitMQ中有很长的队列,你可以看看惰性队列。)

Kafka从头开始构建时考虑了水平扩容(通过添加更多机器来扩展),而RabbitMQ主要是为垂直扩容(通过添加更多功率来扩展)而设计的。

RabbitMQ有一个内置的用户友好界面,允许您从web浏览器监视和处理RabbitMQ服务器。除此之外,还可以处理队列、连接、频道、交换、用户和用户权限——在浏览器中创建、删除和列出,您可以监控邮件速率并手动发送/接收邮件。Kafka有很多开源工具,也有一些商业工具,提供管理和监控功能。我想说,更好地理解RabbitMQ更容易/更快。

一般来说,如果您想要一个简单的/传统的pub-sub消息代理,最明显的选择是RabbitMQ,因为它很可能会比您需要它来扩展的规模更大。如果我的需求足够简单,可以通过通道/队列处理系统通信,并且不需要保留和流式传输,那么我会选择RabbitMQ。

在两种主要情况下,我会选择RabbitMQ;对于长时间运行的任务,当我需要运行可靠的后台作业时。以及应用程序内部和应用程序之间的通信和集成,即作为微服务之间的中间人;系统只需通知系统的另一部分就可以开始执行任务,比如在网店中处理订单(下单、更新订单状态、发送订单、付款等)。

一般来说,如果您想要一个用于存储、读取(重新读取)和分析流数据的框架,请使用Apache Kafka。它非常适合经过审计或需要永久存储消息的系统。这些也可以分为两个主要用例,用于分析数据(跟踪、摄取、日志记录、安全等)或实时处理。

更多阅读、用例和一些比较数据可以在这里找到:https://www.cloudamqp.com/blog/2019-12-12-when-to-use-rabbitmq-or-apache-kafka.html

还推荐行业论文:“Kafka与RabbitMQ:两种行业参考发布/订阅实现的比较研究”:http://dl.acm.org/citation.cfm?id=3093908

我确实在一家同时提供ApacheKafka和RabbitMQ服务的公司工作。

 类似资料:
  • 问题内容: 我是一名C ++程序员,偶尔使用MySQL处理数据库,但是我的SQL知识非常有限。但是,我当然愿意改变这一点。 目前,我正尝试仅通过SQL查询对数据库中的数据进行分析(!)。但是我将放弃,而是将数据导入C 并使用C 代码进行分析。 我已经与同事讨论了这一点,他们也促使我使用C ++,他说SQL并不是用于复杂的分析,而是主要用于导入(从现有表中)和导出(到新表中)数据,还有更多内容。例如

  • 我是socket.io的新手,已经用node/express/socket.io编写了我的第一个应用程序。我想向公众发布我的应用程序,但我担心它对很多人都不起作用。我有几个朋友测试了我的应用程序,一切都很顺利(这是一个非常简单的应用程序)。我担心的是:现在每个连接似乎都在使用websockets,这正是我想要的。但是,我的应用程序有时会因为客户端的一些奇怪的事情而降级为“投票”吗?如果是,sock

  • 问题内容: 我怎么能说: 为什么函数调用中不需要括号,而最后一行呢? 问题答案: 是一个功能 调用该函数并产生该函数返回的任何值。 setTimeout的目的是在一段时间后运行代码。你需要的功能只是传递给它(这样的setTimeout可以自称在适当的时候函数),因为如果你将它传递给setTimeout的前调用的函数(用括号),将执行 现在 而不是1秒后,。

  • 问题内容: 奇怪的是: 似乎或多或少被定义为。通过这种方式很容易产生错误: 一些fname意外地以else块结尾。修复很简单,我们应该改用它,但是从表面上看,这似乎是一种不错的pythonic方式,并且比“正确”的方式更具可读性。 由于字符串是不可变的,所以为什么字符串错误是什么技术细节?什么时候进行身份检查更好,什么时候进行平等检查更好? 问题答案: 据我所知,检查对象身份是否相等。由于没有强制

  • 想改进这个问题吗 通过编辑此帖子,更新问题,以便用事实和引用来回答。 最初的关闭原因未得到解决 我正在开发Apache Kafka。我想知道哪一个更好:Kafka和ActiveMQ。这两种技术的主要区别是什么?我想在Spring MVC中实现Kafka。

  • 我遇到了新的列表实现,称为GlueList 我想知道什么时候应该使用ArrayList或LinkedList。