RabbitMQ vs. Kafka: 比较主流的消息平台
Apache Kafka和RabbitMQ是两种广泛使用的消息代理,允许应用程序之间的消息交换解耦。它们最重要的特点是什么,以及它们之间有何不同?让我们了解一下这些概念。
RabbitMQ
RabbitMQ是一种用于通信和消息交换的开源消息代理应用程序。由于它是用Erlang开发的,所以非常轻巧和高效。Erlang语言是由Ericson开发的,专注于分布式系统。
它被认为是一种更传统的messaging broker。它基于发布-订阅模式,尽管可以根据配置的设置以同步或异步的方式处理通信。它还确保生产者和消费者之间的消息传递和排序。
它支持AMQP、STOMP、MQTT、HTTP和web socket协议。有三种消息交换模型:主题、扇出和直接:
- 按主题或主题进行直接和个别交换[topic]
- 连接到队列的所有消费者都会收到[fanout]消息
- 每个消费者都会接收到发送的消息[direct]
RabbitMQ的组件如下:
生产者
生产者是创建和发送消息到RabbitMQ的应用程序。它们可以是任何可以连接到RabbitMQ并发布消息的应用程序。
消费者
消费者是从RabbitMQ接收和处理消息的应用程序。它们可以是任何可以连接到RabbitMQ并订阅消息的应用程序。
交换机
交换机负责接收来自生产者的消息并将其路由到适当的队列。有几种类型的交换机,包括直接、扇出、主题和标头交换机,每种交换机都有自己的路由规则。
队列
队列是消息存储的地方,直到消费者消费它们。它们可以由应用程序创建,也可以在消息发布到交换机时由RabbitMQ自动创建。
绑定
绑定定义交换机和队列之间的关系。它们指定消息的路由规则,交换机使用这些规则将消息路由到适当的队列。
RabbitMQ架构
RabbitMQ使用拉模型进行消息传递。在该模型中,消费者主动请求代理的消息。消息被发布到负责根据路由键将消息路由到适当队列的交换机。
RabbitMQ的架构基于客户端-服务器架构,由多个组件共同工作,提供可靠和可扩展的消息平台。AMQP概念包括交换机、队列、绑定,以及发布者和订阅者。发布者将消息发布到交换机。
交换机接收这些消息,并根据特定规则(绑定)将它们分发到0到n个队列中。队列中存储的消息可以被消费者检索到。在简化形式中,RabbitMQ的消息管理如下:
- 发布者向交换机发送消息;
- 交换机将消息发送给队列和其他交换机;
- 当接收到消息时,RabbitMQ向发送者发送确认;
- 消费者通过持久的TCP连接与RabbitMQ保持连接,并声明接收的队列;
- RabbitMQ将消息路由到消费者;
- 消费者发送成功或错误的接收消息的确认;
- 成功接收后,消息从队列中移除。
Apache Kafka
Apache Kafka是由LinkedIn使用Scala开发的分布式开源消息传递解决方案。它能够使用发布-订阅模型处理和存储消息,具有高可扩展性和性能。
为了存储接收到的事件或消息,使用分区将主题在节点之间分配。它结合了发布-订阅和消息队列模式,并负责确保每个消费者的消息顺序。
Kafka专注于处理实时数据流的高数据吞吐量和低延迟。这是通过在服务器(代理)端避免过多的逻辑以及一些特殊的实现细节来实现的。
例如,Kafka根本不使用RAM,而是立即将数据写入服务器的文件系统。由于所有数据都是按顺序写入的,因此实现了与RAM相当的读写性能。
这些是使Kafka具有可扩展性,性能和容错性的主要概念:
Topic
主题是对消息进行标记或分类的一种方式;想象一个有10个抽屉的衣柜;每个抽屉可以是一个主题,而衣柜则是Apache Kafka平台,所以除了进行分类之外,它还将消息分组,关于主题的另一个更好的类比可以是关系数据库中的表。
Producer
生产者是连接到消息平台并在特定主题上发送一个或多个消息的人。
Consumer
消费者是连接到消息平台并在特定主题上消费一个或多个消息的人。
Broker
Kafka平台中的代理的概念实际上就是Kafka本身,他负责管理主题并定义消息、日志等的存储方式。
Cluster
集群是一组相互通信或不相互通信的代理,用于实现更好的可扩展性和容错性。
Log file
每个主题以日志格式存储其记录,也就是以结构化和顺序的方式;因此,日志文件是包含一个主题信息的文件。
Partitions
分区是主题内消息的分区层;这种分区确保了Apache Kafka的弹性、容错性和可扩展性,使每个主题可以在不同位置具有多个分区。
Apache Kafka的架构
Kafka基于推模型进行消息传递。使用此模型,Kafka中的消息会主动推送给消费者。消息被发布到主题中,并在集群中的不同代理之间进行分区和分发。
消费者可以订阅一个或多个主题,并在这些主题上生成消息时接收到这些消息。
在Kafka中,每个主题被划分为一个或多个分区。事件最终存储在分区中。
如果集群中有多个代理,则分区将均匀分布在所有代理上(在可能的情况下),这将允许将写入和读取的负载扩展到多个代理的一个主题。由于这是一个集群,它使用ZooKeeper进行同步。
它接收、存储和分发记录。记录是由某些系统节点生成的数据,可以是事件或信息。它被发送到集群,并且集群将其存储在主题的分区中。
每个记录都有一个序列偏移量,消费者可以控制它正在消费的偏移量。因此,如果需要重新处理主题,可以根据偏移量进行操作。
逻辑,例如消费者的最后读取消息ID的管理或决定将新到达的数据写入哪个分区等,完全由客户端(生产者或消费者)处理。
除了生产者和消费者的概念外,还存在主题、分区和复制的概念。
主题描述了一类消息。Kafka通过在主题中复制数据并将主题分区到多个服务器来实现容错性和可伸缩性。
RabbitMQ与Kafka的比较
Apache Kafka和RabbitMQ之间的主要差异是这些系统实现的消息传递模型根本不同。
特别是,Apache Kafka基于拉取(pull)原理运作,消费者自己从主题中获取所需的消息。
另一方面,RabbitMQ通过向接收者发送必要的消息来实现推送模型。因此,Kafka与RabbitMQ的区别如下:
#1. 架构
RabbitMQ和Kafka之间最大的区别之一是架构上的差异。RabbitMQ使用传统的基于代理的消息队列架构,而Kafka使用分布式流平台架构。
此外,RabbitMQ使用基于拉取的消息传递模型,而Kafka使用基于推送的模型。
#2. 消息保存
RabbitMQ将消息放入FIFO队列(先进先出),并监视队列中消息的状态,而Kafka将消息添加到日志中(写入磁盘),并将接收者负责从主题中获取所需的信息。
消息在传递到接收者后,RabbitMQ会将消息删除,而Kafka会将消息存储到日志中,直到安排清理日志为止。
因此,Kafka保存当前和所有先前的系统状态,并且可以用作可靠的历史数据来源,而RabbitMQ则不具备这个能力。
#3. 负载均衡
由于拉取模型的消息传递方式,RabbitMQ可以减少延迟。然而,如果消息到达队列的速度快于接收者处理消息的速度,就可能导致接收者溢出。
由于在RabbitMQ中,每个接收者请求/上传不同数量的消息,因此工作的分配可能变得不均衡,这会导致处理过程中的延迟和消息顺序丢失。
为了防止这种情况发生,每个RabbitMQ接收者都配置了一个预取限制,即累积未确认消息的限制。在Kafka中,负载均衡通过将接收者重新分配到主题的分区中来自动执行。
#4. 路由
RabbitMQ包括四种方法来将消息路由到不同的交换机进行排队,从而实现强大而灵活的消息模式。Kafka只实现了一种将消息写入磁盘而无需进行路由的方法。
#5. 消息排序
RabbitMQ允许您在任意集合(群组)的事件中保持相对顺序,而Apache Kafka通过将消息按顺序写入复制日志(主题)提供了一种易于实现有序性且可扩展性的方式。
特性 | RabbitMQ | Kafka |
架构 | 将消息保存在连接到代理的磁盘上 | 分布式流平台架构 |
传递模型 | 拉式模型 | 推式模型 |
保存消息 | 无法保存消息 | 通过写入主题来保持顺序 |
负载均衡 | 配置预取限制 | 自动执行 |
路由 | 包括4种路由方式 | 仅有1种路由消息的方式 |
消息排序 | 允许在群组中保持顺序 | 通过写入主题来保持顺序 |
外部进程 | 不需要 | 需要运行Zookeeper实例 |
插件 | 多个插件 | 支持有限的插件 |
RabbitMQ和Kafka都是广泛使用的消息系统,各自具有自己的优势和应用场景。RabbitMQ是一个灵活、可靠和可扩展的消息系统,擅长消息排队,是需要可靠和灵活的消息传递的应用程序的理想选择。
另一方面,Kafka是一个分布式流平台,专为高吞吐量、实时处理大量数据而设计,适用于需要实时处理和分析数据的应用程序。
RabbitMQ的主要用途:
电子商务
RabbitMQ用于在电子商务应用程序中管理不同系统之间的数据流,例如库存管理、订单处理和付款处理。它可以处理大量的消息,并确保它们可靠、按正确的顺序传递。
医疗保健
在医疗行业中,RabbitMQ用于在不同的系统之间交换数据,例如电子健康记录(EHR)、医疗设备和临床决策支持系统。它可以通过确保正确的信息在正确的时间可用来改善患者护理并减少错误。
金融服务
RabbitMQ实现了系统之间的实时消息传递,例如交易平台、风险管理系统和支付网关。它可以确保交易得到快速且安全地处理。
物联网系统
RabbitMQ用于在物联网系统中管理不同设备和传感器之间的数据流。它可以确保数据在带宽有限且连接不稳定的环境中安全高效地传递。
Kafka是一个分布式流平台,专为实时处理大量数据而设计。
Kafka的主要用途:
实时分析
Kafka在实时分析应用中用于处理和分析生成的数据,使企业能够根据最新信息做出决策。它可以处理大量的数据并满足最苛刻应用的需求。
日志聚合
Kafka可以从不同的系统和应用程序中聚合日志,使企业能够实时监控和解决问题。它还可用于存储日志以进行长期分析和报告。
机器学习
Kafka在机器学习应用中用于实时将数据流传输到模型,使企业能够根据最新信息进行预测和采取行动。它可以帮助提高机器学习的准确度和效果。
我对RabbitMQ和Kafka的观点
RabbitMQ的广泛和多样化的能力使得对消息队列进行灵活管理,但也会增加资源消耗,并在负荷增加时导致性能下降。由于这是复杂系统的操作模式,在大多数情况下,Apache Kafka是管理消息的最佳工具。
例如,在从数十个系统和服务收集和聚合许多事件的情况下,并考虑到它们的地理保留、客户度量、日志文件和分析,以及增加信息来源的前景,我更倾向于使用Kafka。然而,如果你只需要快速消息传递,RabbitMQ也能胜任!
您还可以阅读如何在Windows和Linux中进行install Apache Kafka。