小卷卷的Kafka第一天学习总结

200 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

概述

定义

传统定义

分布式 发布订阅 消息队列

发布订阅: 分为多种类型 订阅者根据需求选择性订阅

最新定义

流平台 (存储计算)

消息队列应用场景

  • 缓存消峰
  • 解耦(避免直接API交互)
  • 异步通讯(完成关键步骤即可返回)

两种模式

  • 点对点
  • 一个生产者 一个消费者 一个Topic 会删除数据 使用不多
  • 发布订阅模式
  • 多个生产者对接多个数据源 多个消费者相互独立 多个Topic 消费完不会删除数据

架构

  • 生产者
    • 处理海量数据 对接外部接口
  • Broker集群
    • Broker 服务器
    • topic 主题 对数据进行分类
    • partition 分区 将数据切割
    • 副本 保证可靠性
      • leader (生产者 消费者指定leader操作) follower
  • 消费者
    • 消费者之间相互独立
    • 消费者组 消费某一个主题/分区的数据 某个分区只能由一个消费者消费(重复消费)
  • zookeeper
    • 存 broker.ids 存活的broker
    • leader isr

快速入门

安装

  • broker.id必须全局唯一
  • 修改 broker.id log.dirs 连接zookeeper/kafka
  • 启动停止 先停kafka 再停zookeeper

常用命令行

  • 主题 kafka-topic.sh
    • --bootstrap-server 连接
    • --topic [主题名]
    • --create / --delete / --alter
    • --list
    • --describe
    • --partitions
    • --replication-factor 副本
  • 生产者 kafka-console-producer.sh
    • --bootstrap-server 连接
    • --topic [主题名]
  • 消费者 kafka-console.consumer.sh
    • --bootstrap-server 连接
    • --topic [主题名]

生产者

原理

异步发送API

  • 配置
    • 连接 bootstrap-server
    • key-value 序列号
  • 创建生产者
    • KafkaProducer<String,String >()
  • 发送数据
    • send() send(,new Callback)
  • 关闭资源

同步发送API

  • send() send(,new Callback).get()

分区

  • 好处
    • 存储 运算
  • 默认分区规则
    • 指定分区 按照分区走
    • key key的hashcode%分区数
    • 没有指定key 没有指定分区 粘性
      • 第一 随机
  • 自定义分区
    • 定义类 实现partitioner接口

提高吞吐量

  • 批次大小 16K
  • linger.ms 0ms -> 5-100ms 数据延迟
  • 压缩 gzip 等
  • 缓冲大小 32M->64M

传输可靠性

  • 0 落盘即可 容易丢失
  • 1 leader落盘 传输普通日志
  • -1 all 一条都不丢 完全可靠 + 副本大于等于2 isr >=2 可能会导致数据重复

数据重复

  • 幂等性
    • PID(Kafka启动时) 分区号 序列化号(单调递增) 默认打开
  • 事务
    • 底层基于幂等性
    • 初始化
    • 启动
    • 消费者offset
    • 提交
    • 终止

数据有序

单分区内有序 (有条件)

多分区内有序 -> 放到一个消费者中进行排序

乱序

1.X inflight=1 一个一个请求

新版本 没有幂等性 inflight=1

有幂等性 inflight<=5

Broker

  • zookeeper存储哪些消息
    • broker.ids leader 辅助选举 controller

image.png

  • 工作流程
  • 服役
    • 准备干净服务器
    • 对哪个主题操作
    • 形成计划
    • 执行计划
    • 验证计划
  • 退役