Kafka 消费线程模型在中通消息服务运维平台的应用

简介: Kafka 的消费类 KafkaConsumer 是非线程安全的,意味着无法在多个线程中共享 KafkaConsumer 对象,因此创建 Kafka 消费对象时,需要用户自行实现消费线程模型

最近有些朋友问到 Kafka 消费者消费相关的问题,如下:


640.png


以上问题看出来这位朋友刚接触 Kafka,我们都知道 Kafka 相对 RocketMQ 来说,消费端是非常 “原生” 的,不像 RocketMQ 将消费线程模型都封装好,用户不用关注内部消费细节。


Kafka 的消费类 KafkaConsumer 是非线程安全的,意味着无法在多个线程中共享 KafkaConsumer 对象,因此创建 Kafka 消费对象时,需要用户自行实现消费线程模型,常见的消费线程模型如下:


1、每个线程维护一个 KafkaConsumer

640.png


从消费消费模型可看出每个 KafkaConsumer 会负责固定的分区,因此无法提升单个分区的消费能力,如果一个主题分区数量很多,只能通过增加 KafkaConsumer 实例提高消费能力,这样一来线程数量过多,导致项目 Socket 连接开销巨大。


2、单 KafkaConsumer 实例 + 多 worker 线程

640.png


当 KafkaConsumer 实例与消息消费逻辑解耦后,我们不需要创建多个 KafkaConsumer 实例就可进行多线程消费,还可根据消费的负载情况动态调整 worker 线程,具有很强的独立扩展性,在公司内部使用的多线程消费模型就是用的单 KafkaConsumer 实例 + 多 worker 线程模型。


中通消息服务运维平台(ZMS)使用的 Kafka 消费线程模型是第二种:单 KafkaConsumer 实例 + 多 worker 线程。


以下我们来分析 ZMS 是如何实现单 KafkaConsumer 实例 + 多 worker 线程的消费线程模型的。


com.zto.consumer.KafkaConsumerProxy#addUserDefinedProperties

640.png


KafkaConsumerProxy 对 KafkaConsumer 进行了一层封装处理,是 ZMS 对外提供的 Kafka 消费对象,在创建一个 KafkaConsumerProxy 对象时,会进行以上属性赋值的具体操作,其中会根据用户配置进行消费线程的设置,从图中可看出,是否顺序消费对创建的线程池也是不一样的,ZMS 为什么会这么做呢?


单 KafkaConsumer 实例 + 多 worker 线程消费线程模型,由于消费逻辑是利用多线程进行消费的,因此并不能保证其消息的消费顺序,如果我们需要在 Kafka 中实现顺序消费,那么需要保证同一类消息放入同一个线程当中,我用如下图表示:

640.png


但需要注意的是,以上仅仅是保证正常情况下能够实现顺序消费,如果期间出现重平衡等异常情况,就会导致消费顺序被打乱,不过本身像 RocketMQ 一样是不能保证严格的顺序消费,对于能容忍消息短暂乱序的业务来说,这是一个不错的实现方式。


com.zto.consumer.KafkaConsumerProxy#register

640.png


以上,ZMS 每注册一个 KafkaConsumerProxy,都会使用新的线程去处消费 KafkaConsumer,前面也说过了 KafkaConsumer 是非线程安全的。


com.zto.consumer.KafkaConsumerProxy#submitRecords

640.png


以上是 ZMS 实现多线程消费逻辑的核心,ZMS 会对用消息分区和线程池列表缓存进行取模,从而使得相同分区的消息会被分配到相同线程池中执行,对于顺序消费来说至关重要,前面我也说了,当用户配置了顺序消费时,每个线程池只会分配一个线程,如果相同分区的消息分配到同一个线程池中执行,也就意味着相同分区的消息会串行执行,实现消息消费的顺序性。


以上就是 ZMS Kafka 消费线程模型的简单分析。

最后附上 ZMS 的 GitHub 地址:

https://github.com/ZTO-Express/zms

欢迎大家提出宝贵意见。


