kafka架构知识总结

KAFKA优化:

Kafka消息不丢设置:

1、消费者:enable.auto.commit设置成falsefollower replica如果落后leader replica太多就不能参与竞选

2、服务端:unclean.leader.election.enable=false

1<min.insync.replicas <= replication.factor副本数。满足副本成功。

3、生产者:retries重试设大 重试次数

producer.send(msg,callback) 异步异常捕捉处理

acks的值要设置为-1,主从复制完成应答。

  1. 不断电

Kafka重复消费

  1. 数据UPDATE版本号,ABA问题。SELECT kucun,v from user where id=1111;Update user set kucun=$kucun-1,v=v+1 where id=1111 and v=$v;
  2. 数据INSERT唯一ID,唯一索引。
  3. 计算时用synchronized效率更高或原子类AtomicInteger计算数值,线程安全只解决了线程间锁。但是入库时mysql默认的事务隔离级别是REPEATABLE-READ,从库SELECT取值kucun会出现相同,最终办法版本号。也就是CAS机制。

Kafka的稀疏索引-跳表设计

KAFKA顺序写:

KAFKA跳表文件零拷贝:

所谓的零拷贝(Zero-Copy)是指将数据直接从磁盘文件复制到网卡设备中,而不需要经由应用程序之手 。零拷贝大大提高了应用程序的性能,减少了内核和用户模式之间的上下文切换 。 对 Linux操作系统而言,零拷贝技术依赖于底层的 sendfile() 方法实现 。 对应于 Java 语言,FileChannal.transferTo() 方法的底层实现就是 sendfile() 方法。单纯从概念上理解 “零拷贝”比较抽象,这里简单地介绍一下它 。

零拷贝简述 - 知乎

正常的拷贝:

mmap函数拷贝:

mmap函数的作用相当于是内存共享,将内核空间的内存区域和用户空间共享,这样就避免了将内核空间的数据拷贝到用户空间的步骤。

sendfile函数拷贝:

作用是在内核空间将一个文件描述符的内容发送给另一个文件描述符,用户空间不用关心。

splice函数拷贝:

和sendfile差不多,管道方式发送文件描述符。

Java的应用程序经常会遇到数据传输的场景,在Java NIO包中就提供了零拷贝机制的实现,主要是通过NIO包中的FileChannel实现FileChannel提供了transferTo和transferFrom方法,都是采用了调用底层操作系统的sendfile函数来实现的CPU零拷贝机制。

kafka服务器就是采用了FileChannel的transfer方法实现了高性能的IO传输操作

Netty中的零拷贝机制Netty作为NIO的高性能网络通信框架,同样也实现了零拷贝机制,不过和操作系统的零拷贝机制则不是一个概念

KAFKA内存池管理:

 解决了长期运行速度降低的问题,主要是因为FULL GC 发生造成的。通过对每一批消息进行按需的内存申请和释放,避免了FULL GC的发生。

KAFKA双缓冲写:

作用多线程写的情况,减少每批消息创建一个线程,避免过多IO线程的开销,所有的消息由2个线程去顺序写磁盘。

1、创建独占本地线程

private ThreadLocal<Long> localTxid=new ThreadLocal<Long>();

2、加锁sychornized写数据到链表currentBuffer 中,链表写效率高。

//内存1
LinkedList<EditLog> currentBuffer = new LinkedList<EditLog>();
//内存2
LinkedList<EditLog> syncBuffer= new LinkedList<EditLog>();

3、加锁synchronized交换内存

/**
 * 交换内存
 */
public void setReadyToSync(){
    LinkedList<EditLog> tmp= currentBuffer;
    currentBuffer = syncBuffer;
    syncBuffer = tmp;
}

4、syncBuffer的数据顺序写入磁盘

KAFKA序列化和反序列化:

压缩消息体数据,减少网络传输。

KAFKA netty nio网络模型:

异步网络传输

KAFKA消息持久化:

一个线程将消息持续的拉到本地文件中,包含:跳表稀疏索引文件和消息体文件。

KAFKA工作模型:

生产者-》消息对应topic发送过来-》消息体序列化-》消息通过offset进行分区-》消息发送到对应的分区-》分区大文件拆分成小文件-》分区的消息体反序列化分批性发送给-》消费者

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值