干货 | 携程基于Kafka的数据校验代理在FinOps领域的应用

经济化计费体系 FinOps? FinOps 是“Finance”和“DevOps”的综合体,强调运维过程中的成本管理和资源优化。它是一种不断发展的云财务管理学科和文化实践,通过帮助工程、财务、技术和业务团队在数据驱动的支出决策上进行协作,使组织能够获得最大的业务价值。FinOps 也被称为“云成本管理”“云财务工程”“云优化”或“云财务优化”等。FinOps 有一个权威组织——FinOps 基金会,该基金会是 Linux 基金会发起的项目,致力于通过最佳实践、教育和标准来推动实践云财务管理学科。 阅读详情

作者简介

懿涵,携程HybridCloud团队云原生研发工程师,关注云原生、IaC领域。

为了有效管理云成本,基于携程混合多云和自建PaaS为主的现状,混合云团队研发了FinOps计费系统。本文将介绍计费系统基于Kafka构建的接入体系在数据质量与治理方面的挑战,并分享基于自研Kafka Gatekeeper构建度量及治理自助化自动化的实践。

  • 一、现状与问题

  • 1.1 现状

  • 1.2 问题描述

  • 1.3 解决方案

  • 二、设计与核心实现

  • 2.1 Kafka的相关背景知识

  • 2.2 Kafka Gatekeeper的设计和实现

  • 三、总结

一、现状与问题

1.1 现状

978197bb5b4231f06f35772c2bdb7b71.jpeg

图1-1

如图1-1所示,携程目前使用了混合多云的模式,同时也以自建PaaS服务为主,因此计费系统除了需要从云商获取账单等信息,还需要接入几十种自建PaaS服务的用量信息。其主要结构如下:

1)TripCostAllocationProtocol: 为了计费接入的扩展性,计费系统设计了计费协议,兼容混合多云模式,支持自建及原生PaaS/SaaS服务。

2)计费数据接入:云原生服务统一由计费系统处理,自建服务由各团队按TripCostAllocationProtocol定期打点的方式,将用量信息投递到Kafka中。

3)计费处理:计费系统根据接入的账单、用量以及服务间的关系,进行递归结算,并将结果落到内部数仓。

1.2 问题描述

计费系统上线后,成功为管理层、运营以及研发等角色提供了计费及成本分析的能力。在数据质量上,系统在数仓结果表上创建了对应的检测规则,针对明显违反业务逻辑的数据可以触发告警。但是,随着系统的推广,数据质量的问题仍然居高不下,具体表现如下:

问题发现:

a. 覆盖率低:针对数据错误程度在一定范围内,但仍然符合业务逻辑的问题,无法被检测到。

b. 及时性差:由于检测基于结果表,告警只能针对计费结果,告警结果有滞后性。

问题定位:

a. 效率低:检测是运行在计费系统内部的结果表上,需要多个数据接入方团队及计费系统开发人员共同排查,确定问题发生的源头及原因。

问题治理:

a. 责任不明:由于质量检测基于结果表,但造成问题的源头多样。无法通过对结果的检测直接将问题归属到对应团队,问题无法获得及时的关注与处理。

数据质量是计费系统的生命线,原有系统在质量上的问题导致计费系统开发团队大量的时间被消耗在对质量问题的响应、排查与修复,无法集中精力投入在产品迭代上,也无法应对更多服务的接入。

1.3 解决方案

针对以上问题,我们决定重新构建数据质量治理的能力。目标如下:

问题发现

a. 全问题覆盖:从数据源头出发,所有不符合校验规则的初始数据都可以被发现。

b. 及时性提高:数据异常在进入计费链路之前就可以被发现,而非通过计费结果告警。

问题定位:

a. 提高效率:无需多方团队协调排查,自动捕获问题源头及问题发生的原因。

问题治理:

a. 责任明确:问题产生的当下就告知相关责任人,明确问题治理的对应团队。

通过分析数据质量的案例,发现绝大部分数据质量的问题来自于几十个自建服务数据接入方。根据以上目标的梳理的问题的分析,我们决定引入Kafka Gatekeeper组件,重点解决自建服务接入的质量问题,如图1-2所示。该组件提供以下能力:

