Advertisement

选择rabbitMQ 还是kafka

阅读量:

前言

作为一名处理基于微服务系统的软件架构师,在工作中我会经常遇到一个问题:对于选择RabbitMQ还是Kafka这个问题。然而,在我的经验中,并非所有人都能够认同这两种技术完全互换的观点。事实上,在某些特定场景下它们的表现可能会有所不同。

由此可知,在实际应用中面对不同的问题应当采取多样化的策略进行应对。若选择不当的方案可能会严重制约您的设计、开发及维护工作能力。对于构建和维护软件系统及其相关开发维护能力而言这一原则尤为重要。

本文旨在首先阐述基础异步消息传递机制。接着,它将深入探讨RabbitMQ和Kafka的具体架构及内部细节。第二部分着重分析这些平台间的本质差异、各自优劣,并探讨如何实现两者间的最佳搭配。

异步消息传递模式

异步消息传递是一种常见的消息传递方案,在这种方案中,生产者的消息生产对消费者的消息处理无影响. 在分析和设计消息传递系统时,一般会采用以下两种主要模式: 消息排队机制以及发布与订阅机制.

消息队列

在消息队列通信模式中,时空使生产者与消费者脱钩.允许多个生产者向同一个队列发送消息,并非所有生产者的消息都能到达消费者处.当用户试图访问邮件时,“邮件会被释放并从队列中删除”,导致不可用状态;仅有一个消费者能够消费这条特定的消息.

在这里插入图片描述

补充说明:当用户无法处理一条消息时,请注意消息传递平台会将未处理的消息重新放回队列以便其他用户使用。此外,在实现上,我们不仅支持临时解耦这一技术手段,在架构设计上还提供了独立扩展生产者和服务消费者数量的能力,并且这种设计结构还能够提供了一定程度的容错机制来应对处理过程中的各种异常情况。

发布/订阅

采用发布/订阅(pub/sub)通信模式时,在同一时间点内有多个用户能够接收并处理一条消息。

在这里插入图片描述

例如,在这种模式下,发布者能够通知所有订阅者系统中存在的事件。 在多数排队平台上,pub/sub 通常被关联到 术语主题。 在 RabbitMQ 中的主题属于 pub/sub 实现的一种特定类型(确切地说是一种交换类型)。 然而,在本文中我会称 pub/sub 作为一个整体来表示。

一般而言,订阅有两种类型:

临时授权仅在使用者开启并持续运行时才会处于活跃状态。 当用户关闭系统后, 其授权将被终止并删除未处理的信息。

持续订阅的情况下,在用户未被取消的情况下,则订阅会持续存在。 当用户关闭服务时,在消息传递平台处将维持该用户的订阅信息,并在后续阶段恢复其消息处理功能。

RabbitMQ

RabbitMQ被视为消息代理的一种实现,并常被称作服务总线。 它本身支持上述两种不同的消息传递模式。 除了RabbitMQ之外,其他流行的实现包括ActiveMQ、ZeroMQ以及微软 Azure 服务总线和亚马逊Simple Queue Service(SQS)。 这些不同方案之间存在许多相似之处。 本文所述的概念在很大程度上与相关领域中的核心概念相吻合。

消息队列

RabbitMQ内置了便捷的消息队列功能。 开发人员可以为应用程序创建命名队列,并通过发布者将消息发布到该队列。 消费者随后可以通过相同的队列名称来订阅并检索消息进行处理。

信息交流

RabbitMQ基于消息传递机制实现了pub/sub模式的功能实现。 发布方将信息发送至公共队列中以供接收方处理,并未预先指定接收方信息

所有订阅交换的消费者都会创建一个队列。随后由消息交换产生的消息会被用来供消费者排队使用。此外该系统还可以根据不同的路由规则来过滤特定订户的消息。

所有订阅交换的消费者都会创建一个队列。随后由消息交换产生的消息会被用来供消费者排队使用。此外该系统还可以根据不同的路由规则来过滤特定订户的消息。

在这里插入图片描述

请特别注意 RabbitMQ 提供暂存订阅和持久存储订阅服务。
通过 RabbitMQ 的 API 选择适合的存储策略。

基于RabbitMQ独特的架构设计, 我们还可以设计一种混合机制, 将部分用户组织成消费者群体. 这些消费者群体在指定队列中以竞争的方式共同接收消息. 通过这一机制, 我们从而实现了典型的发布/订阅模式, 同时允许部分订阅者通过扩展能力来处理接收到的消息.

在这里插入图片描述

Apache Kafka

Apache Kafka不是消息代理的实现。 而是一个分布式流媒体平台。

