01 · Core Concepts
01 · Core Concepts 目标:理解 Kafka 的四个核心抽象及其关系,能画出消息从 produce 到 consume 的完整路径 核心概念TopicTopic 是逻辑概念,是消息的命名分类单位(如 order-events、user-clicks)。Topic 本身不存储数据,真正存储数据的是 partition。 PartitionPartition 是物理存储单元。每个 partition 在磁盘上是一个目录,目录下包含多个 segment 文件(.log、.index、.timeindex)。Kafka 按大小或时间把数据切割成多个 segment,避免单个文件无限增长。 Partition 解决两个问题: 并行度:多个 partition 分布在不同 broker 上,读写可以同时进行,吞吐量线性扩展。消费端同理,N 个 partition 最多支持 N 个消费者并行消费。 水平扩展:partition 是 Kafka 的最小分布单元,不同 partition 可以在不同 broker 上,单个 topic 的数据量不受单台机器限制。 注意:pa...
02 · 日志抽象与 Push vs Pull
02 · 日志抽象与 Push vs Pull 目标:理解 Kafka 的存储基础——日志抽象,以及消费模型选择 Pull 的设计动机 核心概念一、什么是日志日志是最简单的存储抽象:只追加、全局有序、按时间排列的记录序列。 每条记录追加到末尾,每条记录被分配一个唯一的单调递增序号。这个序号定义了一种”时间”概念——序号小的记录比序号大的旧。 关键性质:这种”时间”与物理时钟无关。 在分布式系统里,不同机器的物理时钟不同步,即使同步了,同一毫秒内发生的两件事也无法用物理时间判断先后。日志序号解决的是全局定序问题——整个系统里所有事件有一个统一的、无歧义的顺序。这是 Kafka 能作为”事件的单一来源”的基础。 注意区分两种”日志”: 应用日志(log4j、syslog):给人读的非结构化文本 数据日志(Kafka partition):给程序读的结构化序列,是这里讨论的概念 二、只追加带来的三个好处1. 顺序写性能极高 磁盘随机写慢,顺序写可以接近内存速度。日志只追加意味着所有写入都是顺序的,Kafka 因此能在普通机械硬盘上达到很高的吞吐量。 2. 消息不因消费而删除,...
04 · Producer:幂等写入、事务、Exactly-Once
04 · Producer:幂等写入、事务、Exactly-Once 目标:理解 Kafka Producer 如何从 at-least-once 走向 exactly-once,以及幂等和事务的实现机制 核心概念一、问题来源:at-least-once 的重复写入Kafka 默认是 at-least-once:消息不会丢,但可能重复。重复的来源是网络不确定性: 12345Producer 发送消息→ Broker 写入成功→ 网络故障,Producer 没收到确认→ Producer 以为失败,重试→ Broker 收到重复消息,再次写入 Producer 无法区分”broker 没收到”和”broker 收到了但确认没回来”,即使 acks=all 也存在这个问题。 二、幂等 Producer:解决单 Partition 的重复写入开启方式:enable.idempotence=true(Kafka 3.0 之后默认开启) 实现机制:PID + Sequence Number 每个 Producer 启动时被分配唯一的 Producer ID(PID) 每...
03 · Replication / ISR / Leader Election
03 · Replication / ISR / Leader Election 目标:理解 Kafka 如何通过副本机制保证数据不丢,以及 ISR、Leader Election、acks 的设计取舍 核心概念一、为什么需要副本单台 broker 随时可能挂掉。如果 partition 只存在一台 broker 上,broker 挂了数据就永远丢了。 解决方案是副本(Replica):每个 partition 在多台 broker 上各存一份。副本数量由 replication factor 控制,比如 replication factor = 3,意味着这个 partition 在 3 台不同的 broker 上各有一份完整数据。 二、Leader 和 Follower多个副本里,有且只有一个是 Leader,其余是 Follower。 Leader:负责所有读写请求。Producer 写给 Leader,Consumer 也从 Leader 读。 Follower:唯一职责是从 Leader 同步数据,保持冗余备份,不直接服务读写请求。...
Kafka 学习主干道
Kafka 学习主干道核心抽象Kafka 是一个持久化的分布式日志系统,所有设计围绕一个核心约束展开: 消息是不可变的、有序的、可重放的日志,消费者通过 offset 自主控制读取位置 从这个约束出发,可以推导出它的所有设计决策: 抽象 一句话 Topic / Partition 日志的逻辑分组与物理分片,分片是并发和扩展的基本单位 Offset 消费者在分区日志中的位置指针,由消费者自己管理 Consumer Group 一组消费者共同消费一个 topic,每个分区只被组内一个消费者消费 Replication / ISR 分区副本机制,ISR 决定谁有资格成为 leader Producer Acks 生产者对”写入成功”的定义,决定可靠性与延迟的取舍 Log Segment 分区在磁盘上的物理存储单元,append-only,支持顺序写 主干道节点 # 文件 一句话 状态 1 01-core-concepts.md Topic / Partition / Offset / ...
算法刷题目录
array 121.买卖股票的最佳时机 215.数组中的第k个最大元素 54.螺旋矩阵 56.合并区间 560.和为-k-的子数组 88.合并两个有序数组 912.排序数组 bfs 102.二叉树的层序遍历 103.二叉树的锯齿形层序遍历 binary_search 34.在排序数组中查找元素的第一个和最后一个位置 4.寻找两个正序数组的中位数 69.x-的平方根 dfs 200.岛屿数量 22.括号生成 39.组合总和 40.组合总和-ii 46.全排列 695.岛屿的最大面积 79.单词搜索 dp 1143.最长公共子序列 122.买卖股票的最佳时机-ii 152.乘积最大子数组 198.打家劫舍 300.最长递增子序列 322.零钱兑换(递归) 322.零钱兑换(递推) 416.分割等和子集 516.最长回文子序列 53.最大子数组和 64.最小路径和(递归) 64.最小路径和(递推) 70.爬楼梯 72.编辑距离(递归) 72.编辑距离(递推) graph 207.课程表 linkedlist 141.环形链表 143.重排链表 148.排序链表 160.相交...
进程树
进程树 返回综述: 进程管理 进程树的数据结构在 task_struct 中, 通过以下字段构成一棵多叉双向树: 12345678struct task_struct __rcu *real_parent; // 生物学父进程: 谁fork了我struct task_struct __rcu *parent; // 法律上的父进程: 谁来wait我、收我的SIGCHLD// 通常 real_parent == parent, 仅在 ptrace 调试时不同struct list_head children; // 作为父进程时: 子进程链表的哨兵头(入口)struct list_head sibling; // 作为子进程时: 挂在父进程children链表上的节点struct task_struct *group_leader; // 线程组的主线程(和进程树无关, 是线程组维度的字段) parent 和 real_parent, 为什么要有两个 parent?这个场景主要是为了应对 debug 即 ptrace 场景, 在不使用调试器的时候, 两者指向的都是父进...
进程树
进程树 返回综述: 进程管理 进程树的数据结构在 task_struct 中, 通过以下字段构成一棵多叉双向树: 12345678struct task_struct __rcu *real_parent; // 生物学父进程: 谁fork了我struct task_struct __rcu *parent; // 法律上的父进程: 谁来wait我、收我的SIGCHLD// 通常 real_parent == parent, 仅在 ptrace 调试时不同struct list_head children; // 作为父进程时: 子进程链表的哨兵头(入口)struct list_head sibling; // 作为子进程时: 挂在父进程children链表上的节点struct task_struct *group_leader; // 线程组的主线程(和进程树无关, 是线程组维度的字段) parent 和 real_parent, 为什么要有两个 parent?这个场景主要是为了应对 debug 即 ptrace 场景, 在不使用调试器的时候, 两者指向的都是父进...
进程管理
进程管理进程数据结构进程的数据结构是task struct cpu资源: 调度优先级 内存地址空间资源: mm_struct 打开的文件资源: file_struct files (一个数组, 存的就是打开的文件的地址, 索引即是文件描符 fd) 进程自己的信息与状态 进程状态: 存储在task->state, task->exit_state两个字段中 如TASK_RUNNING, TASK_INTERRUPTIBLE, TASK_UNINTERRUPTIBLE, __TASK_STOPED… 唯一ID pid: 线程级别的id gtid: 进程级别的id 文件系统信息 struct fs_struct *fs namespace 进程树关系: 该进程在整个进程树里面的位置 进程的状态123456789101112131415161718/* Used in tsk->state: */#define TASK_RUNNING 0x00000000#define TASK_INTERRUPTIBLE ...
进程管理
进程管理进程数据结构进程的数据结构是task struct cpu资源: 调度优先级 内存地址空间资源: mm_struct 打开的文件资源: file_struct files (一个数组, 存的就是打开的文件的地址, 索引即是文件描符 fd) 进程自己的信息与状态 进程状态: 存储在task->state, task->exit_state两个字段中 如TASK_RUNNING, TASK_INTERRUPTIBLE, TASK_UNINTERRUPTIBLE, __TASK_STOPED… 唯一ID pid: 线程级别的id gtid: 进程级别的id 文件系统信息 struct fs_struct *fs namespace 进程树关系: 该进程在整个进程树里面的位置 进程的状态123456789101112131415161718/* Used in tsk->state: */#define TASK_RUNNING 0x00000000#define TASK_INTERRUPTIBLE ...