1)校验前置:打点数据在进入计费逻辑前,先进行规则校验,保证问题发现及时性。

2)规则可配置:校验规则可随时配置、随时更新,保证规则检测的全覆盖。

3)自助排查:提供自助查询看板,包括数据错误条数,问题发生原因等信息,研发可自助查询对应团队的相关信息,提高问题定位效率。

4)自动告警:检测发现不合规数据(如字段缺失、数据类型错误等)时,向数据来源的团队发送告警,明确问题治理责任。

87605631122a00b6a1003f2ea4770bfe.jpeg

图1-2

二、设计与核心实现

2.1 Kafka的相关背景知识

为了实现Kafka代理服务的数据校验功能,需要解决以下两个问题:

1)如何根据Kafka协议对消息进行解码。

2)如何处理Kafka客户端,服务端和代理之间的连接关系。

2.1.1 通讯协议

8725300886f5a28b538dba63e3e3cff9.jpeg

图2-1

如图2-1所示,Kafka请求只能由Client主动发到Broker,Broker针对每个请求回复响应给Client。

Kafka使用基于TCP的自定义二进制协议。它定义了客户端和服务器之间的消息格式、消息传递方式和处理逻辑。所有消息都是通过长度来分隔,并且由基本类型组成。请求由请求类型(ApiKey),版本号(ApiVersion),相关性标识(CorrelationId),客户端标识(ClientId)和请求消息(RequestMessage)组成。响应由相关性标识(CorrelationId)和响应消息组成(ResponseMessage)组成。

ApiKey用于确认Request的类型,以通过不同类型的数据格式解析请求。Request和Response通过CorrleationId来一一对应。

由于发送生产消息,仅包含两种API--元数据(Metadata)和生产(Produce),本文仅关注这两种API的请求和响应,协议格式见图2-2。

d3f45657b2d1370900771d2445ae2686.jpeg

图2-2

Metadata是用于获取元数据的API。元数据请求在携带topic_name时会返回topic相关的数据,如果为空则返回所有主题。元数据响应返回的数据包括一串broker的数据信息,以及topic名、分区信息等。图中省略部分内容,仅展示和本文相关的部分。

Produce是用于将消息集发送到服务器的API。生产请求将携带目标topic,以及分区信息,其中分区信息中包含所要发送的具体消息记录集合。生产响应返回的数据包括具体的请求结果。图中省略部分内容,仅展示和本文相关的部分。

通过了解以上两种API的格式,可以基于协议格式进行解码。

2.1.2 交互流程

处理连接关系,还需要了解Metadata、Produce协议的交互流程。

元数据请求可以发往任意broker。Kafka集群会提供Bootstrap地址,由此地址负载均衡到某一服务器并返回。客户端提供一组topic,服务端返回元数据响应,包含所有的broker信息和相关的topic信息。broker信息中包括节点的IP地址,即客户端真正发送生产信息的服务器地址。

生产请求将会发送到元数据请求中返回的某一服务器上,服务器端将会返回请求结果。

bd3722e31d305a20a1b3565993f5f61c.jpeg

图2-3

如图2-3所示,将集群简化为一个Broker,Produce的具体流程:

1)Client向Bootstrap地址发送元数据请求,查询集群当前Broker列表。

2)Bootstrap真实响应的Server其实是(某一个)Broker,Broker返回了所有的信息包含在元数据响应中。

3)Client向真实的Broker地址发送生产请求。

4)Broker处理请求,并回复响应。

通过了解Kafka生产的基本流程,可以实现代理,接管并处理其中的连接关系。

2.2 Kafka Gatekeeper的设计和实现

Gatekeeper作为Kafka客户端和服务端之间的代理,接受客户端的请求对于指定内容做数据校验,并转发给服务器,同时将服务器的响应返回给客户端。

对于客户端来说,仅需要将原本配置的Boostrap地址改成Gatekeeper的地址。

对于Gatekeeper来说,需要做到:

1)设计解码器和解码方案:解码Kafka消息,从而进一步进行处理。

