消息中间件系列介绍-Kafka

网站建设3年前发布
61 0 0

作者 | 葛贤亮,单位:中国移动智慧家庭运营中心,近年来,互联网技术发展迅猛,各行各业的信息量急剧膨胀。随着云计算和算力网络时代的到来,消息中间件在国内许多行业的关键应用中越来越受到重视。在高并发分布式场景下,合理地利用消息中间件往往能起到突破性能瓶颈与化繁为简的效果。,前期分别从“作用”与“协议”、“传输模式”与“消费模式”对消息中间件技术做了简要的介绍。本期从消息中间件产品角度介绍主流方案的设计与实现。,Apache Kafka是一种高吞吐量、分布式、多副本、基于发布/订阅的消息系统,最初由LinkedIn公司开发,使用Scala语言编写,目前是Apache的开源项目。Kafka已成为事件流处理动态数据的事实标准。,Kafka可以轻松支持每秒百万级的写入请求,超过了大部分的消息中间件,这种特性使得Kafka在日志处理等海量数据场景得到广泛应用。,2023030613505182d678f93ce465b24cb324bebe55f52971b09a647,图1 架构设计,20230306134950a5194689807f2b398342842e98c1517f2df67a409,图2 工作流程,Kafka一般工作流程如下(根据ACK应答策略会存在部分差异):, ACK应答机制,通过配置request.required.acks属性来配置ACK策略:,Topic是同一类别的消息记录(Record)的集合。在Kafka中,一个Topic又可以被划分成多个Partition,分区数据日志文件结构如下:,202303061349505566aa524e314a7f4cd039167063ad77c0979b246,图3 Topic和数据日志-分区数据日志文件结构,每个Partition是一个有序、不可变的消息序列,新的消息只会被追加到Partition的末尾。在每个Partition中,通过offset(偏移量)标识消息。由此可见,在同一个Partition内消息是有序的,在不同Partition之间,不能保证消息被有序消费。,Kafka可以通过log.retention配置项设定消息日志在集群内的留存时间,默认为168小时(即7天)。,Partition在服务器上是以文件夹形式存在的,每个Partition文件夹内会有多组Segment文件,每组Segment文件又包含.index、.log、.timeindex三个文件,其中.log是实际存储消息日志的地方,而.index和.timeindex为索引文件,用于检索消息。,Q:为什么有了Partition还要有Segment?,Segment对应一个文件(实现上对应两个文件,一个数据文件,一个索引文件),一个Partition对应一个文件夹,一个Partition内理论上可以包含任意多个Segment。,如果不引入Segment ,所有消息日志都直接写在Partition文件内,会导致Partition文件一直增大。同时,在做data purge时,需要把文件的前面部分给删除,不符合Kafka文件的顺序写优化设计方案。引入Segment后,消息日志被分散在多个Segment中, 每次做data purge,只需要把旧的Segment整个文件删除即可,保证了每个Segment的顺序写。,Partition中的每条消息包含三个属性:offset、MessageSize、data,其中offset表示消息在这个Partition中的偏移量,offset 不是实际存储位置,而是逻辑上一个值,用来唯一标识Partition内的一条消息,相当于消息id;MessageSize表示消息内容data的大小;data为消息的具体内容。 ,Partition物理上由多个Segment文件组成,每个Segment大小相等(大致)。每个Segment数据文件以该段中最小的offset命名,文件扩展名为.log。这样在查找指定offset消息的时候,用二分查找法可以快速定位到该消息在哪个Segment数据文件中。 ,Kafka为每个Segment建立了索引文件(文件名与数据文件一致,扩展名为.index)。具体是采用稀疏索引方式,每隔一定字节的数据建立一条索引。这样做的好处是减少了索引体积,以便保留在内存中;坏处是查询时命中需要消耗更多时间(相对)。,20230306135052027403848178b931878241c43a8970cd6c6101394,图4 数据文件索引-稀疏索引,由于一个Topic可以有多个Partition,不同Partition均衡分布在不同的Broker上。基于该特性,生产者可通过随机、轮询或hash等策略,将消息平均发送至多个Broker中,实现负载均衡。,生产者在本地内存中进行消息聚合,以单次请求发送批量数据的方式,减少网络I/O操作(副作用是一定程度上会影响消息实时性,以时延换取吞吐量)。,生产者通过Snappy、Gzip、LZ4等算法对数据进行压缩传输,减少传输数据量,减轻网络压力(以CPU资源换取网络时延的降低)。,Kafka凭借其架构与性能优势,愈来愈受到众厂商的青睐。依托其完善的社区环境,Kafka构建了庞大而成熟的生态,已成为大数据及流计算领域中至关重要的一环。

© 版权声明

相关文章