与传统的基于队列和消息交换机制实现的不同,在于Kafka采用了分区事务日志机制进行分布式记录

云供应商基于Kafka存储层设计了替代方案。
这些解决方案中包含Azure事件中心,并且扩展至部分使用AWS Kinesis数据流。
然而,在本文讨论范围内不涉及此类替代方案。

话题 Topic

队列概念并未在Kafka中实现;而Kafka则通过将记录按主题分类来组织数据。

Kafka负责记录每个主题下的消息分区日志;每个分区均为顺序分明且固定不变的记录序列,并且能够持续添加新消息。

当Kafka处理完所有已知分区并开始处理未知分区时,默认情况下,默认情况下Kafka系统会向其分配消息,并利用循环分区程序在各个已知和未知的Kafka分区之间均匀分布这些消息

生产者可对此行为进行调整以建立消息流程。如在多元化的应用环境中,我们或许希望基于每个条目对应的租户标识符构建专门的消息流动路径.在物联网应用环境中,则倾向于将每个生产者的身份与特定区域关联起来.通过将所有属于同一流程的消息分配至同一个区域,则可确保它们被发送给接收者.

在这里插入图片描述

使用者通过维持这些分区的偏移量(或索引)并顺序读取它们来消费消息。

单个使用者可以使用多个主题,并且使用者可以扩展到可用分区的数量。

为此,在构建主题时,请认真评估该主题上消息流量的最大吞吐能力。共同参与消费主题的一群消费者即构成消费群体。Kafka API 通常负责协调管理各消费者组内分区处理与当前偏移量的关系协调。

在这里插入图片描述

使用Kafka实现消息传递模式

Kafka的实现非常适合pub / sub模式。

生产者能够通过指定主题发布消息,并在同一消息上供多组消费者调用。 每个消费者组均可通过独立的方式进行扩展以应对负载需求。 当用户管理其分区偏移时,则可以选择采用带有持久性的订阅机制——一旦采用该机制后,在系统重启或临时访问期间会持续保留相关偏移信息;但若未采取此措施,则会导致丢失当前偏移值,并于每次重启时从各分区中获取最新的数据重新开始处理。

尽管它不适用于消息队列模式。
我们可以通过仅包含一个消费者组来模拟一种经典消息队列。
这种做法存在多个缺点。
在第2部分中将深入探讨这些问题。

请必须注意,在Kafka系统中,默认情况下会将未被消费的邮件保留在对应的分区中直至预定时间点;这一设置特点使得消息接收者能够任意查阅过去的通讯记录。此外,在系统架构设计方面,开发人员可借助Kafka的存储层来构建多种功能模块;例如事件源记录和审核日志存档等关键组件。

进一步阅读

如需了解关于RabbitMQ和Kafka的工作原理的相关信息,请参考以下资源。

· AMQP 0.9.1模型解释— RabbitMQ

· Apache Kafka简介

写在最后

虽然RabbitMQ和Kafka在某些方面可以相互替代,但它们的具体实现存在显著差异.因此,在分类上它们不能被视为同一类工具的成员,其中一个是基于消息代理技术,另一个则是基于分布式流处理平台.

我们作为解决方案架构师必须正视这些问题的存在,并认真评估在特定情境下采用何种方案最为合适。
第2部分则深入分析了这些问题,并系统地阐述了不同方案适用的具体场景。

这篇文章深入探讨了 RabbitMQ 与 Kafka 在消息队列方面的异同点。
RabbitMQ 被视为高性能的消息队列协议。
它最初由 Eclipse 团队开发。
而 Kafka 则是一个基于非阻塞消息设计的消息系统。
然而,在高负载情况下这两个协议的表现存在差异。
性能方面,Kafka 显示出更快的吞吐量,尤其是在处理大量并发请求时。
可靠性方面,RabbitMQ 的持久化机制使其在数据丢失时表现更为稳定。
然而,Kafka 的主题模型设计允许其在某些场景下提供更高的可用性。
不过,这种优势是以更复杂的配置和较高的资源消耗为代价的。
此外,RabbitMQ 的生产者模式允许单个生产者向多个消费者提供数据流的支持。
相比之下,Kafka 的消费者模式则更加注重一致性和持久性.
最后,两者的可扩展性也各有特点,RabbitMQ 更适合分布式架构,
而 Kafka 则更适合微服务架构.
综上所述,RabbitMQ 和 Kafka 各有其独特的优势,
具体选择哪种解决方案取决于应用的具体需求和约束条件.

全部评论 (0)

还没有任何评论哟~