相关文章
|
7天前
|
机器学习/深度学习 弹性计算 运维
智能化运维的浪潮之巅:机器学习在IT管理中的应用与挑战
本文将深入探讨机器学习技术如何革新传统的IT运维模式,通过实际案例分析其在故障预测、自动化处理以及安全防护等方面的应用成效,并讨论实施过程中可能遇到的技术与管理挑战。
|
1天前
|
消息中间件 安全 数据处理
Python中的并发编程:理解多线程与多进程的区别与应用
在Python编程中,理解并发编程是提高程序性能和响应速度的关键。本文将深入探讨多线程和多进程的区别、适用场景及实际应用,帮助开发者更好地利用Python进行并发编程。
|
3天前
|
机器学习/深度学习 数据采集 人工智能
智能化运维:AI在系统管理中的应用与挑战
本文将深入探讨人工智能(AI)技术在运维领域的应用,分析其带来的效率提升和成本节约,同时指出实施过程中可能遇到的技术和管理挑战。文章还将提供针对这些挑战的应对策略,以期为运维专业人士提供指导和参考。
|
3天前
|
机器学习/深度学习 数据采集 运维
智能化运维:机器学习在系统监控中的应用
随着信息技术的飞速发展,传统的运维管理方法已难以应对日益增长的系统复杂性。本文将探讨如何利用机器学习技术优化运维流程,实现智能化系统监控,提升效率与准确性。通过分析机器学习在预测性维护、异常检测和自动化响应等方面的应用案例,揭示数据驱动的运维新模式对提升系统稳定性和性能的重要性。
|
7天前
|
数据处理 调度 Python
Python并发编程实战指南:深入理解线程(threading)与进程(multiprocessing)的奥秘,打造高效并发应用!
【7月更文挑战第8天】Python并发编程探索:使用`threading`模块创建线程处理任务,虽受限于GIL,适合I/O密集型工作。而`multiprocessing`模块通过进程实现多核利用,适用于CPU密集型任务。通过实例展示了线程和进程的创建与同步,强调了根据任务类型选择合适并发模型的重要性。
|
5天前
|
机器学习/深度学习 人工智能 运维
智能化运维:AI与机器学习在IT管理中的应用
【7月更文挑战第10天】本文深入探讨了人工智能和机器学习如何革新传统的IT运维领域。文章首先界定了智能化运维的概念,随后分析了AI技术在故障预测、自动化处理和安全监控方面的应用实例,并讨论了实施智能化运维时面临的挑战及其克服策略。最终,文章展望了智能化运维的未来趋势,强调了持续学习和适应新技术的重要性。
|
7天前
|
机器学习/深度学习 运维 监控
智能化运维:机器学习在IT基础设施管理中的应用与挑战
本文深入探讨了智能化运维领域,特别是机器学习技术在IT基础设施管理中的运用。文章首先概述了智能化运维的概念及其对现代企业的重要性,随后详细分析了机器学习如何优化故障预测、自动化任务处理和安全监控等关键运维活动。通过引用最新的行业案例和统计数据,本文揭示了机器学习技术带来的效率提升和成本节约。同时,文章也未回避讨论实施智能化运维时可能遇到的技术挑战和伦理问题,为读者提供了一份全面而深入的分析报告。
|
6天前
|
存储 运维 监控
容器化技术在现代运维中的应用与挑战
【7月更文挑战第9天】在数字化转型的浪潮中,容器化技术以其轻量级、可移植和易于管理的特性成为DevOps实践的重要工具。本文深入探讨了容器化技术如何革新现代运维工作,同时指出实施过程中可能遇到的挑战,包括安全性问题、存储限制和网络配置复杂性等,旨在为运维团队提供应对策略。
|
3天前
|
机器学习/深度学习 运维 监控
智能化运维:机器学习在故障预测和自动化修复中的应用
随着信息技术的迅猛发展,企业对运维工作的效率和准确性要求越来越高。传统的运维模式已难以应对日益复杂的系统环境和数据量。本文将探讨如何利用机器学习技术提升运维工作的智能化水平,实现故障的早期预测和自动化修复,从而减少系统停机时间,提高企业运营效率。通过分析机器学习在运维领域的应用实例,揭示其在实际工作中的有效性和潜力。
14 0
|
5天前
|
设计模式 存储 缓存
Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
8 0