关于Kafka区分请求处理优先级的讨论

在高负载场景下,Kafka通过优先处理控制器请求(如LeaderAndIsr、StopReplica和UpdateMetadata)来提高集群状态更新速度和整体可用性。KIP-291引入了专用监听器、请求队列和处理器线程,确保控制类请求不受数据类请求影响,减少处理延迟。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

所有的讨论都是基于KIP-291展开的。抱歉,这又是一篇没有图的文字。


目前Kafka broker对所有发过来的请求都是一视同仁的,不会区别对待。不管是用于生产消费的PRODUCE和FETCH请求,还是controller端发送的LeaderAndIsr/StopReplica/UpdateMetadata请求,亦或是其他类型的请求也是一样。通常我们这里把PRODUCE/FETCH请求称为数据类请求;把controller发送的那3种请求称为控制类请求或controller类请求——在源码中前者被称为data plane request,后者称为controller plane request。

这种公平处理原则在很多场合下都是不合理的。为什么?简单来说控制类请求具有直接令数据类请求失效的能力。举个例子,如果我有个topic,单分区双副本,其中broker0上保存leader副本,broker1上保存follower副本。当broker0上积压了大量的PRODUCE请求时,此时用户执行了重分区或preferred分区选举将broker1变更成了leader,那么controller会向broker0发送LeaderAndIsr请求告诉它现在是一个follower了,而broker1上的follower已经停止向leader拉取数据(因为它要成为leader了)——此时一个比较尴尬的情形出现了:如果producer的acks设置的是all,那么这些在LeaderAndIsr请求之前积压的PRODUCE请求就无法正常完成——要么一直缓存在purtagory中要么请求超时返回给client。设想一下,如果Kafka能够及时地处理LeaderAndIsr请求,那么这些积压的PRODUCE请求就能立即失败(NOT_LEADER_FOR_PARTITION),马上返回给client。Client不用等到 purgatory中的请求超时,降低了请求的处理时间。即使acks不是all,纵然积压的PRODUCE请求写入本地日志后成功返回,但处理过LeaderAndIsr请求后broker0上副本变为follower,还要执行截断(truncation),因此在client看来这些消息就丢失了。

再举一个例子,同样是在积压大量数据类请求的broker上,如果用户删除了topic,那么StopReplica请求无法及时处理,导致topic无法真正删除,增加了删除topic的延时。

最后还可以举个例子说明对UpdateMetadata的影响。如果UpdateMetadata不能及时处理,broker上保存的就是过期的元数据,当client获取到这些数据时,不管是producer还是consumer都可能无法正常工作,直到获取到最新的元数据信息。

通过上面3个例子可以看出通常情况下我们希望controller类请求的处理优先级要高于数据类请求,这也是社区做KIP-291的初衷 。可喜的是Kafka 2.2正式实现了这个功能,下面我们来看看社区是怎么做的:

其实在KIP-291之前,我也思考过这个问题。当时我提出的想法是这样的:在broker的KafkaRequestHandlerPool中实现一个优先级队列,当controller类请求到达时,它能够”抢占式“地排在处理队列的最前部——这是很自然的想法,所以我本以为KIP-291也是这么实现的,但通篇看下来我尴尬地发现我这个解决思路记录在“Rejected Alternatives"中。这个方案最大的问题在于它无法处理队列已满的情形,即当处理队列已经无法容纳任何新的请求时该如何支持优先处理controller类请求?纵然有优先级队列也无法解决这个问题。

KIP-291是怎么解决的呢?很简单,Kafka重新为controller类请求做了专属的监听器+请求队列+acceptor+processor线程。监听器通过Kafka的listeners和advertised.listeners设置,新的请求队列则专门保存controller类请求,而acceptor和processor线程负责接收网络发送过来的以及处理队列中的controller类请求。我们一个一个说吧。

当前,用户可以在listeners中指定多套监听器,比如PLAINTEXT://kafka1:9092, SSL://kafka1:9093。你其实也可以自定义你的监听器,比如INTERNAL://kafka1:9094。用户可以指定broker端参数inter.broker.listener.name或security.inter.broker.protocol(两个不能同时指定)来设定,同时你还需要在listener.security.protocol.map中指定这个自定义listener使用的安全协议,比如: listener.security.protocol.map=INTERNAL:PLAINTEXT。KIP-291复用了这个设计,如果你设置了inter.broker.listener.name或security.inter.broker.protocol,Kafka会默认使用这个listener专属服务controller类请求。同时社区还引入了一个新的参数:control.plane.listener.name,用来专门让你设置服务controller类请求的监听器名称。这个参数的优先级要高于前面那两个参数,因此还是推荐用户直接设置此参数,比如设置control.plane.listener.name=CONTROLLER,同时更新listener.security.protocol.map,增加CONTROLLER:PLAINTEXT匹配对(假设你用的是PLAINTEXT)。这就是为controller类请求创建监听器的方法。