2)设计校验器和校验规则:进行数据校验,提高数据质量。

3)维护Boostrap地址和Gatekeeper地址之间的映射关系:处理客户、Gatekeeper、服务间的连接。

Gatekeeper设计架构如图2-4所示。

0c54c6ee32e849b0b892b43d7e85ea4c.jpeg

图2-4

解码器用于在处理请求时,根据Kafka协议和自定义的解码方案解码。当解析元数据请求时,根据自定义的映射关系修改返回的元数据响应。

校验器当解析的是生产请求时,会根据自定义的校验规则进行校验。

映射关系被维护在Gatekeeper中处理连接关系。

Gatekeeper维护的映射关系中,由于Kafka的默认端口号是9092,"Gatekeeper的IP地址+9092端口"的连接将与"Bootstrap的IP+9092端口"做映射。"Gatekeeper的IP+port1"的连接将与"Broker1的IP+9092端口"做映射,"Gatekeeper的IP+port2"的连接将与"Broker2的IP+9092端口"做映射,依此类推。Gatekeeper就可以根据这个映射关系,处理来自客户的请求,发送给相应服务端,并同样处理来自服务端的响应。

总而言之,Kafka Gatekeeper监听了客户端发来的请求,根据配置转发给服务端,一方面解析了客户端的生产信息做数据校验,另一方面修改了服务端的元数据响应信息给用户,以保证用户的生产信息总是通过Gatekeeper进行转发。

2.2.1 利用通讯协议进行解析

通过前文可知,每个请求和响应都有固定格式的header和具体的请求包。而由于Kafka每一种协议也都有固定的格式,Kafka协议中可使用的数据类型是固定的,且是按顺序存储的。

因此,只需给每种数据类型实现一个特定的编解码方案,并通过header中携带的ApiKey和ApiVersion,确定某一个解码格式,就可以根据收到的包序列化数据。

综上所述,Gatekeeper的解码器需要完成两个任务:实现不同数据类型的序列化功能,以及根据版本确定协议格式。

以version-1的生产消息为例:

从编解码角度来说,每个协议包都是由4字节的size开头,后面再跟相应字节的请求包或响应包。解码器首先会通过序列化功能解析了这个4字节的size,计算出请求包的大小。

同样的,解码器计算出2个字节的ApiKey和ApiVersion(和本文无关的其他字段暂时略过)。解码器计算出生产请求的的ApiKey为0,ApiVersion为1。这样解码器的确认版本功能就能确定一个协议格式,再根据这个格式的数据类型去逐个做解析。

至此,Gatekeeper可以就根据不同类型,不同版本的的客户端请求,完成解析。根据即时的解码内容,针对需要再进一步处理,可以保证问题发现的及时性。

2.2.2 利用交互流程进行连接处理

Gatekeeper的工作原理是在本地机器上打开tcp套接字,并在使用套接字时,代理连接到相关的Kafka服务,它将本地端口与真实的服务地址进行映射。

6ac2035624f1b1a962de66cb67ff934a.jpeg

图2-5

如图2-5所示,用户加入Gatekeeper服务后,Produce的具体流程:

1)当客户端发起第一条元数据请求时,发送地址是Gatekeeper地址,请求将会被Gatekeeper监听到。

2)Gatekeeper发起一条到服务端的连接,把监听到的连接发送给Boostrap地址,同时存储一份Boostrap地址和本地地址的映射。

3)元数据响应会返回一串Broker的相关信息,Gatekeeper接收到相关信息后,会解析内容将Metadata数据中原本的节点IP信息,替换成Gatekeeper的地址。

4)当客户端发送Produce请求时,通过接收到响应里的地址和Gatekeeper建立连接的。

综上所述,客户端的Produce流程都经过Gatekeeper,Gatekeeper可以对所有的Kafka消息进行校验。保证打点数据进入计费链条前先进入校验逻辑,实现校验检测全覆盖。

2.2.3 可配置化校验与自助异常定位

