Kafka客户端二次封装扩展总体设计

前言背景

消息系统经过多年使用和运维管理平台开发迭代,能较好支持支撑业务发展,公司主流语言为java,但缺乏一个基于Kafka二次封装简单好用的java客户端。遇到问题如下所示:

  • 使用好kafka客户端对业务要求高,非专业技术方向很难有精力全面掌握
  • 异常情况会catch不全
  • 客户端生产消息及双活机房容灾缺失
  • 集群升级难度增加,因为无法全面及时掌握客户端信息(kafka版本、groupid)
  • 不支持动态配置更新,业务使用错误及引发的潜在故障无法及时修正,例如Producer写入倾斜导致磁盘报警,参数batch.size当做消息条数使用

设计目标

通过对客户端设计,希望达到如下目标:

  • 提供简单好用客户端,对业务进行细节屏蔽掉,暴露出足够简单的接口
  • 支持客户端及双活机房容灾
  • 热配置支持在线修改灵活的策略和配置优化
  • 新功能特性支持(例如:客户端信息采集与上报、消息轨迹跟踪、热配置更新、新增安全性模块、消费失败消息重投递)

系统架构

Kafka管理平台:Apollo配置中心只是负责存储配置信息及接受客户端监听,指令下发是通过Ykafka管理平台进行的。管理员负责维护Ykafka管理平台修改热配置信息,然后同步给Apollo,Apollo推送给相应客户端
Apollo配置中心:所有Kafka集群共用一个分布式Apollo集群配置服务,用于管理所有集群的客户端配置信息,并进行动态更新管理,按照某一维度下发给相应客户端,客户端根据获取的热配置信息,进行相关管理操作。
MetaServer:所有Kafka集群共用对等节点的MetaServer集群服务,主要为存储客户端认证和权限信息,启动时获取认证信息,运行时通过cache来check,存储服务为分布式,避免单点故障。支持热配置启停开关
客户端(Producer和Consumer):客户端启动时不能直接访问Kafka集群,先要请求MetaManager服务,经过授权赋予相应权限资源后,才能访问Kafka集群授权资源。同时客户端通过Apollo监听相应配置,通过自身监听变更获取操作信息
注意事项:Apollo客户端能否优雅兼容多个AppID的问题,目前的结论是,一个客户端只能使用唯一的appId,如何A->B→C服务依次依赖,就会有冲突会被替换掉可能,那如何解决呢?
答曰:官网中关于namespace关联的情况,是通过类似于类继承的方式来实现配置继承的,可以实现配置复用。

客户端架构

热配置设计支持功能:

  • 管理分区生产策略:支持动态修改消息发送分区策略,因为业务可能使用错误,导致数据写入倾斜,也有可能运维需要,例如硬件损坏或下线等等
  • 集群路由/切换:用于支持集群容灾/容错/升级,集群运行过程中可能社会突发热点事件(例如新冠病毒),导致流量飙升,集群临时扩容不能快速完成,集群调度切换是最佳选择
  • 设置ack机制:动态修改写成功N个副本才返回客户端
  • socket buffer管理:根据硬件配置和业务需要,修改socket buffer大小来支撑吞吐量需求
  • 分区分配消费策略:除了默认Range、RoundRobin、sticky三种类型外,希望有业务消费出现异常时或不足时,服务不硬重启优雅退出消费group
  • 调节fetch大小和速率:用于调节消息端对端延时和吞吐量
  • 优化消费线程数量进行扩/缩:Kafka中partition是最小消费单元,一个消费线程可以消费多个partitions,为了提高消费吞吐量,可以适当增加线程数
  • 设置IP粒度唯一标识:某个时刻或某突发事件造成集群负载超过了实际载荷,需要进行流量限制,Kafka是对clientid进行限制的,多个客户端会共享同一个clientid,调控粒度可以小到IP级别
  • topic分级/消息轨迹功能分级开关

按级或作用域范围生效热配置,它们分别为集群、group、topic
新增功能特性

  • 消费轨迹跟踪:在topic中Message的整个生产消费生命周期中,保存生产消费链路中各个环节的执行情况,通过关键字key和时间戳可查询到可能遇到的问题
  • 安全性支持(认证/授权/隔离):当前集群安全性较低,任何人只要知道集群地址和topic信息,就能访问集群,为了提高集群安全性,提供授权访问支持
  • 监控报警(发送耗时、消费耗时、消费延时、消费延时异常)
  • 错误处理/异常catch
  • 对groupid进行生命周期管理,定期 + 实时相结合清除group
  • 消费失败重投递:当前Kafka中每条message只会投递一次,如果业务处理失败,就不会再次投递,消息丢失,增加消息重投递机制
  • 采集客户端并展示信息,客户端启动自主上报信息,历史上报 + 实时上报相结合

容灾支持

  • 集群不可用容灾:网络或集群异常保证仍然可用,如果网络或集群不可用,数据会先落到本地,等恢复的时候再从本地磁盘恢复到Kafka中
  • 双机房容灾:机房容灾Kafka目标原则,保证数据不丢、生产者写入优先、消费可以暂停;双活容灾处理流程,A机房负责所有读写,B机房容灾备份,如A机房有故障切换写B机房进行备份,如A机房恢复则B机房同步数据,同时producer立即切回A机房,kafka客户端负责路由和调度,Consumers由于语言众多,非java语言连接填写裸地址