下面说请求队列和acceptor、processor线程。 其实也不用细说,和现有的设计一模一样,只是默认的队列大小不再是500,而是20,默认的线程数不再是8而是2,因为我们假设controller类请求通常不应该有积压。具体的实现原理有兴趣的话直接读KafkaRequestHandlerPool.scala、RequestChannel.scala和SocketServer.scala源码吧。还需要修改的地方是controller代码,特别是在ControllerChannelManager.scala中增加新的broker时一定要使用controller类请求专属的监听器。

除了以上这些,该KIP也引入了很多监控controller类请求处理的JMX指标,如队列请求数、线程空闲程度等,这些和之前的指标都是一样的,只是仅监控controller plane监听器之用。再说一点,当前Kafka支持动态地调整请求处理线程数。在对请求进行区分处理后,我估计后续也要支持对controller类请求线程数的动态调整吧。

总体来说,将请求做区分处理后对于繁忙Kafka集群将能够更迅速地处理控制类请求,表现为状态的更新更加及时,集群不一致状态窗口将会缩小,同时还提升了整体可用性。目前该KIP还只是对请求做两类处理,也许日后会做一些更加细粒度的区分——比如Metadata请求是否也应该享有更高的优先级处理。

最后还想提一句,KIP-291是我认为近期社区改动影响比较大的两个KIP之一。另一个则是KIP-392——还记得Kafka不能从follower副本读数据的限制吧?这个KIP要打破这个限制!只是目前该KIP还在讨论中,我们后面拭目以待吧。

转载于:https://www.cnblogs.com/huxi2b/p/10536776.html

