同程旅行基于Proxy的Kafka最佳实践

公众号文章:同程旅行基于Proxy的Kafka最佳实践

Apache Kafka,作为当前企业级数据流处理的首选平台,由于其高吞吐量和可扩展性而深受欢迎。
然而,随着企业数据量的爆炸性增长和业务需求的多样化,Kafka 集群面临着各种挑战,特别是在集群可用性和流量治理方面。
为了解决这些挑战,我们引入了 Kafka-Proxy 作为一个优雅地解决方案,旨在提高 Kafka 集群的稳定性和扩展性。
本文将介绍同程旅行 Kafka-Proxy 的设计、核心功能以及实施效果,展示了其在提升 Kafka 集群稳定性和扩展性方面的强大能力。

Kafka 集群面临的挑战

目前公司现有 Kafka 集群,随着业务规模的扩大,集群体量不断增大,暴露出了以下问题:

  • 大集群瓶颈:由于接入的业务越来越多,流量越来越大,加上没有很好的管理,很多集群已经变得特别的大,比如单集群 Topic 数好几千个,稳定性风险比较大。
  • 无集群级别的容灾能力:很多场景下如网络故障,硬件故障等预期外场景会导致单集群不可用,且没有很好的止损的手段。
  • 使用痛点: 比如很多用户一直在提的重置消费进度等需求,原生 Kafka 操作起来比较重,对用户不太友好。

为了解决以上问题,我们通过设计一套 Kafka-Proxy 代理的方案来提高整个 Kafka 集群的可用性和流量治理能力,保证业务的稳定运行。

设计目标

整体的设计目标如下:

  • 无缝切换集群:实现业务的平滑拆分和引流至新集群,特别是将核心业务与普通业务隔离,确保核心业务的不间断和高可用性。
  • 跨中心流量监控:提供深入的流量监控功能,包括但不限于各 Topic 的流量走向和 Channel 数量、耗时、请求大小等,配备全面的报警机制以预防潜在问题。
  • 在线重置消费进度:支持在无需停机的情况下,灵活调整消费进度,提高系统的适应性和恢复能力。
  • 流量熔断机制:引入 Topic 级别的熔断机制,有效避免流量高峰时的系统过载,保护集群稳定运行。
  • 双中心支持:实现就近生产与消费的能力,优化系统响应速度和资源利用率,特别适用于跨 Region 部署的场景。

系统设计

整体的系统设计采用外挂的方式提供服务,通过在客户端和 Broker 之间植入一个轻量级的代理层。代理层的协议与 Kafka 保持完全兼容,实现了对客户端和 Broker 的无缝对接。这种设计规避了对客户端和 Broker 的任何改动需求,既保留现有系统的完整性,又增加了新的功能支持。
代理层致力于处理大量并发连接和大量数据传输,所有这些都是为了确保我们系统的核心能力——极高的吞吐量和最小化的通信延迟,考虑到性能最大化、减少网络通信的耗时损耗,我们采用了与 Broker 同机部署的策略。

系统架构

整体架构

在这里插入图片描述
从图中可以看到我们的一个独特设计–Metadata 共享。通过这种设计,我们的后端可以被拆分为多个集群,而对于业务来说,他们只需要使用一个公共地址就可以访问我们的服务,无需关心他们的请求在哪个集群中被处理。每个集群都可以独立运行,处理一部分 Topic,并且通过元数据共享,各个集群之间能够互相无缝切换。这种能力在需要对某个集群进行维护或升级时尤其有用。我们可以将该集群的 Topic 无缝切换到其他集群进行处理,而业务层面完全感知不到这个过程,从而实现了真正意义上的无缝切换。

内部结构

在这里插入图片描述

名词解释
  • Netty Server:作为服务端,负责接收客户端发出的各种请求。
  • Netty Client:作为客户端,向 Broker 转发各种请求。
  • Key Queue:一个关键的队列,用于存储所有活跃状态下客户端连接的 channelId,作为后续处理的索引。
    DataTable:一个关键的数据结构,记录了 channelId 与其对应的 Channel 上下文信息以及请求队列,便于管理和操作。
  • SendWorker:一个专门的工作线程,负责处理请求。它从 Key Queue 中获取一个 channelId,随后从 DataTable 中找到对应的请求队列,并从中取出请求进行处理。
  • Acks0SendWorker:一个专门的工作线程,负责处理生产者设置 acks=0 的请求。它从请求队列中取出相应的请求数据进行处理。
  • ChannelManager:负责维护 客户端->Proxy 以及 Proxy->Broker 之间的 Channel 映射关系,保证数据传输的正确性和高效性。
  • Cache Manager:负责定期拉取集群信息、Topic 信息、全局配置等重要的元数据信息缓存到本地,以保持系统数据的最新状态和高效运行。
  • Processor:一个统一的请求处理策略处理器,它在请求抵达 Broker 之前或之后执行特定的处理操作,以优化数据处理流程和提高效率。
