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


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

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

Kafka可以被看作是一个持久的消息代理,应用程序可以对磁盘上的流数据进行处理和再处理。Kafka有一个非常简单的路由方法。如果你需要以复杂的方式将消息路由到用户,RabbitMQ有更好的选择。如果你需要支持离线的批处理消费者或者想要低延迟消息的消费者,可以使用Kafka。

In order to understand how to read data from Kafka, we first need to understand its consumers and consumer groups. Partitions allow you to parallelize a topic by splitting the data across multiple nodes. Each record in a partition is assigned and identified by its unique offset. This offset points to the record in a partition. In the latest version of Kafka, Kafka maintains a numerical offset for each record in a partition. A consumer in Kafka can either automatically commit offsets periodically, or it can choose to control this committed position manually. RabbitMQ will keep all states about consumed/acknowledged/unacknowledged messages. I find Kafka more complex to understand than the case of RabbitMQ, where the message is simply removed from the queue once it's acked.

RabbitMQ的队列在空时是最快的,而Kafka以很小的开销保留大量数据——Kafka是为保存和分发大量消息而设计的。(如果你打算在RabbitMQ中使用很长的队列,你可以看看惰性队列。)

Kafka是基于水平扩展(通过增加更多的机器来扩展)而构建的,而RabbitMQ主要是为垂直扩展(通过增加更多的能力来扩展)而设计的。

RabbitMQ has a built-in user-friendly interface that lets you monitor and handle your RabbitMQ server from a web browser. Among other things, queues, connections, channels, exchanges, users and user permissions can be handled - created, deleted and listed in the browser and you can monitor message rates and send/receive messages manually. Kafka has a number of open-source tools, and also some commercial ones, offering the administration and monitoring functionalities. I would say that it's easier/gets faster to get a good understanding of RabbitMQ.

一般来说,如果你想要一个简单的/传统的发布-订阅消息代理,最明显的选择是RabbitMQ,因为它的扩展性很可能比你需要的要大。如果我的需求足够简单,可以通过通道/队列处理系统通信,并且不需要保留和流,我就会选择RabbitMQ。

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

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

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

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

我在一家同时提供Apache Kafka和RabbitMQ as a Service的公司工作。


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

你可以在“传统消息传递”中使用Kafka,但不能在Kafka特定的场景中使用MQ。