第1题 判断题 在进行数据连接时,可能会因为产品未内置对应版本的数据库驱动而连接失败,这时候应该参考帮助文档的数据连接,替换对应驱动(2分) 正确 错误 第2题 判断题 在定时任务的「开发模式」中可设置调度计划。(2分) 正确 错误 第3题 判断题 在对接API接口时,关于Body中的动态参数引用,数值分隔类型和文本分隔类型的引用一样(2分) 正确 错误 第4题 判断题 若已经对「开发模式」的内容进行了修改,因为任务实现方法希望退回到「生产模式」的版本,可以使用「还原」功能即可(2分) 正确 错误 第5题 判断题 对于运行中的任务,不需要暂停/终止即可编辑或者删除。(2分) 正确 错误 第6题 判断题 对于API运维方和调用方,可在调用记录中对根据访问者IP和调用错误类型进行筛选。(2分) 正确 错误 第7题 判断题 在执行数据管道任务时,若任务失败,FDL支持断点续传:此时若全量同步未完成,会从头全量同步;若全量同步已完成,会从断点开始。(2分) 正确 错误 第8题 判断题 若需要使用数据管道的用户不是超级管理员(首次登录 FineDataLink 时设置的管理员为超级管理员),则需要为对应用户分配数据管道功能的使用权限。(2分) 正确 错误 第9题 判断题 数据服务提供数据共享能力,可以将加工、融合后的数据封装发布为规范化API接口数据,供外部系统调用,实现数据价值输出及共享开放。(2分) 正确 错误 Part.2:单选题 第10题 单选题 通过Demo平台的数据服务发布API,对fdl_demotest数据连接中的`demo1`.`11DW_NC_GATHERBILL21`表进行发布,设置月份month参数。(8分) 当月份分别7和12的时候,返回的totalnum分别是多少? Demo环境地址:https://demo.finedatalink.com/ 预览 A:964,688 B:688,964 C:684,794 D:794,684 第11题 单选题 某公司需要将存储在API接口http://122.9.82.255:5051/get_data中的合同信息数据取出并同步至指定的数据库,由于接口中数据量比较大,不可能一次性取全量数据,因此需要使用参数,多次取数。(8分) 请问2017年3月7日到2017年3月20日,所有合同的总金额为多少? 请求类型:POST 请求示例:{"dateFrom":"20170301","dateTo":"20170307"} 预览 A:79,090,710 B:68,880,810 C:87,168,410 D:78,080,524 第12题 单选题 【实操题】在Demo平台中,分别存在一张明细表和维度表,通过FDL进行数据处理,请问“FusionFrost”品牌名称下的毛利占比是多少?(毛利占比=毛利/销售额)(8分) 维度表(品牌维度信息):FTP/SFTP的“demo_文件”数据源下/data/demo_files/NEW_PP.xIsx 明细表(商品在各个门店的销售情况):MySQL的fdl_demotest数据连接:demo1模式下的FCA_NEW_SALESDETAIL表 通过数据关联、汇总,请问“FusionFrost”品牌名称下的毛利占比是多少?(毛利占比=毛利/销售额) 预览 预览 A:0.11 B:0.09 C:0.13 D:0.12 第13题 单选题 【实操题】从以下API(POST方式)中获取数据并处理,请问“花奶酪”总入库数是多少?(8分) Demo环境地址:https://demo.finedatalink.com/ 接口地址:https://demo.finedatalink.com/service/publish/776c20a7-3cbe-48d4-afa1-c89a727c4535/s_product API帮助文档参考:https://help.fanruan.com/finedatalink/doc-view-90.html A:200 B:218 C:319 D:242 第14题 单选题 关于发布API,正确的流程应该是( )。(2分) A:填写API 信息-发布内容及参数-预览测试 B:发布内容及参数-填写API 信息-预览测试 C:发布内容及参数-预览测试-填写API 信息-绑定API至应用-上线 D:预览测试-发布内容及参数-填写API 信息 第15题 单选题 ( )提供数据共享能力,可以将集成、加工后的数据封装发布为规范化API接口,供外部系统调用。(2分) A:数据开发 B:数据服务 C:任务运维 D:数据管道 第16题 单选题 在使用管道任务进行数据实时同步过程中,来源端结构可能因业务调整等原因发
03-13
<think>好的,我现在需要处理用户关于FineDataLink的问题,涉及数据连接、API对接、任务调度、数据处理、实时同步和数据管道这几个方面。首先,我应该回顾用户提供的三个引用内容,确保回答准确并正确引用。 用户的问题结构比较清晰,但可能需要分点详细回答每个功能模块。我需要确保每个部分都涵盖关键点,并结合引用内容中的信息。例如,数据连接部分引用[1]提到数据库对接和行列转换,可以强调支持多种数据源和转换能力。API对接部分引用[3]提到的RESTful、SOAP等协议,需要说明FineDataLink如何利用这些标准化接口简化对接过程。 任务调度方面,引用[1]和[2]都提到了任务调度和运维监控,这里可以强调其调度策略和监控功能。数据处理部分需要区分ELT/ETL,引用[2]提到ELT/ETL处理,可以展开说明。实时同步和数据管道部分,引用[1]和[2]都提到了实时数据同步,需要详细说明低延迟和高吞吐量的特点,以及数据管道的构建和管理。 此外,用户要求生成相关问题,我需要根据每个模块的功能提出相关问题,确保问题覆盖用户可能感兴趣的扩展方向。比如,数据连接的安全性、API对接的认证机制、任务调度的容错处理等。 最后,检查是否所有引用都正确标注,格式是否符合要求,特别是数学表达式部分,但当前内容可能不涉及数学公式,所以需要确认是否有遗漏。同时保持回答结构清晰,使用中文,并避免使用Markdown格式,用自然的分段和项目符号。</think>### FineDataLink 功能解析 #### 1. 数据连接 FineDataLink 支持与多种数据库(如 MySQL、Oracle、SQL Server 等)及文件系统(Excel、CSV)的无缝对接,提供可视化配置界面简化连接过程。通过行列转换、参数化查询等功能,可灵活处理异构数据源的差异[^1]。例如,用户可直接配置数据源地址、认证信息后,通过拖拽方式完成表字段映射。 #### 2. API对接 支持 RESTful API、SOAP 等协议,提供 JSON/XML 数据格式解析能力。用户可通过界面配置请求头、鉴权方式(如 OAuth2.0)、参数传递规则,并实现 API 响应数据与数据库表字段的自动匹配[^3]。例如,从第三方系统获取 JSON 格式销售数据后,直接写入本地数据仓库。 #### 3. 任务调度 提供分钟级任务调度策略,支持依赖触发、失败重试、告警通知等机制。通过可视化甘特图展示任务依赖关系,并允许设置优先级、资源配额等参数[^2]。例如,可配置「每日 2:00 启动数据清洗任务,成功后触发报表生成任务」。 #### 4. 数据处理 同时支持 ELT(Extract-Load-Transform)和 ETL 模式,内置 50+ 数据处理算子,包括: - 数据清洗(去重、空值填充) - 聚合计算(SUM/AVG 分组统计) - 多表关联(JOIN/UNION) - 自定义脚本(Python/Java) #### 5. 实时同步 采用 CDC(Change Data Capture)技术实现秒级数据同步,通过日志解析减少源库压力。支持断点续传、数据一致性校验,最高吞吐量可达 10万条/秒。例如,MySQL 的 binlog 变更可实时同步到 Kafka 消息队列。 #### 6. 数据管道 提供可视化管道编排界面,支持多级处理节点串联。典型场景: ``` [API数据接入] -> [JSON解析] -> [字段脱敏] -> [写入ClickHouse] [MySQL增量同步] -> [实时聚合计算] -> [推送至BI系统] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值