Gatekeeper的目标,是提供一个针对Kafka消息的前置数据校验代理,解决接入服务的数据质量问题。从数据源头入手,配置校验规则检查每个topic的数据是否合规,定位异常数据来源,向相关团队告警,并提供自助排查看板。

提供可自定义配置的校验规则,可以随时更新、订正,并且提供根据解码内容明确责任人的功能。Gatekeeper的校验器会根据配置的规则,对比分析解码内容做校验。提供包括判断字段类型、检查字段缺失、以及符合CEL语法的校验规则等功能。

以如下schema为例,TripCostAllocationProtocol约定某topic必须包括,不为空的字符串Name字段,和可选且大于零的整形Timestamp字段。

schema{
   Name: "", //required
   TimeStamp: 0, //optional
   ...
}

相应的,Gatekeeper配置如下,针对该topic的TripCostAllocationProtocol约定,配置校验规则。在数据流经代理时,根据规则全面检测。

"Topics": [
        {
            "Name": "fake.topic",
            "Owner": [
                "Key":"Name"
            ],
            "SchemaRules": [                
               {
                    "Name": "Name",
                    "Type": "string",
                    "Optional": false
                },               
               {
                    "Name": "Timestamp",
                    "Type": int,
                    "Optional": true
                    "Rule": "TimeStamp>0"
                }
            ]
        }
     ]

以Timestamp字段非法零值为例,当Gatekeeper检验发现,此条消息不符合配置的规则 "Timestamp>0",会根据配置的Owner,锁定数据来源“Service A”并告警反馈给该团队,明确问题责任。

{
    Name:"Service A",
    TimeStamp: 0,
}

此外,Gatekeeper也提供了自动告警功能和自助查询功能。如图2-6所示,处理用户生产数据的流程以实线表示,是“用户-代理-服务”的线性流程,全覆盖所有数据一进行校验。同时Gatekeeper向日志系统和监控系统分别发送了校验失败指标和详细信息日志。

8e9b600dfc6eb84bcfdb2d372619189b.jpeg

图2-6

校验到不合规数据时,用户接收监控告警,通过监控系统可以查看包括数据错误条数,校验通过率等内容。

以上述错误为例,自建PaaS服务Service A收到fake.topic中生产了校验不合法数据的告警。Service A的研发团队通过检查告警系统检查告警信息。研发团队可以跳转到对应的日志系统,以检查错误日志以及校验不通过字段的规则,根据错误日志自助修复数据。

通过自动告警,提高了问题的定位效率,明确了问题责任方。通过提供自助查询看板,可视化展示校验结果和异常来源,方便研发团队自助修复数据,闭环治理流程。

2.2.4 高可用部署

根据携程的可用性最佳实践,实现跨AZ高可用和数据校验就近处理。如图2-7所示,服务给用户提供统一入口,并在AZ内部署多个实例提供服务。

5e5bd8bebf8a9a000846a115d631d996.jpeg

图2-7

如图2-8所示,(1) 是原始的Kafka客户端和服务端交互过程示意图,(2) 是单AZ内,增加了Kafka Gatekeeper做代理后的交互过程示意。

3e7b6b60469c69bedde6f64451318833.jpeg

图2-8

此前,Gatekeeper的地址需要承担的三项责任--监听,广播和提供入口:

1)监听来自客户的元数据和生产请求。

2)返回元数据响应时,提供给用户新的生产请求发送的广播地址。

3)提供客户端,用于替换原本Bootstrap的入口地址。

在高可用的部署架构下,Gatekeeper的地址不再承担提供入口的责任,客户端使用总的入口地址代替原本需要配置的Bootstrap地址。

2.2.5 技术挑战

在某次重启服务后,尽管服务看起来正常运行,并且新增接入的客户端也符合预期,但部分已接入的Java客户端总是连接失败,直到客户端自行重启服务。经过测试发现,这种情况与客户端刷新元数据的行为有关。

Kafka生产请求不可达时,客户端会做一次元数据的刷新。响应这个刷新元数据请求的Broker会根据注册中心返回当前可达的Broker节点列表。在第一次发送元数据请求时,客户端连接的是Bootstrap地址(加入Gatekeeper的流程中,连接的是Gatekeeper的IP地址)。然而,在刷新元数据时,客户端的行为有一些区别。

