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

news2024/11/18 8:21:24

公众号文章:同程旅行基于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.coloradmin.cn/o/1664301.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux系统】进程

本篇博客整理了进程的多方面知识, 旨在从进程的概念、管理、属性、创建等方面让读者更加全面系统地理解进程和操作系统的管理设计。 目录 一、进程是什么 二、操作系统如何管理进程 1.描述进程 PCB 2.组织进程 3.再谈进程和进程管理 三、Linux下的进程管理 1…

[机器学习-04] Scikit-Learn机器学习工具包进阶指南:集群化与校准功能实战【2024最新】

🎩 欢迎来到技术探索的奇幻世界👨‍💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…

选型前必看,西门子五大系列PLC的区别及特点

西门子是全球知名的自动化解决方案提供商,其PLC(可编程逻辑控制器)系列产品广泛应用于工业控制领域。不同系列的PLC在功能、性能和适用范围上有所区别。本文将详细介绍西门子PLC各个系列的特点和区别,以及在实践应用时如何采用无线…

具备教学意义的实操(用队列实现栈)

225. 用队列实现栈 - 力扣(LeetCode)https://leetcode.cn/problems/implement-stack-using-queues/description/ 实现逻辑 一个是先进先出(队列),一个是后进先出(栈) 这里用两个队列导入一下数据…

论文研读 An Image Is Worth 16x16 Words: Transformers For Image Recognition At Scale

完整翻译 《An Image is Worth 16x16 Words》完整版翻译_an image is worth 16*16words-CSDN博客 大神讲解 Vision Transformer详解-CSDN博客 视频讲解 11.1 Vision Transformer(vit)网络详解_哔哩哔哩_bilibili 学习整理 简要概述:Vision Transformer&#xff…

Flutter3.x get-cli中运行get init初始化项目报错如何处理

Flutter get-cli中运行get init初始化项目会提示如下错误: get init s E:\flutter\flutter study\tempstudy\misapp01> get init 1)Getx Pattern (by Kau) 2)CLEAN (by Arktekko) which architecture do you want to use? [1] unhandled exception: Synchromu…

谁使用DITA?

▲ 搜索“大龙谈智能内容”关注公众号▲ Keith根据LinkedIn上的数据进行的统计,主要反应的西方世界使用DITA的公司。因为LinkedIn在国内不能访问,笔者认为针对中国的数据并不准确。 作者 | John Walker - NXP销售和市场营销业务分析师 2013年4月18日 …

Java --- 集合(2)--- 这篇文章让你学会如何使用List集合

本期文章来自黑马程序员以及Java入门到精通,希望各位大佬发现文章的瑕疵及时表出,另外也感谢您的收看。话不多说,直接进入正题...... 目录 一.List集合的使用: 二.三种遍历List方式: 首先还是给大家呈现这幅图&#x…

AI宝库:全球精选AI工具网站一网打尽,创新智慧触手可及

​🌈 个人主页:danci_ 🔥 精选专栏:《设计模式》 💪🏻 制定明确可量化的目标,坚持默默的做事。 探秘AI之巅,一键解锁未来工具!立即点击,开启智能新纪元&#…

即插即用篇 | YOLOv8引入PSAModule | 高效金字塔压缩注意力模块

本改进已集成到 YOLOv8-Magic 框架。 最近研究表明,通过在深度卷积神经网络中嵌入注意力模块可以有效地提高网络性能。在这项工作中,提出了一种新的轻量级且有效的注意力方法,名为金字塔挤压注意力(PSA)模块。通过在ResNet的瓶颈块中用PSA模块替换3x3卷积,得到了一种新的…

系统图表:洞察数据的价值与魅力

在数字化、信息化迅猛发展的今天,数据已经成为企业决策、科学研究、社会管理等领域的核心资源。而如何高效、准确地理解和利用这些数据,成为摆在我们面前的重要课题。系统图表作为数据可视化的重要呈现工具,不仅能帮助我们洞察数据的内在规律…

Raspberry Pi Connect 官方树莓派远程连接新方式

系列文章目录 前言 2024 年 5 月 7 日 戈登-霍林沃思 今天,我们很高兴地宣布 Raspberry Pi Connect 测试版发布:这是一种安全、易用的方法,只需使用网络浏览器,就能从地球上的任何地方远程访问您的 Raspberry Pi。 远程访问 Rasp…

基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (二)

基于 LlaMA 3 LangGraph 在windows本地部署大模型 (二) #Options local_llm llama3 llm ChatOllama(modellocal_llm, format"json", temperature0) #embeddings #embeddings OllamaEmbeddings(model"nomic-embed-text") embed…

[算法][差分][延迟相差][leetcode]2960. 统计已测试设备

题目地址: https://leetcode.cn/problems/count-tested-devices-after-test-operations/description/ 解法一:暴力解法 class Solution {public int countTestedDevices(int[] batteryPercentages) {//特殊条件判断if(null batteryPercentages || ba…

PCIE协议-2-事务层规范-Message Request Rules

2.2.8 消息请求规则 本文档定义了以下几组消息: INTx 中断信号电源管理错误信号锁定事务支持插槽电源限制支持厂商定义消息延迟容忍度报告(LTR)消息优化缓冲区冲洗/填充(OBFF)消息设备就绪状态(DRS&#…

单细胞分析:多模态 reference mapping (2)

引言 本文[1]介绍了如何在Seurat软件中将查询数据集与经过注释的参考数据集进行匹配。我们展示了如何将来自不同个体的人类骨髓细胞(Human BMNC)的人类细胞图谱(Human Cell Atlas)数据集,有序地映射到一个统一的参考框…

IP定位技术在打击网络犯罪中的作用

随着互联网的普及和信息技术的发展,网络犯罪日益猖獗,给社会治安和个人财产安全带来了严重威胁。而IP定位技术的应用为打击网络犯罪提供了一种有效手段。IP数据云将探讨IP定位技术在打击网络犯罪中的作用及其意义。 1. IP定位技术的原理 IP&#xff08…

【小白可懂】SpringBootWeb入门

web开发需要的技术栈: 前端web开发: html css javascript Vue Element Nginx 后端web开发: Maven SpringBoot Web 基础篇 MySOL SpringBoot Mybatis SpringBoot Web开发篇 SpringBoot web进阶篇 什么是spring? 官网&a…

静态分析-RIPS-源码解析记录-03

既然有源码可以debug,那么直接跑测试用例,来跟踪处理逻辑感觉比直接看代码理逻辑更快一些,尤其是涉及到了扫描阶段,不然不容易弄清某刻某个变量的取值。 对于所有漏洞而言,都是由sink点到source点检测是否有过滤函数&…

创作纪念日(一周年)

机缘 我进入CSDN成为创作者是去年2023年的五月份,当时是在学校报名了蓝桥杯单片机组的比赛,觉得单片机方面有许多精妙之处,并且自学初学单片机实在有许多奇巧的设计点,有许多编程与硬件实际运行需要磨合的地方,这些惊…