前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一种解决消费海量Kafka Topic时数据倾斜的方案

一种解决消费海量Kafka Topic时数据倾斜的方案

原创
作者头像
烟村
发布2022-01-08 12:47:55
2.4K0
发布2022-01-08 12:47:55
举报

1 背景

业务上遇到了这样一个场景:

1. 需要同时从多个Kafka实例里消费数以百万计的Topic

2. 每个Topic的写流量差异很大,有的几百MB/s,有的几B/min

3. 每个分区的写流量最大 5MB/s

原来的解决方案的:

1. 用多个消费服务实例

2. 每个实例上为每个Topic起一个Kafka消费者

这个方案的问题是:

1. Kafka连接数不足:一个消费服务实例上会为所有Topic创建消费者,随着消费服务实例数量的增加,kafka连接数将成倍增加

2. 数据倾斜问题:所有分区被随机分配到消费服务实例上,无法保证各个消费服务实例上所有分区的写流量相同;经常会发生,某个实例上分区的写流量过大,机器负载极高,消费堆积

这个方案的优点是:

1. 可靠性高:所有消费服务实例上都有每个Topic的消费者,挂掉几个实例,分区会被转移到其他消费者上,消费不会受到影响

2. 简单

2 分布式消费任务协调

2.1 消费服务启动

DB里有一个表,用来维护Topic的元数据,例如分区数。

消费服务启动时从DB里随机选一行,作为起点,为Topic创建消费者,创建后把消费者数据量写入到Redis里;如果消费者数量 > 分区数+1则不再创建消费者。

冗余两个消费者既保证了可靠性,又不至于让kafka连接数过多

2.2 消费服务实例负载过高时抛出任务

1. cpu、mem有一个过高,找一个流量中等的topic,抛到Redis上

2. 抛出前,负载要持续超限一段时间(5min),防止topic频繁移动

3. 轮询(10s )check抛到es上的topic是否被取走,若取走,close本机上的consumer

4. 如果一个高负载实例持续抛出topic失败,说明全局负载过高,则告警,收到告警后扩容

2.3 消费服务实例负载较低时领取任务

1. 从Redis上领取任务,开启消费者

2.4 兜底策略

1. 消费服务定时上报消费的Topic到Redis

2. 消费服务定时检查是否所有的Topic都被消费,对于没有消费的Topic启动消费

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 背景
    • 业务上遇到了这样一个场景:
      • 原来的解决方案的:
        • 这个方案的问题是:
          • 这个方案的优点是:
          • 2 分布式消费任务协调
            • 2.1 消费服务启动
              • 2.2 消费服务实例负载过高时抛出任务
                • 2.3 消费服务实例负载较低时领取任务
                相关产品与服务
                消息队列 CKafka 版
                消息队列 CKafka 版(TDMQ for CKafka)是一个分布式、高吞吐量、高可扩展性的消息系统,100%兼容开源 Kafka API 2.4、2.8、3.2 版本。CKafka 基于发布/订阅模式,通过消息解耦,使生产者和消费者异步交互,无需彼此等待。CKafka 具有高可用、数据压缩、同时支持离线和实时数据处理等优点,适用于日志压缩收集、监控数据聚合、流式数据集成等场景。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档