携手创作,共同成长!这是我参与「掘金日新计划 · 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
- 工作流程
- 服役
- 准备干净服务器
- 对哪个主题操作
- 形成计划
- 执行计划
- 验证计划
- 退役