QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

让 Kafka 支持队列功能:KIP-932 和 KMQ

作者:Rafal Gancarz

  • 2024-08-06
    北京
  • 本文字数:1437 字

    阅读完需:约 5 分钟

让 Kafka 支持队列功能:KIP-932和KMQ

Apache Kafka 社区正在积极推动一项名为 KIP-932(Kafka Improvement Proposal,KIP)的工作,目的是为这一广受欢迎的消息传递平台引入类似队列的功能。该提案引入共享群组的概念,用于实现协作式消息消费。与此同时,SoftwareMill 提供了一种替代解决方案,能够与现有的消费者群组机制无缝集成。


Apache Kafka 多年来一直是消息传递解决方案的行业标杆,这主要得益于其卓越的性能和可靠的持久消息传递能力。Kafka 的设计哲学是通过减少通信开销和数据转换来实现高吞吐量。然而,这种高性能以牺牲一定的灵活性为代价,不支持某些处理用例,例如个别消息的传递确认。


Apache Kafka 采用消费者群组来实现消息消费,将主题分区独占分配给消费者组中的消费者,并对分区偏移量进行跟踪。这种设计可能会引发队列头部阻塞问题,即单个消息处理缓慢或阻塞可能会影响甚至导致整个消费者应用程序挂起。此外,消息处理的并行度受限于分区数量,因此在创建分区之初必须仔细规划分区的数量,以确保能满足所需的吞吐量。



Apache Kafka 中的共享群组


KIP-932: Queues For Kafka 提案提出了一种创新方法,通过引入共享群组的概念来实现协作式消息消费。共享群组使用了不一样的分区分配策略,其特点是分配不是独占的,打破了消费者数量受分区数量的限制。它还简化并缩短了再均衡过程,并避免了在再均衡期间发生的“停止世界”现象。


此外,共享组允许消费者独立处理并确认消息,Kafka 能够更细粒度地跟踪消息的消费情况。当消费者请求消息时,Kafka 共享分区会返回一批标记为已获取的消息。这些消息会保持这一状态,直到消费者确认或达到处理时间限制。如果处理时间限制被触发,这些消息将重新变为可用状态。


Kafka 还负责跟踪消息的传递尝试次数,并在尝试次数超过阈值时将消息标记为已拒绝。目前,死信队列(Dead Letter Queue,DLQ)功能还不能用来捕获未传递的消息,但未来可能会加入这一特性。Kafka 代理负责维护并持久化所有内部状态,并通过单独的内部主题来跟踪个体消息的传递情况。共享群组功能计划在 Kafka 4.0 中推出。


对于那些想要立即体验新功能而不愿等待 KIP-932 在 Kafka 4.0 中发布的人来说,SoftwareMill 提供了一个可行的替代方案。SoftwareMill 首席研发官 Adam Warski 介绍了该解决方案:


KMQ 是一种利用 Kafka 消费者群组功能实现个别消息确认的模式,可以与任意 Kafka 版本一起运行。你可能会发现 KMQ 与共享群组的设计有一些相似之处。KMQ 在实现和部署方面要简单得多,这也意味着它只解决了消费者组的一些局限性。KMQ 完全是一种消费者端机制,与共享群组代理端的复杂逻辑不同。


KMQ 引入了一个额外的组件,即重新传递跟踪器,负责将消息标记为已交付和确认。这一机制类似于共享群组,只是操作发生在应用程序端。跟踪器利用了一个专门的“标记”主题和一个单独的消费者群组,当消息处理超过预定时间,这些消息会被重新发布回正在跟踪的主题。如果重新传递计数器(这是个体消息内部状态的一部分)超过配置的阈值,消息将被发布到 死信队列(DLQ) 主题。



KMQ 的模式设计


由于 KMQ 解决方案需要将标记发布到专门的主题,引入了一定的额外延迟,但该项目团队的性能基准测试表明,该方案能够实现与传统消费者群组相当的吞吐量。KMQ 模式的主要好处是它支持在当前可用的 Kafka 客户端版本中对每条消息进行单独确认,同时还能提供高性能的处理能力。然而,该模式并没有解决队列头部阻塞问题,并且并行度仍然受到分区数量的限制。


原文链接

https://www.infoq.com/news/2024/07/apache-kafka-queues/

2024-08-06 08:005814

评论

发布
暂无评论
发现更多内容

爱了! Alibaba技术官甩出的“阿里内部Java成长笔记”,技术人成长的标杆!

Java架构之路

Java 程序员 架构 面试 编程语言

GitHub连夜封杀!这份阿里 10W 字内部 Java 字面试手册到底有多强?

Java 程序员 架构 面试

备战 60 天,成功上岸滴滴后,我特地把金三银四备战资源库整理出来了

Java 程序员 架构 面试

阿里P7简历上都有哪些可以拿得出手的项目?

Java架构师迁哥

一周信创舆情观察(5.17~5.23)

统小信uos

外包CRUD3年,被导师一句话点醒,直接涨薪9K(Java岗)

Java架构师迁哥

大厂面试内幕:阿里内部整理出的5000页Java面试复盘指南,起飞

Java架构追梦

Java 架构 面试

吐血总结 | Java并发编程 72 变

Java架构师迁哥

助力秋招第三弹:Java集合框架体系详细梳理

北游学Java

Java 面试 框架 秋招

Alibaba面试官:“这该死的程序员,技术竟如此深厚!”

Java架构之路

Java 程序员 架构 面试 编程语言

CompletableFuture 简单与链式的区别?

李尚智

Spring Boot Devtools Restarter 原理

sN0wpeak

Java spring

DWF低代码开发技术及其在数字化运营和运维平台建设中的应用

云智慧AIOps社区

低代码 智能运维

ThingJS粒子特效一键实现雨雪效果

ThingJS数字孪生引擎

可视化 场景应用 3D可视化 数字孪生

扫盲篇-什么是分布式任务调度

敏捷调度TASKCTL

大数据 分布式 分布式锁 分布式任务调度 zookeeper分布式锁

微服务注册中心:Consul——服务注册

程序员架构进阶

微服务 Consul API网关 28天写作 5月日更

C++ 协程的近况、设计与实现中的细节和决策

Linux服务器开发

c++ 线程 后端 协程 Linux服务器开发

区块链如何赋能企业数字化转型?

CECBC

国家工业信息安全发展研究中心与华为联合发布《数据安全白皮书》

DT极客

人生算法:做好自己这家公司的CEO

石云升

读书笔记 思维模型 5月日更

GitHub上标星75k+超牛的《Java面试突击版》,分享PDF离线版

Java 程序员 架构 面试

关于echarts使用geo制作地图tooltip不显示问题

孤独的西北疯

发布引发的curator报错:instance must be started before calling this method

林一

dubbo zk 优雅停机

Dubbo 服务治理简介

青年IT男

dubbo

阿里开源:历年亿级活动高并发系统设计场景总结

Java架构师迁哥

学到了,用138个案例讲明白了Spring全家桶+Docker+MQ

Java架构师迁哥

阿里人是如何设计系统抵挡亿级流量冲击的?(全彩版小册开源)

Java架构师迁哥

高德地图只显示一个省的地图

孤独的西北疯

CCF C³-04@百度丨“AI+开源”的昨天今天和明天

百度大脑

百度 AI

一个月吃透这份阿里高级专家的《Java500道面试手册》成功拿下了腾讯offer!

Java架构之路

Java 程序员 架构 面试 编程语言

中国数字人民币官方宣传片来袭!DCEP:开启“无现金新时代”!

CECBC

让 Kafka 支持队列功能:KIP-932和KMQ_后端_InfoQ精选文章