SLA支持

  • 消费端限流/降级:支持消费端限流、暂停,调节粒度可到IP级别
  • 生产端切换:与热配置结合,支持集群间调度切换

原文地址:https://www.cnblogs.com/lizherui/p/12642014.html

时间: 2024-11-29 07:12:37

Kafka客户端二次封装扩展总体设计的相关文章

kafka 客户端封装

kafka客户端封装源码. 1.为什么进行封装? kafka官方自带的客户端,需要对参数进行设置,如下代码,很多参数的key都是字符串,这样对于编程人员来说非常不友好.参数很多的时候,有两种处理方式:(1)传一个config类进去解析:(2)使用建造者模式,笔者在此就使用建造者模式,对官方客户端进行简单封装,使之易用. 官方的例子如下: 1 Properties props = new Properties(); 2 props.put("bootstrap.servers", &qu

jquery-qrcode客户端二维码生成类库扩展--融入自定义Logo图片

年后换了部门,现在主要的职责就是在网上卖精油,似乎这个就是传说中的网络营销. 跟着公司的MM们也了解不了少关于网络营销的知识,间接的了解到马云和刘强东都是些怎样龌龊的人,尽管之前也这样认为. 淘宝就不多说了,全球最大的中文假货销售平台(尽管淘宝没有打出全球中文等字样,可是其必须当之无愧).百度,当当等厚颜无耻之徒的明智之举就在于此,老外做的再大也很少会有直接支持中文的,因此他们都会在其名称前增加:“全球最大的中文”等字样,为自己镶金. 之前还一直比较力挺京东的,认为其根本自营根本不会销售假货,所

OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据

OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据 我们这片博文就来聊聊这个反响很不错的OkHttp了,标题是我恶搞的,本篇将着重详细的分析,探索OkHttp这个框架的使用和封装 一.追其原理 Android系统提供了两种HTTP通信类 HttpURLConnection HttpClient Google推荐使用HttpURLConnection,这个没必要多说,事实上,我这篇写的应该算是比较晚了,很多优秀的博文都已经提出了这些观

毕加索的艺术——Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选

毕加索的艺术--Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选 官网: http://square.github.io/picasso/ 我们在上篇OkHttp的时候说过这个Picasso,学名毕加索,是Square公司开源的一个Android图形缓存库,而且使用起来也是非常的简单,只要一行代码就轻松搞定了,你会问,为什么不介绍一下Glide?其实Glide我有时间也是会介绍的,刚好上篇我们用到了Picasso,

android基于开源网络框架asychhttpclient,二次封装为通用网络请求组件

网络请求是全部App都不可缺少的功能,假设每次开发都重写一次网络请求或者将曾经的代码拷贝到新的App中,不是非常合理,出于此目的,我希望将整个网络请求框架独立出来,与业务逻辑分隔开,这样就能够避免每次都要又一次编写网络请求,于是基于我比較熟悉的asynchttpclient又一次二次封装了一个网络请求框架. 思路:网络请求层唯一的功能就是发送请求,接收响应数据,请求取消,cookie处理这几个功能,二次助封装后这些功能能够直接调用封装好的方法就可以. 二次助封装代码例如以下: 1.功能接口: /

android-async-http二次封装和调用

Android  android-async-http二次封装和调用 在开发过程中,网络请求这块的使我们经常遇到的一个问题,今天去github 网站上面学习android-async-http,觉得还是不错的  使用起来也比较简便   网络请求框架是一个不错的选择   方便大家一起共同讨论   QQ群:160373684 /** * * @类描述:android-async-http 进行封装的类 * @项目名称: * @包名: * @类名称:AndroidAsyncHttpHelper * @

Kafka 客户端实现逻辑分析

这里主要分析kafka 客户端实现 (代码分析以perl kafka实现为准) kafka客户端分为生产者和消费者,生产者发送消息,消费者获取消息. 在kafka协议里客户端通信中用到的最多的四个协议命令是fetch,fetchoffset,send,metadata.这四个分别是获取消息,获取offset,发送消息,获取metadata.剩下的其他协议命令大多都是kafka server内部通信用到的.offsetcommit这个命令在有些语言的client api的实现里给出了接口可以自己提

redis的java客户端Jedis简单封装

经过我们团队的一番讨论,最终决定使用redis来进行我们的业务缓存.redis会将数据缓存到内存中,运行效率会很快.同时异步将数据写入到磁盘中,进行持久化. 且redis支持主从同步,支持分布式部署,支持N多数据结构,这对于我们有着莫大的吸引力. 参见:http://blog.csdn.net/yichenlian/article/details/27207383 我们团队讨论的焦点是在于redis的灾备恢复问题.由于redis的持久化是异步的,总会有一点时间内存中数据和磁盘数据不同步的情况(当

Erlang 编写 Kafka 客户端之最简单入门

Erlang 编写 Kafka 客户端之最简单入门 费劲周折,终于测通了 erlang 向kafka 发送消息,使用了ekaf 库,参考: An advanced but simple to use, Kafka producer written in Erlang https://github.com/helpshift/ekaf 1 准备kafka客户端 准备2台机器,一台是ekaf运行的kafka客户端(192.168.191.2),一台是kafka服务端(zookeeper+kafka)