我被要求评估 RabbitMQ 而不是 Kafka,但我发现很难找到消息队列比 Kafka 更合适的情况。有谁知道消息队列在吞吐量、持久性、延迟或易用性方面更适合的用例?
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 更容易/更快。
一般来说,如果你想要一个简单/传统的发布-订阅消息代理,显而易见的选择是 RabbitMQ,因为它很可能会比你需要的规模更大。如果我的要求足够简单,可以通过通道/队列处理系统通信,并且不需要保留和流式传输,我会选择 RabbitMQ。
有两种主要情况我会选择 RabbitMQ; 对于长时间运行的任务,当我需要运行可靠的后台作业时。并用于应用程序内部和应用程序之间的通信和集成,即作为微服务之间的中间人;系统只需要通知系统的另一部分开始执行任务,例如在网上商店中处理订单(下订单、更新订单状态、发送订单、付款等)。
一般来说,如果你想要一个用于存储、读取(重读)和分析流数据的框架,请使用 Apache Kafka。 它非常适合经过审核的系统或需要永久存储消息的系统。这些也可以分为分析数据(跟踪、摄取、日志记录、安全性等)或实时处理的两个主要用例。
我在一家同时提供 Apache Kafka 和 RabbitMQ 即服务的公司工作。