0%

Kafka初探

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

KafkaBaseStruct

Kafka消费架构

KafkaConsumeStruct

Kafka消息结构

MessageStruct

Kafka应用场景

  • 消息队列
  • 行为跟踪
  • 元信息监控
  • 日志收集
  • 流处理
  • 事件源
  • 持久性日志

下载与安装

消息事务

为什么要支持事务

  • 满足“读取-处理-写入”模式
  • 流处理需求的不断增强
  • 不准确的数据处理的容忍度

数据传输的事务定义

  • 最多一次:消息不会被重复发送,最多被传输一次,但也有可能一次不传输
  • 最少一次:消息不会被漏发送,最少被传输一次,但也有可能被重复传输
  • 精确的一次:不会漏传输也不会重复传输,每个消息都传输一次且仅仅被传输一次,这是大家希望的

Kafka消息事务

  • 事务保证
    • 内部重试问题:Procedure幂等处理
    • 多分区原子写入
  • 事务保证 — 避免僵尸实例
    • 每个事务Producer分配一个transactional.id,在进程重新启动时能够识别相同的Producer实例
    • Kafka增加了一个与transactional.id相关的epoch,存储每个transaction.id内部元数据
    • 一旦epoch被触发,任何具有相同的transactional.id和更旧的epoch的Producer被视为僵尸,Kafka会拒绝来自这些Producer的后续事务性写入

零拷贝

零拷贝简介

文件传输网络的公共数据路径

  • 操作系统将数据从磁盘读入到内核空间的页缓存
  • 应用程序将数据从内核空间读入到用户空间缓存
  • 应用程序将数据写回到内核空间到socket缓存
  • 操作系统将数据从socket缓存区复制到网卡缓冲区,以便将数据经网络发出

零拷贝过程

  • 操作系统将数据从磁盘读入到内核空间的页缓存
  • 将数据的位置和长度的信息描述符增加至内核空间(socket缓冲区)
  • 操作系统直接将数据从内核空间拷贝到网卡缓冲区,以便将数据经网络发出

0Copy