kafka笔记

kafka特性

kafka 是 分布式 高吞吐 发布订阅 消息系统

消息中间件的意义

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

kafka 结构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
ISR(In-Sync Replica): 是Replicas的一个子集,表示目前Alive且与Leader能够“Catch-up”的Replicas集合。由于读写都是首先落到Leader上,所以一般来说通过同步机制从Leader上拉取数据的Replica都会和Leader有一些延迟(包括了延迟时间和延迟条数两个维度),任意一个超过阈值都会把该Replica踢出ISR。每个Partition都有它自己独立的ISR。

谁先到zookeeper抢节点注册,谁就是controller
controller也没有啥用,就是监控一下zookeeper存的kafka元数据信息,存于自己内存,然后同步给follower,每个节点内存都有元数据信息。

因此使用kafka可以只写一个broker(任意一个都有元数据),或多个用于防灾。

topic是逻辑分区 partition是物理分区 一个partition消息会有多个副本,它们之间只有一个leader,对外服务,其他仅同步防灾,只有leader partition生产者写入,消费者消费。因此leader会被负载均衡放置,避免服务器单点压力。

分区解决大数据存储,可分多服务器

kafka性能为何高

kafka高并发, 高性能, 高可用
性能应由 网络、磁盘、内存、cpu考虑

kafka 服务端为何高性能
在这里插入图片描述

处理请求:
1 顺序处理 等待上一个完成,吞吐量差
异步创建线程(线程开销大)–》 参考NIO
在这里插入图片描述
NIO 请求发至由selector,对接 线程池 --》消息队列–》处理线程池

解决selector单点的性能瓶颈–》reactor模型
在这里插入图片描述
在这里插入图片描述

顺序、随机读写?
https://blog.csdn.net/im_cheer/article/details/89811004
在这里插入图片描述

跳表设计,稀松索引
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

0拷贝 在这里插入图片描述
在这里插入图片描述
producer端
批处理
内存池设计
封装同一服务器的请求

在这里插入图片描述
内存池设计
在这里插入图片描述
consumer端
consumer group 设计
偏移量存储改造
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
小记
kafka 0.8版本之后 批处理
网络瓶颈 压缩
cpu瓶颈 不压

内存池 对应批够大的小内存块
减少创建销毁 复用 避免fgc
封装同一服务器请求
不依赖zk记录偏移量 zk不擅长高频高并发读写,他自己要各种同步
默认_consumer_offsets topic 50分区用于维护offset

Kafka最核心的思想是使用磁盘,而不是使用内存,为何呢?
磁盘缓存由Linux系统维护优化,减少了程序员的不少工作。
磁盘顺序读写速度持平或超过内存随机读写。
JVM的GC效率低,内存占用大。使用磁盘可以避免这一问题。
系统冷启动后,磁盘缓存依然可用。

kafka使用

保证消息顺序:每个partition中顺序是有序的,按同一规则写入同一个partition内,
注意路由,的负载均衡,按业务特点分配路由
网络不稳定,异步重试elastic-job

情况1:消息积压:
1.消息体过大,增加io耗时,影响kafka生产,消费速度。浪费服务器磁盘空间。
解决,仅保存需要的id和状态,消费成功到另一系统后再用id调用接口查询原数据详情。
2.路由不合理,仅个别partition出现消息积压。
解决,按业务特点分配路由
3.批量操作引起连锁反应。突然来一批大量数据处理,处理不过来。
增加不同组的consumer?
线程池处理消息,核心线程、最大线程都调到50(通过zookeeper动态调整)(为保证消息顺序,将线程池改成多队列,每个队列单线程)
消息积压慢慢减少,but调用接口,把服务器弄挂了。
所以接口要做多线程并发场景压测,对消息积压情况做监控。
4.表过大
业务系统数据库单表过大,通过业务梳理理解,应归档分表,仅保留仅几天数据即可。

情况2:线程安全:
高并发状态下,两个请求都发现数据不存在要插入,则会发生主键重复等线程安全问题。
加锁慢,基于redis分布式锁,可能出现网络延时问题。
幂等性:https://blog.csdn.net/u014756827/article/details/95195648
产生重复数据或数据不一致(假定程序业务代码没问题),绝大部分就是发生了重复的请求,重复请求是指同一个请求因为某些原因被多次提交。
接口的幂等性实际上就是接口可重复调用,在调用方多次调用的情况下,接口最终得到的结果是一致的
在这里插入图片描述
尽量不要让系统变的复杂,所以推荐唯一主键和乐观锁方式,因为实现比较简单。

情况3:数据库主从延时:
kafka没有积压,客户端查不到数据。
原因网络延时,从库 还没数据,因此接口没读到。增加重试机制,如果接口查数据返回空则重试。

情况4:重复消费:

情况4:多环境公用kafka:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值