Kafka与RabbitMQ:比较Node.js的消息经纪商

488 阅读10分钟

消息代理是一个计算机程序,它允许软件、系统和服务相互通信并交换数据,从应用程序接收传入的消息并对其执行操作。

通过使用消息中介,生产者和消费者可以使用一个标准的通信协议与中介进行通信,由中介处理所有数据的状态管理和跟踪。

这意味着所有的消费者应用程序不需要承担管理状态、跟踪的责任,也不需要承担消息代理本身的消息传递复杂性。消息代理依赖于一个叫做消息队列的组件,它可以存储消息,直到消费者服务可以处理它们。

在这篇文章中,我们将比较两个Node.js消息代理。Apache Kafka和RabbitMQ。我们将回顾消息代理模式的基础知识、每个消息代理提供的内容、相关的使用案例等,包括。

消息代理通信模式

消息代理有两种通信形式,我们将对此进行讨论。

  1. 点对点消息传递
  2. 发布/订阅消息传递

点对点消息传递

消息代理中的点对点消息传递方式采用了消息队列中利用的分布模式,消息的发送者和接收者之间是一对一的关系。

在这里,队列中的消息只发送给一个接收者,并被消耗一次。

Point-To-Point Messaging Diagram With Two Producers, A Queue, And A Consumer

发布/订阅消息传递

发布/订阅消息的通信方法意味着生产者发布到主题的任何消息都会被该主题的所有订阅者立即收到。

在这里,所有的消息都发布到一个主题,并分发到订阅该主题的所有应用程序。

Publish/Subscribe Messaging Diagram, Including A Producer, Exchanger, Two Queues, And Two Consumers

什么是Apache Kafka?

Apache Kafka是一个开源的分布式流媒体平台,使用户有能力开发实时的、事件驱动的应用程序。这个基于经纪人的解决方案通过维护数据流来运作,因为它在一个服务器集群内记录。

因为它作为一个集群运行,可以跨越多个服务器甚至多个数据中心,Kafka通过将记录流(消息)存储在主题中的多个服务器实例上,提供数据持久性。在Kafka中,一个主题是跨越Kafka代理的一个或多个分区的一组。

Kafka APIs

Kafka生产者API

Kafka的生产者API允许应用程序产生数据流,包括创建记录并将其生产到主题,其中主题是一个有序的事件列表。

Kafka消费者API

Kafka消费者API订阅了一个或多个主题,并实时监听数据。它也可以只消费保存在主题中的旧数据。

Kafka streams API

流API从一个或多个主题消费,然后实时分析或转换数据。然后,它产生的流到一个主题。

Kafka连接器API

连接器API使开发人员能够编写连接器,它是可重复使用的生产者和消费者。连接器API还允许实现连接器或节点,不断地从源系统或应用程序拉到Kafka,或从Kafka推到应用程序。

Kafka的使用案例

使用Kafka最适合于消息传递,实时处理记录流,以及发布/订阅事件记录流。

它也非常适用于事件源和提交日志。事件源是一种应用风格,数据状态的变化被记录在一个时间顺序的记录中。这些数据变化是一个不可改变的事件序列或日志。

另一方面,提交日志使用Kafka作为分布式系统的外部提交日志。

什么是 RabbitMQ?

RabbitMQ 实现了高级消息排队协议(AMQP)模型。这意味着 RabbitMQ 接受来自生产者的消息,然后将它们传递给消费者,作为一个中间人来减少网络应用服务器所承担的工作量。

在 RabbitMQ 中,生产者的消息不直接发布到队列,而是发布到一个交换中心。交易所根据交易所类型向队列传递消息,而消费者服务则从队列中获取数据。

这意味着在发布消息时,生产者必须指定要使用的交换类型。

RabbitMQ 交换的类型

RabbitMQ 提供的交换有四种类型:扇出、直接、主题和头。

RabbitMQ 的扇出交换

扇出交换会复制一条消息并将其发送到每个可用的队列。

RabbitMQ 的直接交换

直接交换将消息发送到其绑定密钥与消息的路由密钥匹配的队列。

RabbitMQ 的主题交换

RabbitMQ 的主题交换在路由密钥和绑定密钥之间提供部分匹配。然后,消息以包含一系列由句点分隔的单词的路由密钥发布。

RabbitMQ 的报头交换

RabbitMQ 的报头交换提供了一个完全被忽略的路由密钥,消息根据报头在系统中移动。

RabbitMQ 用例

RabbitMQ 的一些用例包括以下内容。

  • 对消费者的复杂路由
  • 消息传递
  • 发送大型/许多电子邮件
  • 交付通知

RabbitMQ 还可用于支持传统协议的应用程序。RabbitMQ 允许客户端通过一系列不同的开放和标准化协议进行连接,例如 STOMP 和 MQTT。

RabbitMQ 还可实现两个或多个微服务之间的通信。大多数用户将RabbitMQ用于微服务,它作为一个中间人在不同服务之间传递数据,避免了传递消息时的瓶颈。

比较RabbitMQ和Kafka

Apache Kafka 和 RabbitMQ 之间的主要区别在于 RabbitMQ 是一个消息代理,而 Kafka 是一个分布式流媒体平台。

RabbitMQ与Kafka的架构对比

在架构方面,Kafka使用大量的发布/订阅消息和一个流平台,速度很快。因为消息使用服务器集群,Kafka可以在一个或多个主题中存储各种记录。