8ac86166ec343ad43281e6b266807651.jpeg

图2-9

如图2-9(1)所示,测试时使用的客户端刷新MetaData的请求,和初始发送元数据请求一样,发往Bootstrap地址。而Java客户端只有第一次启动时把元数据请求发给Boostrap地址,如图(2)所示,Java客户端的刷新MetaData的请是直接打给具体Broker地址的。

在加入Gatekeeper服务之后,如图2-10(1)所示,监听请求的地址和返回的广播地址是Gatekeeper自己的IP地址,广播地址用于代替元数据响应中的的Broker地址信息。也就是说,Java客户端在刷新元数据信息时也会将请求发往Gatekeeper的IP地址。而由于服务重启,Gatekeeper实例的IP地址发生了变化。因此,客户端也无法通过刷新元数据得到目前可达的服务地址,导致连接失败。

c2da0257ddebf96a262513ce366eb5af.jpeg

图2-10

总之,不同客户端在刷新元数据的方式上存在差异。Java客户端会缓存Gatekeeper的IP地址,当这个地址变得无效时,连接就会失败。而当客户端的连接总是发送到一个有效的负载均衡地址,因此不会出现这样的问题。

因此,只需让客户端缓存的地址,也就是在元数据响应中返回的地址,总是有效的,就可以避免以上问题。

原本Gatekeeper的IP地址承担了监听和广播两个功能,其中广播地址与Broker地址一一对应。如图2-10(2)所示,为了解决固定IP的问题,服务使用挂载的固定负载均衡地址替换原有广播地址。同时,使用固定范围的端口号代替随机的端口号,且LoadBalancer上与Gatekeeper上映射的端口是完全一致的,就可以解决固定端口的问题。

这样,即使Gatekeeper不像Kafka一样使用注册中心来注册所有可达的地址,仍然可以确保客户端始终能够找到服务,而不会丢失连接。

三、总结

Gatekeeper是一个提供对Kafka数据进行校验的工具,并实现校验规则的可配置化。同时Gatekeeper还提供了可视化展示校验结果和异常来源的监控看板,并提供自助查询错误日志的功能。在源头实现定位异常,保证了规则检测全覆盖,并提供自动异常发现和自助异常定位服务,从而完成了治理闭环,提升了数据质量。

目前Gatekeeper的适用范围仅限于FinOps计费系统,但整体架构是针对Kafka消息设计的,因此它可以作为一个可复用的数据校验代理。未来,Gatekeeper希望能提供一个通用的数据系统校验处理能力,以解决更广泛的数据质量问题。

【推荐阅读】

9d2edb54fc78bcea20d2cb9e0533eafe.jpeg

 “携程技术”公众号

  分享,交流,成长

ARM的CI-700和Arteris的NoC对比 设计理念:CI-700注重于为移动和客户端SoC提供定制化的互连解决方案,而Arteris的NoC更侧重于提供灵活、可配置的网络互连技术,适用于多种应用场景。性能与功耗:CI-700通过系统级缓存和网状拓扑结构优化性能和功耗,而Arteris的NoC通过物理感知和多协议支持来提升性能和降低功耗。功能安全:Arteris的NoC提供了功能安全支持,这对于汽车和工业应用尤为重要,而CI-700虽然也关注安全性,但未明确提及功能安全支持。互操作性。 阅读详情

相关推荐

Ubuntu22.04安装ROS2 —— ROS2 humble 详细图文教程

本文详细介绍了如何在Ubuntu22.04(Jammy)系统下配置ROS2环境,安装RO2软件包,并验证安装成功。ROS2的版本是Humble Hawksbill。:ROS是一个开源的,提供硬件抽象、设备驱动、库、工具和通信机制,支持模块化开发与集成,广泛用于机器人控制和自动化应用。ROS2 相较于 ROS1 在架构设计、通信机制和平台支持等方面做出了改进。ROS1 采用集中式主节点(Master)进行节点间通信,存在单点故障风险,且实时性和跨平台支持较弱。

weixin_49649078的博客 8810

