0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

架构师应该使用Kafka还是Rabbit MQ

汽车玩家 来源:今日头条 作者:闻数起舞 2020-05-03 18:10 次阅读

介绍

作为处理许多基于微服务的系统的软件架构师,我经常遇到一个不断重复的问题:"我应该使用RabbitMQ还是Kafka?" 由于某些原因,许多开发人员认为这些技术是可互换的。 尽管在某些情况下确实如此,但这些平台之间存在各种潜在的差异。

结果,不同的方案需要不同的解决方案,选择错误的方案可能会严重影响您设计,开发和维护软件解决方案的能力。

本文的目的是首先介绍基本的异步消息传递模式。 然后,它将继续介绍RabbitMQ和Kafka及其内部结构。 第2部分将重点介绍这些平台之间的关键区别,它们的各种优缺点以及如何在两者之间进行选择。

异步消息传递模式

异步消息传递是一种消息传递方案,其中生产者的消息生产与消费者的消息处理不相关。 在处理消息传递系统时,我们通常会确定两种主要的消息传递模式-消息排队和发布/订阅。

消息队列

在消息队列通信模式中,队列在时间上使生产者与消费者脱钩。 多个生产者可以将消息发送到同一队列。 但是,当使用者处理邮件时,该邮件将被锁定或从队列中删除,并且不再可用。 只有一个消费者消费一条特定的消息。

架构师应该使用Kafka还是Rabbit MQ

Message queuing

附带说明一下,如果使用者无法处理某条消息,则消息传递平台通常会将消息返回到队列中,以供其他使用者使用。 除了临时解耦,队列还使我们能够独立地扩展生产者和消费者的规模,并提供一定程度的容错能力以应对处理错误。

发布/订阅

在发布/订阅(或pub / sub)通信模式中,多个订户可以同时接收和处理一条消息。

架构师应该使用Kafka还是Rabbit MQ

Publish/subscribe

例如,此模式允许发布者通知所有订阅者系统中发生了某些事情。 许多排队平台通常将pub / sub与术语主题相关联。 在RabbitMQ中,主题是pub / sub实现的一种特定类型(确切地说是一种交换类型),但是在本篇文章中,我将主题称为pub / sub整体的表示。

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

· 临时订阅,仅在使用者启动并运行时,订阅才处于活动状态。 使用者关闭后,其订阅和尚未处理的消息就会丢失。

· 长期订阅,只要未明确删除订阅,订阅就会一直保留。 当使用者关闭时,消息传递平台将维护订阅,并且稍后可以恢复消息处理。

RabbitMQ

RabbitMQ是消息代理的实现,通常称为服务总线。 它本身支持上述两种消息传递模式。 消息代理的其他流行实现包括ActiveMQ,ZeroMQ,Azure服务总线和Amazon Simple Queue Service(SQS)。 所有这些实现都有很多共同点。 本文中描述的许多概念都适用于大多数概念。

消息队列

RabbitMQ支持开箱即用的经典消息队列。 开发人员定义命名队列,然后发布者可以将消息发送到该命名队列。 消费者进而使用相同的队列来检索消息以对其进行处理。

信息交流

RabbitMQ通过使用消息交换来实现pub / sub。 发布者将其消息发布到消息交换,而不知道这些消息的订阅者是谁。

每个希望订阅交换的消费者都会创建一个队列。 然后,消息交换将产生的消息排队,以供消费者使用。 它还可以基于各种路由规则为某些订户过滤消息。

架构师应该使用Kafka还是Rabbit MQ

RabbitMQ message exchange

请务必注意,RabbitMQ支持临时订阅和持久订阅。 消费者可以通过RabbitMQ的API决定要使用的订阅类型。

由于RabbitMQ的体系结构,我们还可以创建一种混合方法-一些订户形成消费者组,这些消费者组以特定队列中竞争的消费者的形式一起处理消息。 通过这种方式,我们实现了发布/订阅模式,同时还允许某些订阅者扩大规模以处理收到的消息。

架构师应该使用Kafka还是Rabbit MQ

Pub/sub and queuing combined

Apache Kafka

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

与基于队列和交换的RabbitMQ不同,Kafka的存储层是使用分区的事务日志实现的。 Kafka还提供用于实时处理流的Streams API和可轻松与各种数据源集成的Connector API。 但是,这些不在本文的讨论范围之内。

云供应商为Kafka的存储层提供了替代解决方案。 这些解决方案包括Azure事件中心,在某种程度上还包括AWS Kinesis数据流。 Kafka的流处理功能也有特定于云的开源替代方案,但是同样,这些不在本文的讨论范围之内。

话题 Topic

Kafka没有实现队列的概念。 相反,Kafka将记录的集合存储在称为主题的类别中。

对于每个主题,Kafka维护消息的分区日志。 每个分区都是一个有序的,不可变的记录序列,在该记录中连续附加消息。

当这些分区到达时,Kafka会将消息附加到这些分区。 默认情况下,它使用循环分区程序在各个分区之间均匀分布消息。

生产者可以修改此行为以创建消息的逻辑流。 例如,在多租户应用程序中,我们可能想根据每个消息的租户ID创建逻辑消息流。 在物联网场景中,我们可能希望不断将每个生产者的身份映射到特定分区。 确保来自同一逻辑流的所有消息都映射到同一分区,以确保将其传递给消费者。

架构师应该使用Kafka还是Rabbit MQ

Kafka producers

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

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

因此,在创建主题时,应仔细考虑该主题上消息传递的预期吞吐量。 一起工作以消费主题的一组消费者称为消费群体。 Kafka的API通常会处理消费者组中消费者之间的分区处理与消费者当前分区偏移量的存储之间的平衡。

架构师应该使用Kafka还是Rabbit MQ

Kafka consumers

使用Kafka实现消息传递模式

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

生产者可以将消息发送到特定主题,而多个消费者组可以使用同一条消息。 每个消费者组可以单独扩展以处理负载。 由于使用者维护其分区偏移量,因此他们可以选择具有持久性的订阅,该持久性订阅在重新启动或临时订阅期间保持其偏移量,这将丢弃偏移量,并在每次启动时从每个分区中的最新记录重新启动。

但是,它不适用于消息队列模式。 当然,我们可以只包含一个消费者组来模拟一个经典消息队列。 然而,这有多个缺点。本文的第2部分将详细讨论。

请务必注意,Kafka会将邮件保留在分区中,直到预定的时间,无论消费者是否消费了这些邮件。 这种保留意味着消费者可以自由地重读过去的消息。 此外,开发人员还可以使用Kafka的存储层来实现各种机制,例如事件源和审核日志。

进一步阅读

如果您想了解有关RabbitMQ和Kafka的内部实现的更多信息,我建议您使用以下资源:

· AMQP 0.9.1模型解释— RabbitMQ

· Apache Kafka简介

结束语

尽管RabbitMQ和Kafka有时可以互换,但是它们的实现却有很大的不同。 因此,我们无法将它们视为同一类工具的成员; 一个是消息代理,另一个是分布式流平台。

作为解决方案架构师,我们应该承认这些差异,并积极考虑在给定场景下应使用哪种类型的解决方案。 第2部分解决了这些差异,并提供了何时使用它们的指南。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 软件架构
    +关注

    关注

    0

    文章

    64

    浏览量

    10249
  • kafka
    +关注

    关注

    0

    文章

    49

    浏览量

    5186
收藏 人收藏

    评论

    相关推荐

    中级自动驾驶架构师应该学习哪些知识

    随着自动驾驶技术的成熟,对系统架构师的需求逐渐增加。自动驾驶系统架构师负责设计整个系统的结构、组件、接口和数据流;需要协调不同领域的专业知识,确保系统的可靠性、安全性和性能。总之,自动驾驶系统架构师
    的头像 发表于 06-20 21:47 177次阅读

    初级自动驾驶架构师应该学习哪些知识

    随着自动驾驶技术的成熟,对系统架构师的需求逐渐增加。自动驾驶系统架构师负责设计整个系统的结构、组件、接口和数据流;需要协调不同领域的专业知识,确保系统的可靠性、安全性和性能。总之,自动驾驶系统架构师
    的头像 发表于 06-20 21:45 174次阅读

    面试官:Kafka会丢消息吗?

    许多开发人员普遍认为,Kafka 的设计本身就能保证不会丢失消息。然而,Kafka 架构和配置的细微差别会导致消息的丢失。我们需要了解它如何以及何时可能丢失消息,并防止此类情况的发生。
    的头像 发表于 04-29 17:32 792次阅读
    面试官:<b class='flag-5'>Kafka</b>会丢消息吗?

    Redis流与Kafka相比如何?

    我们先来看看Kafka的基本架构。基本的数据结构是主题。它是一个按时间排序的记录序列,只需追加。使用这种数据结构的好处在Jay Kreps的经典博文The Log中得到了很好的描述。
    的头像 发表于 02-21 16:09 327次阅读
    Redis流与<b class='flag-5'>Kafka</b>相比如何?

    kafka基本原理详解

    今天浩道跟大家分享一篇关于kafka相关原理的硬核干货,可以说即使你没有接触过kafka,也可以秒懂,一起看看!
    的头像 发表于 01-03 09:57 776次阅读
    <b class='flag-5'>kafka</b>基本原理详解

    kafka支持哪些消息交付语义?

    在读完kafka官方文档,kafka设计里的消息交付语义一章后,给我的第一印象是内容很抽象,于是草拟和总结了给个副标题,并把相关内容进行了归类;有些生涩的句子,尽量用大白话和举例进行说明,并加入了总结。
    的头像 发表于 12-22 11:27 392次阅读
    <b class='flag-5'>kafka</b>支持哪些消息交付语义?

    如何保证kafka消息不丢失

    如果在简历上写了使用过kafka消息中间件,面试官大概80%的概率会问你:"如何保证kafka消息不丢失?"反正我是屡试不爽。
    的头像 发表于 12-19 09:52 600次阅读
    如何保证<b class='flag-5'>kafka</b>消息不丢失

    zookeeper和kafka的关系

    Zookeeper和Kafka是两个不同的开源软件,它们可以在分布式系统中发挥不同的作用。下面我将详细说明它们之间的关系以及它们在分布式系统中的作用。 首先,让我们先介绍一下Zookeeper
    的头像 发表于 12-03 16:39 1343次阅读

    golang中使用kafka的综合指南

    kafka是一个比较流行的分布式、可拓展、高性能、可靠的流处理平台。在处理kafka的数据时,这里有确保处理效率和可靠性的多种最佳实践。本文将介绍这几种实践方式,并通过sarama实现他们。
    的头像 发表于 11-30 11:18 448次阅读

    优秀的架构师是怎样绘制系统架构蓝图的?

    模型是对客观存在的抽象,例如著名的物理学公式 E=mc2,就是质量能量转换的物理规律的数学模型。除了物理学公式以外,还有一些东西也是模型,比如地图是对地理空间的建模;机械装置、电子电路、建筑设计的各种图纸是对物理实体的建模。而软件,也可以通过各种图进行建模。
    的头像 发表于 11-20 16:13 349次阅读
    优秀的<b class='flag-5'>架构师</b>是怎样绘制系统<b class='flag-5'>架构</b>蓝图的?

    如何将Kafka使用到我们的后端设计中

    本文介绍了以下内容: 1.什么是Kafka? 2.为什么我们需要使用Kafka这样的消息系统及使用它的好处 3.如何将Kafka使用到我们的后端设计中。 译自timber.io
    的头像 发表于 10-30 14:30 410次阅读
    如何将<b class='flag-5'>Kafka</b>使用到我们的后端设计中

    kafka相关命令详解

    kafka常用命令详解
    的头像 发表于 10-20 11:34 706次阅读

    Kafka架构技术:Kafka架构和客户端API设计

    Kafka 给自己的定位是事件流平台(event stream platform)。因此在消息队列中经常使用的 "消息"一词,在 Kafka 中被称为 "事件"。
    的头像 发表于 10-10 15:41 715次阅读
    <b class='flag-5'>Kafka</b><b class='flag-5'>架构</b>技术:<b class='flag-5'>Kafka</b>的<b class='flag-5'>架构</b>和客户端API设计

    Spring Kafka的各种用法

    最近业务上用到了Spring Kafka,所以系统性的探索了下Spring Kafka的各种用法,发现了很多实用的特性,下面介绍下Spring Kafka的消息重试机制。 0. 前言 原生
    的头像 发表于 09-25 17:04 798次阅读

    kafka client在 spring如何实现

    消息中间件,比如 Kafka、RabbitMq,只需要简单的引入 jar,就可以通过注解+配置快速集成到项目中。 开始一个 Pulsar Starter 既然已经了解了 Apache Pulsar ,又
    的头像 发表于 09-25 11:21 383次阅读
    <b class='flag-5'>kafka</b> client在 spring如何实现