文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

消息中间件系列介绍-Kafka

2024-12-01 13:14

关注

​Labs 导读

近年来,互联网技术发展迅猛,各行各业的信息量急剧膨胀。随着云计算和算力网络时代的到来,消息中间件在国内许多行业的关键应用中越来越受到重视。在高并发分布式场景下,合理地利用消息中间件往往能起到突破性能瓶颈与化繁为简的效果。

前期分别从“作用”与“协议”、“传输模式”与“消费模式”对消息中间件技术做了简要的介绍。本期从消息中间件产品角度介绍主流方案的设计与实现。

1、概念介绍

Apache Kafka是一种高吞吐量、分布式、多副本、基于发布/订阅的消息系统,最初由LinkedIn公司开发,使用Scala语言编写,目前是Apache的开源项目。Kafka已成为事件流处理动态数据的事实标准。

1.1 主要特性

1.2 Kafka优点

1.3 Kafka缺点

1.4 主要应用场景

1.5 Kafka为什么这么快?

Kafka可以轻松支持每秒百万级的写入请求,超过了大部分的消息中间件,这种特性使得Kafka在日志处理等海量数据场景得到广泛应用。

2、架构设计

图1 架构设计

3、核心概念

4、工作流程

图2 工作流程

Kafka一般工作流程如下(根据ACK应答策略会存在部分差异):

👇 ACK应答机制

通过配置request.required.acks属性来配置ACK策略:

5、Kafka数据存储设计

5.1 Topic和数据日志

Topic是同一类别的消息记录(Record)的集合。在Kafka中,一个Topic又可以被划分成多个Partition,分区数据日志文件结构如下:

图3 Topic和数据日志-分区数据日志文件结构

每个Partition是一个有序、不可变的消息序列,新的消息只会被追加到Partition的末尾。在每个Partition中,通过offset(偏移量)标识消息。由此可见,在同一个Partition内消息是有序的,在不同Partition之间,不能保证消息被有序消费。

Kafka可以通过log.retention配置项设定消息日志在集群内的留存时间,默认为168小时(即7天)。

5.2 Partition结构

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的顺序写。

5.3 Partition的数据文件(offset、MessageSize、data)

Partition中的每条消息包含三个属性:offset、MessageSize、data,其中offset表示消息在这个Partition中的偏移量,offset 不是实际存储位置,而是逻辑上一个值,用来唯一标识Partition内的一条消息,相当于消息id;MessageSize表示消息内容data的大小;data为消息的具体内容。 

5.4 数据文件分段Segment(顺序读写、分段命令、二分查找)

Partition物理上由多个Segment文件组成,每个Segment大小相等(大致)。每个Segment数据文件以该段中最小的offset命名,文件扩展名为.log。这样在查找指定offset消息的时候,用二分查找法可以快速定位到该消息在哪个Segment数据文件中。 

5.5 数据文件索引(分段索引、稀疏存储)

Kafka为每个Segment建立了索引文件(文件名与数据文件一致,扩展名为.index)。具体是采用稀疏索引方式,每隔一定字节的数据建立一条索引。这样做的好处是减少了索引体积,以便保留在内存中;坏处是查询时命中需要消耗更多时间(相对)。

图4 数据文件索引-稀疏索引

6、生产者&消费者设计

6.1 负载均衡(Partition会均衡分布到不同Broker上) 

由于一个Topic可以有多个Partition,不同Partition均衡分布在不同的Broker上。基于该特性,生产者可通过随机、轮询或hash等策略,将消息平均发送至多个Broker中,实现负载均衡。

6.2 批量发送

生产者在本地内存中进行消息聚合,以单次请求发送批量数据的方式,减少网络I/O操作(副作用是一定程度上会影响消息实时性,以时延换取吞吐量)。

6.3 压缩(Snappy、Gzip、LZ4)

生产者通过Snappy、Gzip、LZ4等算法对数据进行压缩传输,减少传输数据量,减轻网络压力(以CPU资源换取网络时延的降低)。

7、总结

Kafka凭借其架构与性能优势,愈来愈受到众厂商的青睐。依托其完善的社区环境,Kafka构建了庞大而成熟的生态,已成为大数据及流计算领域中至关重要的一环。

来源:移动Labs内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