Kafka 如何实现顺序消费?

Kafka仅保证分区内消息有序,不支持全局有序。实现顺序的关键是:生产端通过相同Key确保消息进入同一分区(配合幂等生产者防重试乱序),消费端保证分区独占且按Key路由至内存队列,由单线程串行处理。吞吐提升可按Key拆分队列并行处理,避免并行导致乱序。核心口诀:同Key同分区,同分区同线程。

194

解决turmex安装kali报错问题

在手机上安装好turmex后,都喜欢安装一个Linux系统,我当时安装的时kali,但是安装过程中,报错不断。 2019.8.24更新 1,出现问题首先看下载kali源文件是否完整 安装步骤中,会显示[解压中.....] ,可以看到解压的大小。 如图所示,完整源文件不小于81M。 如果源文件过小,则说明下载错误,而且在remove kali这个命令下,是不会删除源文件的,下一次安装只...

WeiLuckyStrike的博客 1万+

消费回调固定 return nil:错误传播与 Kafka 位点提交的区别

Mongo 写入失败时处理器记录错误但不 Mark,外层回调仍返回 nil;返回值与 Kafka 位点提交是不同动作。失败消息是否重投或被后续位点越过,需要结合分区水位分析。

2501_92769340的博客 139

Vim 入门到够用:Linux 文本编辑器的三种模式、常用操作与实战技巧

i 进入编辑模式Esc 退出编辑模式回到命令模式: 从命令模式进入底行模式编辑,不一定非得“打开就直接打字”。一旦你接受了“模式”这件事,后面很多操作都会顺起来。学 Vim,不要追求一次学全,先把“命令模式—编辑模式—底行模式”这条主线练熟。只要这条主线通了,后面的复制、删除、搜索、替换,都是顺手补上去的能力。

Web安全工具库 798

红米K70至尊版修复“nv损坏”主板电阻图示 mtk芯片工程固件刷写与步骤说明

💝💝💝红米K70至尊版 机型代码:rothko,搭载天玑9300+旗舰芯片.后置5000万像素索尼IMX906高动态OIS主摄,800万像素超广角镜头,200万像素微距镜头,前置2000万像素摄像头,也适用于以下型号的小米机型:2407FPN8EG,2407FPN8ER,XIG06,A402XM,2407FRK8EC。 💝💝💝通过博文了解 1💝💝💝-----此机型工程固件的资源刷写注意事项 2💝💝💝-----此机型刷写工程固件预览界面 3💝💝💝------红米K

小马哥的专栏 1459

Kafka 的存储也能进对象存储:用 AutoMQ 把日志流写进 RustFS

Kafka 的痛点是存储和 broker 绑死在一起。topic 一多、留存一久,broker 本地盘就被日志段塞满,扩容不是加 broker 就是换更大的盘,数据还得在节点间搬来搬去。更麻烦的是 broker 一旦挂了,恢复全靠副本在别的节点重建,磁盘 IO 先爆一轮。AutoMQ 是 Kafka 的一个云原生发行版,思路是把存储和 broker 彻底解耦:预写日志先在本地缓冲,随后作为不可变…

分布式存储与RustFS的博客 313

YOLOP v2!YOLOv7结合YOLOP的多任务版本 更好、更快、更强

YOLOP v2!YOLOv7结合YOLOP的多任务版本 更好、更快、更强

jacke121的专栏 2705

kafka集群(kafka_2.13-3.5.1.tgz)添加用户密码认证

继上篇文章zk集群添加完用户密码后,kafka集群也需要添加认证,主要方法与zk类似。

weixin_44418421的博客 230

反应动力学仿真软件:Kintecus_(4).用户界面及操作指南

在 Kintecus 中,反应方程的定义非常灵活。您可以定义简单的一阶反应、复杂的多步反应以及不同类型的反应机制。

kkchenjj的博客 1182

基于Simulink的永磁同步电机三闭环(位置/速度/电流)伺服仿真

