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

ops/2024/10/20 3:56:40/

公众号文章:同程旅行基于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 无缝切换到其他集群进行处理,而业务层面完全感知不到这个过程,从而实现了真正意义上的无缝切换。

内部结构


http://www.ppmy.cn/ops/39661.html

相关文章

【工具】如何提取一个mp4文件的关键帧

文章目录 怎么做如何安装ffmepgUbuntu 或 DebianCentOS 或 FedoramacOSWindows其他 Linux 发行版 实践什么是关键帧 怎么做 你可以使用ffmpeg这个强大的多媒体处理工具来提取mp4文件中的关键帧。以下是一个示例命令,可以使用ffmpeg从mp4文件中提取关键帧&#xff1…

解决springboot项目的网站静态页面显示不全问题

在通过springboot搭建项目时,为了能够访问静态的前端页面,我们考虑到访问的优先级问题,通常选择将资源放在recourses/static的目录下,如下: 这时可能会出现类似于下面这种图片无法加载、没有按照指定位置显示的情况&am…

第九届“数维杯”大学生数学建模挑战赛(C题)深度剖析|建模完整过程+详细思路+代码全解析

问题1 问题1的建模过程如下: 设勘探区域为 D D D,勘探井位数量为 n n n,每个勘探井位的坐标为 ( x i , y i ) , i 1 , 2 , . . . , n (x_i,y_i),i1,2,...,n (xi​,yi​),i1,2,...,n。根据勘探数据,假设该区域内天然气水合物资源…

初始Linux(基础命令)

前言: 我们不能总沉浸在编程语言中,虽然代码能力提升了,但是也只是开胃小菜。我们要朝着更高的方向发展。 最近小编一直在刷力扣,以至于博客更新的比较少。今天就带各位开始学习全新的知识——Linux.至于为啥要学? Lin…

【定制化】在Android平台实现自定义的程序启动页

特别说明:以下仅适用于Android平台。 实现原理 创建安卓端自定义的Activity禁用UnityPlayerActivity的启动Logo改用自定义Activity 示例效果 参考简单步骤或详细步骤都可实现。 自定义的启动动画,效果如下: 简单步骤 三步操作实现启动动画…

Spring-Bean 作用域

作用域 作用域案例 public class BeanScopeDemo {AutowiredQualifier("singletonPerson")Person person;AutowiredQualifier("prototypePerson")Person person1;AutowiredQualifier("prototypePerson")Person person2;AutowiredSet<Person&g…

如何防止WordPress网站内容被抓取

最近在检查网站服务器的访问日志的时候&#xff0c;发现了大量来自同一个IP地址的的请求&#xff0c;用站长工具分析确认了我的网站内容确实是被他人的网站抓取了&#xff0c;我第一时间联系了对方网站的服务器提供商投诉了该网站&#xff0c;要求对方停止侵权行为&#xff0c;…

如何使用google.protobuf.Struct?

google.golang.org/protobuf/types/known/structpb 包提供了一种方式来创建和操作 google.protobuf.Struct 类型的数据。google.protobuf.Struct 是一种灵活的数据类型&#xff0c;可以表示任何结构化数据。 以下是如何使用 structpb 包的一些示例&#xff1a; 创建 Struct&a…