它还由多个经纪人、主题和分区组成,同时提供持久和可扩展的大批量发布/订阅消息。

对于RabbitMQ,消息代理涉及点对点消息传递和发布/订阅通信设计。它由队列组成,其通信可以是同步的或异步的。

通过确保从交换器到消费者的消息的持续交付,生产者和消费者之间没有直接通信。

RabbitMQ与Kafka的性能对比

在性能方面,Kafka提供了比RabbitMQ更高的性能,因为它使用了连续的磁盘I/O来提高其性能,从而使它成为形成实现队列的最佳选择。

这并不意味着RabbitMQ很慢,因为RabbitMQ也可以每秒处理超过一百万条消息。然而,它确实需要更多的系统资源来处理。

大多数时候,RabbitMQ与Apache Cassandra等工具相结合,以提高其性能和可信度。

RabbitMQ与Kafka消息保留的比较

RabbitMQ 在消费者确认消息后会立即弹出消息。这种特殊的行为不能被改变,因为它是消息代理的一部分。

另一方面,Kafka根据每个主题配置的超时来保留消息。它并不关心消费者是否确认了消息,因为它作为一个消息日志。此外,可以配置保留。

RabbitMQ 消息保留的优点和缺点

RabbitMQ 确保消息一旦被请求就能到达消费者手中。但是,一旦消费者成功消费了消息,所有消息就会丢失。而且,一旦消息被消费,就立即驱逐所有消息的行为是无法改变的。

Kafka消息保留的优点和缺点

使用Kafka进行消息保留的唯一缺点是,一旦配置的时间结束,消息会立即丢失。

RabbitMQ与Kafka消息路由的比较

在路由方面,RabbitMQ 根据基于订阅者的路由规则将消息路由到消息交换的订阅者。RabbitMQ 中的消息路由可以是扇出、主题、直接或标题类型的交换。

Kafka不允许任何消费者在查询消息之前过滤主题中的消息。在Kafka中,任何订阅的消费者都能无误地获得分部中的所有消息,并且消息被推送到有消费者订阅的主题中。

RabbitMQ消息路由的优点和缺点

RabbitMQ 根据定义的路由规则将消息路由给订阅者,路由密钥用于消息路由。然而,只有具有相同路由键或头文件的消费者才能访问消息。

Kafka消息路由的优点和缺点

另一方面,Kafka不允许消费者在轮询前过滤主题中的消息。而且,Kafka需要一个额外的服务,称为Kafka Stream Jobs ,帮助从一个主题中读取消息,并将其发送到消费者可以订阅的另一个主题。

RabbitMQ与Kafka的监控

RabbitMQ 提供了一个用户友好的用户界面,可直接在 Web 浏览器上监控活动。队列、连接、通道、交换、用户和用户权限等活动可以在浏览器中处理(创建、删除和列出)和监控,提供了灵活性。

Kafka有许多开源工具用于监控活动和管理功能,如Yahoo Kafka管理器和KafDrop。

RabbitMQ监控的优点和缺点

RabbitMQ带有一个内置的管理UI,暴露了许多指标。然而,在第一个屏幕上披露了太多的指标,从而使其难以维护和跟踪数据变化。

Kafka监控的优点和缺点

你可以为Kafka中不同种类的指标安装不同的管理工具,比如,如果你想监测消费者的滞后率,最好的工具是Burrow**。**

然而,你还必须安装其他开源工具来监控活动,导致不同的监控工具用于监控不同的活动。

RabbitMQ 与 Kafka 消费者模式的比较

RabbitMQ 使用智能代理/哑巴消费者模式,这意味着消息代理将消息传递给消费者并持续跟踪其状态。

RabbitMQ还管理向消费者分发消息的工作,并在消息被确认后将其从队列中移除。

相反,Kafka使用哑巴经纪人/智能消费者模型,这意味着它不监控每个消费者读取或确认的消息。相反,它只保留未读消息,在配置中提供的设定时间内保留所有消息。

RabbitMQ 消费者模式的优点和缺点

RabbitMQ 确保消费者节点在数据被驱逐之前确认数据,并且它跟踪每个消费者的状态。

然而,一旦消费者确认了数据,数据就会被驱逐,并且只被具有相同路由键的消费者消费。

Kafka消费者模型的优点和缺点

通过Kafka,即使消费者节点拥有数据,消息也会被保留,Kafka并不关心数据的确认。

反之,一旦达到配置的时间,消息就会丢失。

RabbitMQ与Kafka的拓扑结构

RabbitMQ将所有消息发送到一个交换器,在那里它们被路由到各种队列绑定供消费者使用。

另一方面,Kafka 使用发布/订阅拓扑结构将消息跨流发送到正确的主题。

结论

尽管RabbitMQ和Kafka经常被互换使用,但这两种技术的实现方式不同。Kafka往往是大型分布式系统的最佳选择,而RabbitMQ则最适合于有极低延迟要求的系统。

在工程方面,这两种工具有完全不同的设计,这并不是一个很好的比较对象。

如果你正在考虑与分布式系统合作,Kafka是最适合的,而RabbitMQ则最适合传统的消息代理服务。

The postKafka vs. RabbitMQ: Comparing Node.js messagebrokers appeared first onLogRocket Blog.