本文详细介绍了基于Simulink的永磁同步电机三闭环伺服控制系统的设计与实现,针对机器人关节控制场景。系统采用位置环(外环)、速度环(中环)和电流环(内环)的嵌套结构,通过精确的带宽匹配(电流环1kHz、速度环200Hz、位置环20Hz)实现亚微米级位置跟踪。文中提供了完整的Simulink建模步骤,包括主电路搭建、三环PI控制器实现及坐标变换模块,并验证了系统性能:阶跃响应时间35ms,位置误差<0.05°,正弦跟踪误差<0.15°,负载突加恢复时间0.08s。最后提出了参数自适应整定、前馈

amy_mhd的博客 279

通过 Docker 快速搭建 Kafka 开发测试环境

本文介绍通过Docker快速搭建Kafka开发测试环境的两种模式:无认证PLAINTEXT与SCRAM认证SASL_PLAINTEXT。首先生成KRaft集群ID,配置数据目录并使用docker-compose启动单机Broker。在无认证模式下初始化后,创建SCRAM用户;随后通过修改监听器协议、JAAS配置及客户端认证文件,切换至SASL认证模式。利用持久化数据卷,凭据可跨重启保留。适用于开发调试,生产环境需增强安全配置。

327

2024年CSP-X复赛真题题解(T1:购物)

2024年CSP-X复赛真题题解(T1:购物)

王老师青少年编程 1180

第八篇:《Kafka Connect 与 Kafka Streams:数据集成与流处理的两种路径》

还有 exactly.once.source.support 只覆盖 Source 侧的精确一次,Sink 侧的重复仍然要靠目标系统的幂等或 DLQ 兜底——这和第七篇的结论完全一致:框架不解决语义正确性,只解决工程效率。KRaft 和 EOS 让 Kafka 内部更可靠,但 Connect 和 Streams 的分工不会因此模糊:Connect 把数据搬进来搬出去,Streams 在 Kafka 内部算,算到边界之外仍然要自己兜底一致性。判断标准只有一句话:你是在“搬数据”,还是在“算数据”。

qq_45239623的博客 359

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

kafka指定分区消费

【代码】kafka指定分区消费。

hy_208的博客 57

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【Kafka 从入门到实战】从手写一个队列到生产级消息中间件:架构、分区、消费组、零拷贝全解析

本文从队列基础出发,层层解析Kafka架构与设计精髓,涵盖消息队列本质、核心术语、分区机制、生产者消费者模型及四大性能优化原理:顺序写入、批量压缩、页缓存、零拷贝。附完整可运行Python代码(建Topic、生产/消费),并总结12道高频面试题与踩坑记录,帮助读者真正理解Kafka“为何快”,而非仅背“零拷贝”一词。

wiwiwiwiooo的博客 324

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

只 Mark 最后一条:Kafka 跨分区消费水位的风险

历史快照中两个分区重启后 lag 为 1;当前批次回调只 Mark 最后一条,可能漏记其他分区的进度,但快照不足以证明永久停滞或唯一根因。

2501_92769340的博客 160

Kafka 怎么保证消费只消费一次的?

一句话:Kafka 本身只保证“至少一次”,“只消费一次”要自己动手。常规业务用“手动提交 offset + 业务幂等”这对组合拳;下游是数据库可以把 offset 和业务绑进同一个本地事务;纯 Kafka 内部流转则直接上幂等生产者 + 事务。把“业务处理与 offset 提交非原子”这个根因讲透,再给对应的幂等方案,这道题就稳了。

198

第九篇:《Kafka 监控与运维:Lag、Under-replicated Partition 与磁盘管理》

标签:Kafka | 监控 | Consumer Lag | Under-replicated Partition | 磁盘管理 | 运维 | SRE适合人群:负责 Kafka 集群稳定性的 SRE、后端开发,被“告警响了但不知道要不要起床”折磨过的同学阅读收益:搞清楚 Lag 告警为什么用绝对值会双向失效、URP 为什么不能一看到就重启、磁盘管理为什么“百分比告警”是错的,以及三条可以直接抄的运维规则前言:凌晨两点的两个告警,一个误报,一个差点搞出大事故先说两个真实场景。

qq_45239623的博客 432

Kafka4.4安装配置详细说明,配JDK21

