分布式消息队列Kafka源码深度解析
文章平均质量分 88
travi
这个作者很懒,什么都没留下…
展开
-
Kafka源码深度解析-系列1 -消息队列的策略与语义
-Kafka关键概念介绍 -消息队列的各种策略与语义作为一个消息队列,Kafka在业界已经相当有名。相对传统的RabbitMq/ActiveMq,Kafka天生就是分布式的,支持数据的分片、复制以及集群的方便扩展。与此同时,Kafka是高可靠的、持久化的消息队列,并且这种可靠性没有以牺牲性能为前提。同时,在允许丢消息的业务场景下,Kafka可以以非ACK、异步的方式来运行,从而最大程度的提高性能。原创 2016-09-14 15:23:45 · 14678 阅读 · 5 评论 -
Kafka源码深度解析-序列7 -Consumer -coordinator协议与heartbeat实现原理
单线程的consumer在前面我们讲过,KafkaProducer是线程安全的,同时其内部还有一个Sender,开了一个后台线程,不断从队列中取消息进行发送。 而consumer,是一个纯粹的单线程程序,后面所讲的所有机制,包括coordinator,rebalance, heartbeat等,都是在这个单线程的poll函数里面完成的。也因此,在consumer的代码内部,没有锁的出现。...原创 2016-10-11 21:21:36 · 15145 阅读 · 1 评论 -
Kafka源码深度解析-序列15 -Log文件结构与flush刷盘机制
Log文件结构在前面我们反复讲topic, partition的概念,本文来分析这些不同topic、不同partition的message,在文件中,是以何种结构存储的。有兴趣朋友可以关注公众号“架构之道与术”, 获取最新文章。 或扫描如下二维码: 每个topic_partition对应一个目录假设有一个topic叫my_topic,3个partition,分别为my_topi...原创 2016-12-21 14:25:30 · 6430 阅读 · 2 评论 -
Kafka源码深度解析-序列14 -Server核心组件之3-SocketServer与NIO- 1+N+M 模型
对于任何服务器程序来讲,网络框架都是其最基础的部分。在前面我们分析了Producer端的NIO和Network框架,本篇将详细分析服务器端的Network框架。同时对比一下Kafka的1+N+M模型和Tomcat 6的1+N+M模型有什么重要区别。有兴趣朋友可以关注公众号“架构之道与术”, 获取最新文章。 或扫描如下二维码: 入口 KafkaServer让我们从main函数出发...原创 2016-11-04 16:28:53 · 2604 阅读 · 0 评论 -
Kafka源码深度解析-序列13 -Server核心组件之2(续)- TimingWheel本质与DelayedOperationPurgatory核心结构
在上一篇,分析ReplicaManager的同步原理时,提到了DelayedOperationPurgatory,这个部件完成了2个核心功能: 1个是check DelayedProduce的complete条件,如果条件满足(也就是所有replica同步消息完成),则调用DelayedOperation的onComplete函数; 另1个就是实现“超时”机制。本篇将详细分析其内部结构。Dela原创 2016-10-30 13:29:24 · 3294 阅读 · 1 评论 -
Kafka源码深度解析-序列12 -Server核心组件之2-ReplicaManager核心数据结构与Replica同步原理
在上1篇,我们介绍了kafka server的1个核心组件Controller,今天我们介绍第2个核心组件ReplicaManager。ReplicaManager主要功能是完成消息从leader到其它followers的同步。ReplicaManager核心数据结构假如有1堆的broker: b0, b1, b2, b3, … 当前结点为b2; b2有3个partition: t0p0,原创 2016-10-26 22:17:37 · 2475 阅读 · 1 评论 -
Kafka源码深度解析-序列11 -Server核心组件之1-KafkaController选举过程/Failover与Resignation
在上1篇我们提到整个Kafka集群有一个“中央控制器“-Controller,这个Controller从所有brokers中选举出来,当Controller挂了之后,其它brokers再次竞选出新的Controller,本篇将详细介绍这个过程。基本原理整个选举过程是通过zk上的一个临时节点来实现的:/controller节点,其data结构为:核心信息就是记录当前的controller的broker原创 2016-10-26 14:27:31 · 3940 阅读 · 2 评论 -
Kafka源码深度解析-序列10 -Server入门-Zookeeper与集群管理原理
从本篇开始,我们进入服务器端的源码分析。在正式进入服务器源码分析之前,需要先从宏观上对Kafka的集群管理有一个基本了解。在序列1里面,我们画了Kafka集群的物理架构图,知道所有的broker启动之后,都会连接到Zookeeper上面。那具体来讲,Zookeeper要帮助Kafka完成什么工作呢?集群管理的思路broker的“生“与“死“任何时候,当集群中有1个新的broker加入,或者某个旧的b原创 2016-10-20 14:27:32 · 3113 阅读 · 0 评论 -
Kafka源码深度解析-序列9 -Consumer -SubscriptionState内部结构分析
在前面讲了,KafkaConsumer的一个重要部件就是SubscriptionState,这个部件维护了Consumer的消费状态,本篇对其内部结构进行分析。2个offset在前面我们讲了,一个TopicPartition其实有2个offset,一个是当前要消费的offset(poll的时候),一个是消费确认过的offset。public class SubscriptionState {原创 2016-10-13 14:04:01 · 3358 阅读 · 0 评论 -
Kafka源码深度解析-序列8 -Consumer -Fetcher实现原理与offset确认机制
在进一步介绍之前,我们先通过KafkaConsumer的构造函数,看一下其核心部件: Fetcher, SubscriptionState, ConsumerCoordinator原创 2016-10-12 13:57:25 · 6280 阅读 · 0 评论 -
Kafka源码深度解析-序列5 -Producer -RecordAccumulator队列分析
在Kafka源码分析-序列2中,我们提到了整个Producer client的架构图,如下所示:其它几个组件我们在前面都讲过了,今天讲述最后一个组件RecordAccumulator.Batch发送在以前的kafka client中,每条消息称为 “Message”,而在Java版client中,称之为”Record”,同时又因为有批量发送累积功能,所以称之为RecordAccumulator.Re原创 2016-09-29 18:21:44 · 5072 阅读 · 0 评论 -
Kafka源码深度解析-序列6 -Consumer -消费策略分析
从这一篇开始,我们将进入Consumer的分析。同Producer一样, Consumer也分旧的scala版和新的Java版,在此我们只分析新的Java版。有兴趣朋友可以关注公众号“架构之道与术”, 获取最新文章。 或扫描如下二维码: 在分析之前,我们先看一下, Consumer的基本用法: Properties props = new Properties(); ...原创 2016-09-25 17:19:40 · 15660 阅读 · 5 评论 -
Kafka源码深度解析-序列4 -Producer -network层核心原理
在上一篇我们分析了Java NIO的原理和使用方式,本篇将进一步分析Kafka client是如何基于NIO构建自己的network层。network层的分层架构下图展示了从最上层的KafkaProducer到最底层的Java NIO的构建层次关系: 图中淡紫色的方框表示接口或者抽象类,白色方框是具体实现。整个架构图也体现了“面向接口编程”的思想:最底层Java NIO往上层全部以接口形式暴露,上原创 2016-09-24 17:19:04 · 10042 阅读 · 6 评论 -
Kafka源码深度解析-序列2 -Producer -Metadata的数据结构与读取、更新策略
在上一篇,我们从使用方式和策略上,对消息队列做了一个宏观描述。从本篇开始,我们将深入到源码内部,仔细分析Kafka到底是如何实现一个分布式消息队列。我们的分析将从Producer端开始。从Kafka 0.8.2开始,发布了一套新的Java版的client api, KafkaProducer/KafkaConsumer,替代之前的scala版的api。本系列的分析将只针对这套Java版的api。原创 2016-09-22 14:09:50 · 19166 阅读 · 9 评论 -
Kafka源码深度解析-序列3 -Producer -Java NIO
在上一篇我们分析了Metadata的更新机制,其中涉及到一个问题,就是Sender如何跟服务器通信,也就是网络层。同很多Java项目一样,Kafka client的网络层也是用的Java NIO,然后在上面做了一层封装。下面首先看一下,在Sender和服务器之间的部分: 可以看到,Kafka client基于Java NIO封装了一个网络层,这个网络层最上层的接口是KakfaClient。其层次关系原创 2016-09-23 11:59:31 · 8686 阅读 · 2 评论