KAFKA

项目为什么采用KAFKA?

大数据平台数据量大,每日3.5亿笔交易,硬盘存储

发布订阅模式,很多项目组(消费者组)都需要消费同一个主题,kafka是典型的发布订阅模式

稳定的流处理消息来源

--------------------------

AR【分区中的所有副本】

ISR【与分区leader副本保持一定程度同步的副本】ISR机制保证高性能与可靠性

OSR【与分区leader副本同步滞后过多的副本】

HW【高水位】消费者只能拉取当前日志此offset(不包括)之前的消息

LEO【log end offset】当前日志文件中下一条消息将要写入的offset

--------------------------

看一下序列化的本质,对比kafka生产者中指定序列化类的目的

producer->拦截器(链)->序列化器->分区器->buffer缓冲区-双端队列Deque<ProducerBatch> ->sender线程-<broker节点Node,List<ProducerBatch>-<Node,Request>->borker

KafkaProducer对象多线程安全,因为无状态,即无共享变量被多线程同时修改

点对点模式(队列)/发布订阅模式(广播)

消费者可以只订阅某个主题的特定分区进行消费,而不是消费整个主题的所有分区。P52 assign()。场景:生产者通过分区器将 云闪付交易/刷卡交易 发送到不同分区,消费者按需求消费

消费位移提交问题:重复消费、消息丢失 实际场景P65

自动提交、手动提交

指定消费位移处开始消费:seek() P73

获取分区指定时间处之后的第一条数据的偏移量,从此处开始消费 P77 P185

再均衡监听器-》解决:消费组新增加一个消费者时,会将不同分区重新分配给各个消费者消费,分区之前的所有者还没来得及提交位移就被新消费者抢走分区了,导致重复消费。

 消费者拦截器,应用场景:10s之前的消息在poll返回List之前过滤掉

KafkaConsumer对象非线程安全,同一时间只能一个线程在操作它,比如项目中的主线程

分区重分配:kafka服务集群中各个broker负责存储哪些分区副本,将某个broker上的副本交给其他broker存储就叫分区重分配。触发分区重分配的场景: 新增broker、broker节点宕机、新增分区场景

分区数选择

---------------------------------

日志存储格式:P162、P164:【 log.dir配置的根目录-存储topic日志    每个topic->多个partitions->每个partition对应多个副本->每个副本有一个存储日志目录->日志分段->目录下有.log日志文件+位移索引文件.index+时间索引文件.timestamp】

索引特点:稀疏、单调递增、内存、二分查找

日志切分、索引切分

偏移量索引格式:相对位移+物理位置

如何查找一个给定偏移量xxx的记录? P183 日志分段存储采用concurrentSkipListMap跳表-》找到yyy.log-》计算目标记录在文件中的相对位移z=xxx-yyy -》二分查找比z小的那个索引,拿到索引消息的物理位置position-》根据position顺序查找磁盘

时间戳索引格式:时间戳+相对位移

如何查找给定时间戳的下一条记录?P185 时间戳-》对比每个分段日志最后一条记录时间戳-》找到分段日志-》找到分段日志对应时间戳索引文件-》找时间戳索引,获取相对偏移量-》找偏移量索引文件中对应索引,找到分段日志物理位置-》从物理位置依次向下查找,对比记录的时间戳和给定时间戳

磁盘存储为什么还这么快?文件追加-顺序写盘、页缓存

--------------------------------------------

服务端

生产者向服务端发送消息的请求协议类型 ProducerRequest/ProducerResponse

follower向leader、consumer向server 拉取消息的拉取协议 FetchRequest/FetchResopnse,及拉取协议引入session_id优化,不必传输需要拉取的topics信息

时间轮:处理延时操作,如延时生产、延时拉取、延时删除等。设计灵感时钟的时分秒。时间轮升降级机制

什么是延时生产?ack=-1。producer生产数据-》leader写入后,follower进行拉取同步,给这个同步过程设置一个超时时间,延时操作管理器的定时器(时间轮实现)负责管理这个超时时间,一旦到达超时时间强制响应producer。

Kafka集群中的broker leader通过监听ZK中各个功能节点的变化来触发集群操作

----------------------------------------------

客户端

分区分配策略:范围、轮询、粘性。范围和轮询为什么存在分配不均问题?粘性策略怎么解决的?

自定义分区器

每个消费组在服务端都有一个组协调器:GroupCoordinator,负责执行消费者再均衡操作

11-11
### Kafka入门教程及使用场景 #### 一、Kafka简介 Apache Kafka 是一种分布式流处理平台,能够实现高吞吐量的消息传递系统。它最初由 LinkedIn 开发并开源,现已成为 Apache 软件基金会的一部分[^1]。 #### 二、Kafka的安装与配置 以下是基于 Docker 的 Kafka 安装方法: ```yaml version: "1" services: kafka: image: 'bitnami/kafka:latest' hostname: kafka ports: - 9092:9092 - 9093:9093 volumes: - 'D:\Docker\Kafka\data:/bitnami/kafka' networks: - kafka_net environment: # KRaft settings - KAFKA_CFG_NODE_ID=0 - KAFKA_CFG_PROCESS_ROLES=controller,broker - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka:9093 # Listeners - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.2.51:9092 - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER - KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT networks: kafka_net: driver: bridge ``` 运行命令如下: ```bash docker-compose -f .\docker-compose.yml up -d ``` 上述 YAML 文件定义了一个简单的 Kafka 集群环境,并通过 `docker-compose` 启动服务[^1]。 #### 三、Kafka的基础概念 在 Kafka 中,消息被存储在主题(Topic)中,而每个 Topic 又分为若干分区(Partition)。每个分区有一个 Leader 和零个或多个 Follower。Leader 负责读写操作,Follower 则同步数据以提供冗余支持。当创建一个新的 Topic 时,Kafka 自动将 Partition 的 Leader 均匀分布到各个 Broker 上,从而提高系统的可靠性和性能[^2]。 #### 四、可视化管理工具 Offset Explorer 是一款常用的 Kafka 数据管理和监控工具,可以帮助开发者更直观地查看和分析 Kafka 主题中的偏移量和其他元数据信息[^1]。 #### 五、Kafka的主要使用场景 1. **日志收集**:Kafka 可用于集中式日志采集方案,实时捕获来自不同服务器的日志文件。 2. **消息队列**:作为传统 MQ 替代品,Kafka 提供高性能异步通信机制。 3. **活动跟踪**:记录用户的在线行为轨迹,便于后续数据分析挖掘价值。 4. **指标监测**:构建企业级运营状态仪表盘,展示关键业务指标变化趋势。 5. **ETL流程优化**:连接多种数据库之间复杂的数据转换过程,提升效率减少延迟。 #### 六、总结 通过对 Kafka 的基本原理理解及其实际应用场景探讨,可以更好地掌握如何利用这一强大技术解决现实世界中的挑战性问题。 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值