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: