您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

关于Kafka,你需要知道的一切

时间:2023-02-10 12:44:03  来源:51CTO  作者:JAVA旭阳
Kafka通过使用“long polling”等待模式的方式解决了这个问题。简而言之,如果分区上没有数据,Kafka 不会返回空响应。相反,broker保持连接并等待数据进入,然后再将其返回给消费者。

前言

Kafka 一开始是LinkedIn这家公司研发的技术,它是一种高吞吐量的分布式发布订阅消息系统,现在已成为大多数公司使用的技术,我们公司也不例外。那么你对kafka的了解有多少呢?那么本文就带你过一过kafka中的一些关键要点。

为什么我们需要Kafka?

 

图片

 

订单发生时通知其他服务

在我们深入研究之前,有必要重新审视一下 Kafka 最初被发明的原因。

想象一下为一家电子商务公司维护一组微服务。

下订单时,订单服务要通知很多服务,如下:

  • 钱包服务从用户账户中扣除金额
  • 仓库服务扣除物品的库存数量
  • 物流服务发货

当订单服务要通知更多的服务时,复杂度就要进一步提高。

订单服务器需要做以下事情:

  • 跟踪都通知了谁
  • 确保所有其他服务确实收到并处理
  • 和其他服务建立直接的连接和处理不同的响应

发现没有,这很难扩展,如果接入更多的系统,订单系统的开发天天996了。

因此,Kafka就很好的解决这样的问题。

消息队列与发布订阅

 

图片

 

订单服务器只是将消息发布到 Pub-Sub/Message Queue

消息队列和发布订阅系统都是解决上述问题的关键。

也就是说,不是让订单服务维护直接和各种系统打交道,而是将事件发布或者推送到中间队列中,对队列感兴趣的服务器(通常称为消费者)订阅队列并相应地消费事件。

那么消息队列和发布订阅系统有什么区别呢?

消息队列

消息队列是一种类似队列的结构,其中消息被发布并且仅被消费一次。这对于非幂等的进程很方便,事件应该只由一个消费者处理,RabbitMQ 最初被设计成一个消息队列。

发布-订阅系统

另一方面,发布订阅系统允许多个消费者多次使用一条消息。订单事件被多个系统订阅消费,所以更适合发布订阅系统模式。Kafka 被设计为既是消息队列又是发布订阅系统。

Kafka组件

为了充分理解 Kafka 的工作原理,让我们剖析 下Kafka 的各个组件。

Kafka Broker 和集群

 

图片

 

Kafka 代理和集群

Kafka 只不过是一个管理数据发布和消费的服务。

一个Kafka Broker就是一个Kafka服务。维护同一组主题的一组Broker称为 Kafka 集群。

发布者Publisher

 

图片

 

发布者发布到 Kafka 代理

将数据发布到 Kafka Broker的服务称为发布者。我们之前提到的Order服务是发布者的一个例子。

消费者Consumer

 

图片

 

消费者从 Kafka 代理消费

另一方面,消费者是订阅和消费来自 Kafka 主题的数据的服务。

在我们前面的示例中,Wallet服务器、Warehouse服务器和Logistic服务器充当Order主题的消费者。

主题Topic

 

图片

 

Kafka 代理中的不同主题

Kafka 代理维护不同类型的事件,例如:

  • 订单创建事件
  • 订单取消事件
  • 缺货事件

这些事件中的每一个都是大量的数据流。主题只是一种事件或数据流。

发布到 Kafka 时,发布者指定消息应发布到的主题。

主题是一个只能追加的日志。将消息附加到主题类似于将数据附加到队列,它需要 O(1) 常数时间,因此速度非常快。

分区Partition

 

图片

 

主题被分片成分区

主题是存储在 Kafka Broker上的追加的日志。

随着消息数量的增加,Broker在特定主题上存储的数据量是有限的,那怎么办呢?

可以将一个主题拆分为多个分区,而不是将所有数据一直追加到同一个主体日志中,而是每个分区存储特定主题的一部分数据,这类似于数据库分片。

主题基于分区进行分片。同一主题的分区可以存储在相同或不同的 Kafka Broker上。这使得 Kafka 具有高度可扩展性。

发布者在发布之前指定消息的主题和分区。因此,发布者有责任确保分区逻辑不会导致热分区。

偏移量offset

 

图片

 

分区中的偏移量

偏移量是分区中消息的唯一索引。

当 Kafka 将数据推送给消费者时,它会增加并跟踪当前的偏移量。

有两种类型的偏移量值得强调:

  • 当前偏移量:保存在Consumer客户端中,它表示Consumer希望收到的下一条消息的序号。
  • 提交的偏移量: 保存在Broker上,它表示Consumer已经确认消费过的消息的序号。

消费者组

如前所述,Kafka 既是消息队列又是发布订阅系统。这是通过消费者群体优雅地设计的。

 

图片

 

Consumer可以消费多个partition,但是每个partition只能被同组的一个consumer消费

消费者组由一组消费相同主题的消费者组成。

一个消费者一次可以消费多个分区。但是,每个分区只能由同一组中的一个且只有一个消费者使用。

 

图片

 

一个分区可以被来自不同消费者组的多个消费者消费

消费者组是相互独立的,不同的组可以同时使用同一主题并使用不同的偏移量。

通过将所有消费者放在同一组中来实现队列,同一分区中的消息不会被来自相似组的不同消费者并发消费。

在分区级别实现队列。因此,如果想要保证顺序处理数据流,发布者必须确保数据始终被推送到同一个分区。

另一方面,发布订阅系统是通过多个消费者组实现的。消费者群体彼此之间一无所知,并使用单独的偏移量消费数据。

在前面的例子中,Wallet服务器和Logistic服务器分别属于不同的消费者组,分别消费数据。

重新平衡和分区分配

 

图片

 

当新消费者加入时,Kafka 会重新平衡

如果一组中只有一个消费者,则该消费者将负责消费所有可用分区。

当一个新的consumer加入group时,比如增加了一个新的server实例,Kafka会进行rebalancing,将一部分partitions分配给新的consumer。

这确保了每个消费者共享相同数量的工作,从而使 Kafka 具有可扩展性。

Kafka 使用自己的重新平衡策略进行分区重新分配,这值得另一篇单独的文章来介绍。

复制Replica

 

图片

 

副本在分区级别创建,可以存储在相同/不同的代理中

单点故障是每个分布式系统的噩梦,Kafka也不例外。

如果Broker出现故障,存储在代理上的分区可能不可用。因此,副本是在分区级别创建的。

为每个分区创建副本,并存储在不同的 Kafka 代理上。为每个分区选举一个领导者来为发布者和消费者服务。

副本不断从leader同步数据。当 leader 宕机时,Zookeeper 会加入进来帮助进行 leader 的选举。

Zookeeper

正如您可能正在思考的那样,我们的难题中缺少一些部分。

  • 我们如何知道每个分区的领导者?
  • 如何知道每个主题的分区数?
  • 我们如何知道每个消费者组的最新偏移量?
  • 我们如何知道每个消费者组中有多少消费者?

这就是Zookeeper发挥作用的地方。它是一个分布式协调服务系统,用于存储元数据并协调 Kafka 中的分布式系统。

主要涉及以下方面:

  • 领导者选举——确保每个分区都有一个领导者
  • 集群成员资格——跟踪集群中的所有功能代理
  • 主题配置——跟踪所有可用主题、分区及其副本
  • 访问控制列表——跟踪每个组中消费者的数量及其访问权限
  • 配额——跟踪每个客户端可以读取和写入的数据量

长轮询

Kafka 如何向消费者推送消息?

RabbitMQ 采用推送模型。代理与消费者保持持久的 TCP 连接,并在有可用数据时将数据推送给他们。

然而,推送模型可能会淹没消费者。如果代理推送数据的速度快于消费者处理数据的速度,消费者可能会落后。RabbitMQ 确实有一个解决方案,这边就不展开讨论了。

长轮询等待方式方法

Kafka 使用拉模型,也就是长轮询。消费者定期从代理拉取数据。因此,消费者只有在准备好时才能拉取数据。但是,如果分区上没有数据,来自消费者的定期轮询可能会导致资源浪费。

