Kafka的设计和结构
Kafka基本概念
Producer:消息和数据的生产者,向Kafka的一个Topic发布消息的进程/代码/服务
Consumer:消息和数据的消费者,订阅数据(Topic)并且处理其发布的消息的进程/代码/服务
Consumer Group:逻辑概念,对于同一个Topic,会广播给不同的group,一个group中,只有一个Consumer可以消费该消息
Broker:物理概念,Kafka集群中的每个Kafka节点
Topic:逻辑概念,Kafka消息的类别,对数据进行分区、隔离
Partition:物理概念,Kafka下数据存储的基本单元,一个Topic数据,会被分散存储到多个Partition,每一个Partition是有序的
Replication:同一个Partition可能会有多个Replica,多个Replica之间数据是一样的
Replication Leader:一个Partition的多个Replica上,需要一个Leader负责该Partition上与Producer和Consumer交互
Replica Manager:负责管理当前Broker所有分区和副本的信息,处理Kafka Controller发起的一些请求,副本状态的切换、添加/读取消息等
Kafka基本结构
- Produer Api
- Consumer Api
- Streams Api
- Connectors Api
Kafka消费架构
Kafka消息结构
Kafka应用场景
- 消息队列
- 行为跟踪
- 元信息监控
- 日志收集
- 流处理
- 事件源
- 持久性日志
下载与安装
消息事务
为什么要支持事务
- 满足“读取-处理-写入”模式
- 流处理需求的不断增强
- 不准确的数据处理的容忍度
数据传输的事务定义
- 最多一次:消息不会被重复发送,最多被传输一次,但也有可能一次不传输
- 最少一次:消息不会被漏发送,最少被传输一次,但也有可能被重复传输
- 精确的一次:不会漏传输也不会重复传输,每个消息都传输一次且仅仅被传输一次,这是大家希望的
Kafka消息事务
- 事务保证
- 内部重试问题:Procedure幂等处理
- 多分区原子写入
- 事务保证 — 避免僵尸实例
- 每个事务Producer分配一个transactional.id,在进程重新启动时能够识别相同的Producer实例
- Kafka增加了一个与transactional.id相关的epoch,存储每个transaction.id内部元数据
- 一旦epoch被触发,任何具有相同的transactional.id和更旧的epoch的Producer被视为僵尸,Kafka会拒绝来自这些Producer的后续事务性写入
零拷贝
零拷贝简介
文件传输网络的公共数据路径
- 操作系统将数据从磁盘读入到内核空间的页缓存
- 应用程序将数据从内核空间读入到用户空间缓存中
- 应用程序将数据写回到内核空间到socket缓存中
- 操作系统将数据从socket缓存区复制到网卡缓冲区,以便将数据经网络发出
零拷贝过程
- 操作系统将数据从磁盘读入到内核空间的页缓存
- 将数据的位置和长度的信息描述符增加至内核空间(socket缓冲区)
- 操作系统直接将数据从内核空间拷贝到网卡缓冲区,以便将数据经网络发出