文章“Apache Kafka vs.企业服务总线——朋友、敌人还是亦敌亦友?”(https://www.confluent.io/blog/apache-kafka-vs-enterprise-service-bus-esb-friends-enemies-or-frenemies/)讨论了为什么Kafka对集成和消息解决方案(包括RabbitMQ)不是竞争的,而是互补的,以及如何将两者集成。


我能想到的唯一好处是事务性功能,其余的都可以用Kafka来完成


Scaling both is hard in a distributed fault tolerant way but I'd make a case that it's much harder at massive scale with RabbitMQ. It's not trivial to understand Shovel, Federation, Mirrored Msg Queues, ACK, Mem issues, Fault tollerance etc. Not to say you won't also have specific issues with Zookeeper etc on Kafka but there are less moving parts to manage. That said, you get a Polyglot exchange with RMQ which you don't with Kafka. If you want streaming, use Kafka. If you want simple IoT or similar high volume packet delivery, use Kafka. It's about smart consumers. If you want msg flexibility and higher reliability with higher costs and possibly some complexity, use RMQ.


RabbitMQ是一种传统的通用消息代理。它使web服务器能够快速响应请求,并将消息传递到多个服务。发布者能够发布消息并使其可用于队列,以便消费者可以检索它们。通信可以是异步的,也可以是同步的。


另一方面,Apache Kafka不仅仅是一个消息代理。它最初是由LinkedIn设计和实现的,用于作为消息队列。自2011年以来,Kafka已经开源,并迅速发展成为一个分布式流媒体平台,用于实现实时数据管道和流媒体应用程序。

它具有水平可扩展性、容错性、极快的速度和可磨合性 在数千家公司生产。

现代组织有各种各样的数据管道来促进系统或服务之间的通信。当相当数量的服务需要实时相互通信时,事情就变得有点复杂了。

The architecture becomes complex since various integrations are required in order to enable the inter-communication of these services. More precisely, for an architecture that encompasses m source and n target services, n x m distinct integrations need to be written. Also, every integration comes with a different specification, meaning that one might require a different protocol (HTTP, TCP, JDBC, etc.) or a different data representation (Binary, Apache Avro, JSON, etc.), making things even more challenging. Furthermore, source services might address increased load from connections that could potentially impact latency.

通过解耦数据管道,Apache Kafka带来了更简单、更易管理的体系结构。Kafka充当了一个高吞吐量的分布式系统,源服务在其中推送数据流,使它们可供目标服务实时提取。

另外,现在有很多开源的和企业级的用户界面来管理Kafka集群。有关更多详细信息,请参阅我的文章Apache Kafka集群的UI监控工具概述和为什么Apache Kafka?


使用RabbitMQ还是Kafka取决于项目的需求。一般来说,如果你想要一个简单的/传统的发布-订阅消息代理,那么选择RabbitMQ。如果你想构建一个事件驱动的体系结构,在此基础上你的组织将实时处理事件,那么选择Apache Kafka,因为它为这种体系结构类型提供了更多的功能(例如Kafka Streams或ksqlDB)。


Kafka和RabbitMQ的5个主要区别:

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

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


你们忘记的一个关键区别是RabbitMQ是基于推的消息系统,而Kafka是基于拉的消息系统。这在消息传递系统必须满足具有不同处理能力的不同类型的消费者的场景中非常重要。使用基于Pull的系统,消费者可以根据自己的能力消费,而推送系统将推送消息,而不管消费者的状态如何,从而将消费者置于高风险之中。


我将根据我的经验提供一个客观的答案,我也将跳过它们背后的理论,假设你已经知道它和/或其他答案已经提供了足够的答案。

RabbitMQ:如果我的需求足够简单,可以通过通道/队列处理系统通信,保留和流不是需求,我会选择这个。例如,当制造系统构建资产时,它会通知协议系统配置合同等等。

Kafka:主要是事件源需求,当你可能需要处理流(有时是无限的),大量的数据在一次适当的平衡,重放偏移以确保给定的状态等等。请记住,这种体系结构也带来了更多的复杂性,因为它确实包含了主题/分区/代理/墓碑消息等头等重要的概念。


我知道有点晚了,也许你已经间接地说过了,但是,Kafka根本不是一个队列,它是一个日志(就像上面有人说的,基于民意调查)。

简单来说,当你更喜欢RabbitMQ(或任何队列技术)而不是Kafka时,最明显的用例是:

You have multiple consumers consuming from a queue and whenever there is a new message in the queue and an available consumer, you want this message to be processed. If you look closely at how Kafka works, you'll notice it does not know how to do that, because of partition scaling, you'll have a consumer dedicated to a partition and you'll get into starvation issue. Issue that is easily avoided by using simple queue techno. You can think of using a thread that will dispatch the different messages from same partition, but again, Kafka does not have any selective acknowledgment mechanisms.

你能做的最多的就是像那些家伙一样,试着把Kafka转换成一个队列: https://github.com/softwaremill/kmq

雅尼克


在以下情况使用RabbitMQ:

你不需要处理大数据,你更喜欢一个方便的内置UI来监控 不需要自动复制队列 消息没有多个订阅者——因为不像Kafka是一个日志,RabbitMQ是一个队列,消息一旦被消费和确认到达就会被删除 如果您有要求使用通配符和正则表达式的消息 如果定义消息优先级很重要

简而言之: RabbitMQ适用于简单的用例,数据流量低,具有优先级队列和灵活的路由选项。 对于海量数据和高吞吐量使用Kafka。


Apache Kafka is a popular choice for powering data pipelines. Apache kafka added kafka stream to support popular etl use cases. KSQL makes it simple to transform data within the pipeline, readying messages to cleanly land in another system. KSQL is the streaming SQL engine for Apache Kafka. It provides an easy-to-use yet powerful interactive SQL interface for stream processing on Kafka, without the need to write code in a programming language such as Java or Python. KSQL is scalable, elastic, fault-tolerant, and real-time. It supports a wide range of streaming operations, including data filtering, transformations, aggregations, joins, windowing, and sessionization.

https://docs.confluent.io/current/ksql/docs/index.html

对于etl系统来说,Rabbitmq并不是一个受欢迎的选择,它更适合那些需要简单的消息传递系统和更低吞吐量的系统。


我知道这是一个老问题了,但是在处理数据编校时RabbitMQ可能是一个更好的选择。

在RabbitMQ中,默认情况下,一旦消息被消费,它就会被删除。在Kafka中,默认情况下,消息保存一周。通常将这个时间设置为更长的时间,甚至永远不删除它们。

虽然这两个产品都可以配置为保留(或不保留)消息,但如果CCPA或GDPR合规性是一个问题,我会选择RabbitMQ。


简短的回答是“消息确认”。RabbitMQ可以配置为需要消息确认。如果接收方失败,消息将返回队列,另一个接收方可以再次尝试。虽然你可以用自己的代码在Kafka中完成这个任务,但它可以在RabbitMQ中开箱即用。

根据我的经验,如果你有一个需要查询信息流的应用程序,Kafka和KSql是你最好的选择。如果你想要一个排队系统,你最好使用RabbitMQ。


投票最多的答案涵盖了大部分内容,但我想强调用例的观点。卡夫卡能做兔子mq能做的事情吗?答案是肯定的,但兔子mq能做卡夫卡能做的所有事情吗?答案是否定的。

rabbit mq不能做的让kafka与众不同的事情是分布式消息处理。现在读一下得票最多的答案,它会更有意义。

To elaborate, take a use case where you need to create a messaging system that has super high throughput for example "likes" in facebook and You have chosen rabbit mq for that. You created an exchange and queue and a consumer where all publishers (in this case FB users) can publish 'likes' messages. Since your throughput is high, you will create multiple threads in consumer to process messages in parallel but you still bounded by the hardware capacity of the machine where consumer is running. Assuming that one consumer is not sufficient to process all messages - what would you do?

你能再增加一个消费者到队列中吗?不,你不能这样做。 你能创建一个新的队列并绑定该队列来交换发布“喜欢”消息吗?答案是不能,因为你会有两次消息处理。

这是卡夫卡解决的核心问题。它允许您创建分布式分区(rabbit mq中的Queue)和相互通信的分布式消费者。这确保主题中的消息由分布在各个节点(Machines)中的使用者处理。

Kafka代理确保消息在该主题的所有分区上实现负载平衡。消费者组确保所有消费者彼此交谈,并且消息不会被处理两次。

但在现实生活中,除非吞吐量非常高,否则您不会遇到这个问题,因为即使只有一个消费者,rabbit mq也可以非常快地处理数据。


如果你有复杂的路由需求,想要一个内置的GUI来监控代理,那么RabbitMQ可能是最适合你的应用程序。否则,如果你正在寻找一个消息代理来处理高吞吐量并提供对流历史的访问,Kafka可能是更好的选择。


从技术上讲,与Rabbit MQ提供的特性集相比,Kafka提供了一个巨大的超特性集。


如果问题是

Rabbit MQ技术上比Kafka更好吗?

那么答案是

No.


但是,如果问题是

从业务角度看Rabbit MQ比Kafka好吗?

那么,答案是

在某些商业场景中,可能是“Yes”


从业务角度来看,Rabbit MQ可以比Kafka更好,原因如下:

Maintenance of legacy applications that depend on Rabbit MQ Staff training cost and steep learning curve required for implementing Kafka Infrastructure cost for Kafka is higher than that for Rabbit MQ. Troubleshooting problems in Kafka implementation is difficult when compared to that in Rabbit MQ implementation. A Rabbit MQ Developer can easily maintain and support applications that use Rabbit MQ. The same is not true with Kafka. Experience with just Kafka development is not sufficient to maintain and support applications that use Kafka. The support personnel require other skills like zoo-keeper, networking, disk storage too.