Kafka通过使用“long polling”等待模式的方式解决了这个问题。简而言之,如果分区上没有数据,Kafka 不会返回空响应。相反,broker保持连接并等待数据进入,然后再将其返回给消费者。

这减轻了当分区上没有数据时消费者频繁轮询并防止资源浪费。

总结

本文总结了Kafka这个组件的基础知识,希望让大家对Kafka有一个宏观的认识,感兴趣的再深入分析底层的实现机制。



Tags:Kafka   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Spring实现Kafka重试Topic,真的太香了
概述Kafka的强大功能之一是每个分区都有一个Consumer的偏移值。该偏移值是消费者将读取的下一条消息的值。可以自动或手动增加该值。如果我们由于错误而无法处理消息并想重...【详细内容】
2024-01-26  Search: Kafka  点击:(91)  评论:(0)  加入收藏
如何使用Python、Apache Kafka和云平台构建健壮的实时数据管道
译者 | 李睿审校 | 重楼在当今竞争激烈的市场环境中,为了生存和发展,企业必须能够实时收集、处理和响应数据。无论是检测欺诈、个性化用户体验还是监控系统,现在都需要接近即时...【详细内容】
2024-01-26  Search: Kafka  点击:(49)  评论:(0)  加入收藏
深入浅出Kafka:高可用、顺序消费及幂等性
在我们旅行于数据海洋的途中,如果把 Kafka 比作是一艘承载无数信息航行的快船,前文《Kafka实战漫谈:大数据领域的不败王者》已经讲述了如何搭建起这艘快船,让它在起风的早晨开始...【详细内容】
2023-12-18  Search: Kafka  点击:(179)  评论:(0)  加入收藏
7k Star,一款开源的 Kafka 管理平台,功能齐全、页面美观!
Apache Kafka UI 是一个免费的开源 Web UI,用于监控和管理 Apache Kafka 集群,可方便地查看 Kafka Brokers、Topics、消息、Consumer 等情况,支持多集群管理、性能监控、访问控...【详细内容】
2023-12-15  Search: Kafka  点击:(137)  评论:(0)  加入收藏
利用Apache Kafka、Flink和Druid构建实时数据架构
译者 | 陈峻审校 | 重楼如今,对于使用批处理工作流程的数据团队而言,要满足业务的实时要求并非易事。从数据的交付、处理到分析,整个批处理工作流往往需要大量的等待,其中包括:等...【详细内容】
2023-12-11  Search: Kafka  点击:(239)  评论:(0)  加入收藏
运维兄弟!Kafka怎么又"超时"了?
现象凌晨,当运维刚躺下,就被业务研发的电话叫醒,"哥们!kafka服务又异常了?影响到业务了,快看看",业务研发给出的异常日志如下:基本分析 集群检查:立即确认kafka集群以及涉及到topic健...【详细内容】
2023-12-07  Search: Kafka  点击:(142)  评论:(0)  加入收藏
图解Kafka适用场景,全网最全!
消息系统消息系统被用于各种场景,如解耦数据生产者,缓存未处理的消息。Kafka 可作为传统的消息系统的替代者,与传统消息系统相比,kafka有更好的吞吐量、更好的可用性,这有利于处...【详细内容】
2023-11-29  Search: Kafka  点击:(184)  评论:(0)  加入收藏
Kafka有哪些应用场景?你能说上来几个?
下面我们来总结一下Kafka的一些应用场景:1、日志处理与分析(最常用的场景)下图显示了典型的 ELK(Elastic-Logstash-Kibana)堆栈。Kafka 有效地从每个实例收集日志流。ElasticSe...【详细内容】
2023-11-28  Search: Kafka  点击:(166)  评论:(0)  加入收藏
Kafka:解锁大数据时代的搜索与分析
在当今大数据时代,数据湖作为一种新兴的数据存储和分析解决方案,正受到越来越多企业的青睐。而作为一种高性能、可扩展的事件流平台,Kafka在数据湖领域发挥着重要的作用。本文...【详细内容】
2023-11-24  Search: Kafka  点击:(293)  评论:(0)  加入收藏
解密Kafka主题的分区策略:提升实时数据处理的关键
Kafka几乎是当今时代背景下数据管道的首选,无论你是做后端开发、还是大数据开发,对它可能都不陌生。开源软件Kafka的应用越来越广泛。面对Kafka的普及和学习热潮,哪吒想分享一...【详细内容】
2023-11-21  Search: Kafka  点击:(184)  评论:(0)  加入收藏
▌简易百科推荐
对于微服务架构监控应该遵守的原则
随着软件交付方式的变革,微服务架构的兴起使得软件开发变得更加快速和灵活。在这种情况下,监控系统成为了微服务控制系统的核心组成部分。随着软件的复杂性不断增加,了解系统的...【详细内容】
2024-04-03  步步运维步步坑    Tags:架构   点击:(5)  评论:(0)  加入收藏
大模型应用的 10 种架构模式
作者 | 曹洪伟在塑造新领域的过程中,我们往往依赖于一些经过实践验证的策略、方法和模式。这种观念对于软件工程领域的专业人士来说,已经司空见惯,设计模式已成为程序员们的重...【详细内容】
2024-03-27    InfoQ  Tags:架构模式   点击:(16)  评论:(0)  加入收藏
哈啰云原生架构落地实践
一、弹性伸缩技术实践1.全网容器化后一线研发的使用问题全网容器化后一线研发会面临一系列使用问题,包括时机、容量、效率和成本问题,弹性伸缩是云原生容器化后的必然技术选择...【详细内容】
2024-03-27  哈啰技术  微信公众号  Tags:架构   点击:(12)  评论:(0)  加入收藏
DDD 与 CQRS 才是黄金组合
在日常工作中,你是否也遇到过下面几种情况: 使用一个已有接口进行业务开发,上线后出现严重的性能问题,被老板当众质疑:“你为什么不使用缓存接口,这个接口全部走数据库,这怎么能扛...【详细内容】
2024-03-27  dbaplus社群    Tags:DDD   点击:(15)  评论:(0)  加入收藏
高并发架构设计(三大利器:缓存、限流和降级)
软件系统有三个追求:高性能、高并发、高可用,俗称三高。本篇讨论高并发,从高并发是什么到高并发应对的策略、缓存、限流、降级等。引言1.高并发背景互联网行业迅速发展,用户量剧...【详细内容】
2024-03-13    阿里云开发者  Tags:高并发   点击:(8)  评论:(0)  加入收藏
如何判断架构设计的优劣?
架构设计的基本准则是非常重要的,它们指导着我们如何构建可靠、可维护、可测试的系统。下面是这些准则的转换表达方式:简单即美(KISS):KISS原则的核心思想是保持简单。在设计系统...【详细内容】
2024-02-20  二进制跳动  微信公众号  Tags:架构设计   点击:(38)  评论:(0)  加入收藏
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  ijunfu  今日头条  Tags:SpringBoot   点击:(21)  评论:(0)  加入收藏
PHP+Go 开发仿简书,实战高并发高可用微服务架构
来百度APP畅享高清图片//下栽のke:chaoxingit.com/2105/PHP和Go语言结合,可以开发出高效且稳定的仿简书应用。在实现高并发和高可用微服务架构时,我们可以采用一些关键技术。首...【详细内容】
2024-01-14  547蓝色星球    Tags:架构   点击:(120)  评论:(0)  加入收藏
GraalVM与Spring Boot 3.0:加速应用性能的完美融合
在2023年,SpringBoot3.0的发布标志着Spring框架对GraalVM的全面支持,这一支持是对Spring技术栈的重要补充。GraalVM是一个高性能的多语言虚拟机,它提供了Ahead-of-Time(AOT)编...【详细内容】
2024-01-11    王建立  Tags:Spring Boot   点击:(128)  评论:(0)  加入收藏
Spring Boot虚拟线程的性能还不如Webflux?
早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。测试场景作者采用了一个尽可...【详细内容】
2024-01-10  互联网架构小马哥    Tags:Spring Boot   点击:(126)  评论:(0)  加入收藏
站内最新
站内热门
站内头条