目的:现在 Kafka 是 PLAINTEXT,任何能连上 9092 的 IP 都能建/删 topic、读写所有数据。要做三件事:① 给他们建账号 ② 建好他们要推的 topic ③ 防火墙白名单放行他们的 IP。目标:把 9092 / 9093 加入端口黑名单,让「白名单 IP 仍能访问、其他 IP 被拒绝」。(记下来,后面所有管理命令的 admin-client.properties 都要用它)。修复后客户端立即返回 topic,端到端(建 topic → 生产 → 消费)全部通过。

崔崇鑫的博客,你linux/云运维工作中的百科全书。 514

第十篇:《Kafka 安全加固:SASL、SSL、ACL 与多租户隔离》

allow.everyone.if.no.acl.found 的生产语义必须理解清楚:默认 false 是安全的选择——如果一个资源没有任何 ACL,除了超级用户,谁都无权访问。最关键、也最容易被误解的语义是:配额是按 Broker 强制的,不是按集群强制的。另一个静默坑是后缀与格式不匹配:给 PKCS12 格式的密钥库文件用了 .jks 后缀,部分 Spring Boot 版本的 SSL 类型自动探测会按 JKS 格式加载,失败后直接返回空密钥库,启动时不抛异常,只在握手时表现为没有证书。

qq_45239623的博客 285

Kafka 消费者每 5 分钟触发一次 Rebalance,把 max.poll.interval.ms 调大仍然掉线

消费者加入消费组后每约 5 分钟被踢出一次。文中命令与代码块可直接复制执行,未实测的结论均已单独标注。文中给出了可复现的环境与操作步骤,并标注了哪些结论已经验证、哪些仍属推测。

昨日种种,皆成今我。今日种种,皆成新我。 159

Kafka 消费者 poll() 流程与原理详解

Kafka Consumer 的poll()不只是简单的“拉取消息”,而是消费者运行过程的核心驱动入口。poll()↓Metadata / Group 协调↓Heartbeat↓↓↓Broker↓↓业务处理↓Offset 提交理解poll()的工作机制,可以帮助排查 Consumer Lag、消费延迟、频繁 Rebalance、处理超时以及消费吞吐不足等问题。控制一次poll()返回多少消息,而控制业务处理两次poll()之间允许的最大时间。

虽非技冠群英首,愿与同道共长歌; 大鹏一日同风起,扶摇直上九万里; 569

消息队列入门:RabbitMQ 与 Kafka 核心概念与运维要点

BIOS→GRUB→内核→systemd→target 全链路解读,root 密码忘了解锁、文件系统损坏修复、单用户模式与救援模式实战,服务器起不来时的救命指南。

2502_91473995的博客 354

ubuntu安装kafka

搭建基于KRaft模式的Kafka三节点集群,使用Kafka 3.9.1与Java 11,三台机器(master、worker1、worker2)各承担broker与controller角色。通过统一集群ID初始化,配置节点ID与监听地址,分发配置并设置环境变量。启动后通过命令行创建主题、测试消息收发,验证集群正常运行。无需ZooKeeper,适合实验环境。日常启停需在每台执行对应脚本。

qq_43592674的博客 185

第四篇:《Topic、Partition 与 Offset:Kafka 数据模型的核心语义》

迁移改变的是元数据如何管理,但没有改变 Kafka 最根本的数据模型——Topic 是逻辑分类,Partition 是物理并行单元,Offset 是分区内的唯一标识。本文从数据模型的核心语义讲起,深入拆解分区数的永久性、副本因子的耐久性含义、以及五种分区策略的取舍,帮你建立建 Topic 之前必须想清楚的工程判断。Key-based 的热点风险是实际生产中最常见的问题:如果某个 key 的消息量远超其他 key(例如一个超级大客户的 customer_id),那个分区会成为瓶颈,其他分区却很空闲。

qq_45239623的博客 424
上一篇: 干货 | 携程从零构建多端一致的设计研发体系实践
下一篇: 来啦!2024携程研发效能年度报告
携程技术
博客等级 码龄10年 3716粉丝 324原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值