工作流程
  1. 启动和监听
    Proxy 启动后,自动监听指定端口,准备接收客户端的连接请求。
  2. 请求接收与解析
    一旦客户端成功建立连接,Proxy 开始接收来自客户端的请求。通过解析 ByteBuf,Proxy 获取到 ApiKey 和 acks 标识,以决定如何处理这些请求。
  3. 基于 acks 值的处理逻辑
    对于 acks=0 的请求:这类请求直接被放入 acks0Queue,由 Acks0SendWorker 线程处理,实现单向发送请求至 Broker 而不等待响应。
    对于其他类型的请求:这类请求根据 channelId 不同被分配到对应的 dataQueue,由 SendWorker 线程处理。处理过程包括通过特定的 Processor 进行处理后发送至 Broker,并等待响应。
  4. 请求与响应匹配
    对于需要返回响应的请求,Proxy 通过 requestId 确保发送至 Broker 的每个请求与其响应匹配。匹配成功的话,Proxy 将 Broker 返回的数据写回到发出请求的客户端 Channel 中,完成数据传输。
  5. 异常处理和系统稳定性
    若发现请求与响应不匹配,或者遇到其他异常情况,则断开 客户端->Proxy 以及 Proxy->Broker 的连接,迫使客户端重新连接,断开连接并重新建立连接是一种保障系统稳定运行的机制,确保数据传输的连续性和准确性。

特性

无缝切换集群
就近生产消费
不停机重置消费进度
生产消息熔断
消费消息熔断

落地收益

未来展望

最后

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/689325.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模型 空船效应

1 空船效应的应用 1.1 空船效应帮助客户服务人员面对挑战性客户 赵敏是一家大型电信公司的客户服务经理。在一次服务中,一位客户因为网络连接问题而非常愤怒,他通过电话对赵敏大声抱怨,并要求立即解决问题。一般在这种情况下,客…

暗区突围哪里获得测试资格 暗区突围测试资格获取方法

在游戏业界的浩瀚星空中,《暗区突围》如同一颗璀璨新星,以其独树一帜的游戏模式和前所未有的沉浸式体验,迅速吸引了全球玩家的目光。它不仅仅是一款游戏,更像是一次对勇气、智慧与团队合作的深度探索。玩家在危机四伏的暗区中&…

IP地址127.0.0.1的误解:一次投标监管的技术失误

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

Apache SeaTunnel 4月回顾:明星贡献者与技术突破

各位热爱 SeaTunnel 的小伙伴们,SeaTunnel 社区 4 月份月报来啦!这里将记录 SeaTunnel 社区每月的重要更新,欢迎关注! 月度 Merge 之星 感谢以下小伙伴 4 月为 Apache SeaTunnel 做的精彩贡献(排名不分先后&#xff…

ChatGPT 即将登陆 iPhone;斯坦福推出 AI 辅助全息成像技术丨 RTE 开发者日报 Vol.202

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

鸿蒙OpenHarmony:【关于deps、external_deps的使用】

关于deps、external_deps的使用 在添加一个模块的时候,需要在BUILD.gn中声明它的依赖,为了便于后续处理部件间依赖关系,我们将依赖分为两种——部件内依赖deps和部件间依赖external_deps。 依赖分类 开发前请熟悉鸿蒙开发指导文档&#xff…

ambari-server高可用配置方案

制品 https://kdocs.cn/l/cie4hSgvUunX 前置条件 环境需要支持VRRP协议 环境需要配置好yum源 变更影响面 变更不会影响其他组件 配置lb(需要客户侧配置并提供LB地址) 转发方式选择 主备 监听端口为8080、8440、8441 协议为tcp 后端监听选择kde-offline1为主 后端监听选择kde-…

YOLOv8预测流程-原理解析[目标检测理论篇]

接下来是我最想要分享的内容,梳理了YOLOv8预测的整个流程,以及训练的整个流程。 关于YOLOv8的主干网络在YOLOv8网络结构介绍-CSDN博客介绍了,为了更好地介绍本章内容,还是把YOLOv8网络结构图放在这里,方便查看。 1.前言…

DDM-MIMO-FMCW雷达MATLAB仿真

本文在前期TDM和BPM体制的基础上,仿真DDM体制下的调制解调和信号处理测距、测速、测角流程。 TDM和BPM相关可以看这两篇博文TDM(BPM)-MIMO-FMCW雷达仿真-CSDN博客,确定性最大似然(DML)估计测角-CSDN博客TDM(BPM)-MIMO-FMCW雷达仿真…

Numpy求最大、最小值、求累乘、累和

Numpy求最大、最小值 代码举例: ​ 输出结果为: ​ 在这个例子中,我们首先导入了NumPy库,然后创建了一个3x3的矩阵A。接着,我们使用np.max()函数来求矩阵A的最大值,并将结果存储在变量max_value中&#xff…

WordPress原创插件:超链接点击访问统计

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 一般我们都使用第三方统计服务(比如百度统计)来统计网站的访问量,使用此插件可以统计文章的浏览次数,那么,如果想统计网站外…

队列 + 宽搜(BFS)

目录 leetcode题目 一、二叉树的层序遍历 二、二叉树的层序遍历 II 三、N叉树的层序遍历 四、二叉树的锯齿形层序遍历 五、二叉树最大宽度 六、在每个树行中找最大值 七、二叉树的层平均值 八、最大层内元素和 九、二叉树的第K大层和 十、反转二叉树的奇数层 leetco…