如果答案忘了,结合脑图再看看
另一种思路去理解kafka
引入kafka的主要目的解决服务间通信问题,有些人可能会说kafka可以流量削峰,这其实是希望通讯网络具有缓冲的功能。 那么我们是否可以从 broker与客户端建立网络连接的过程 和 broker进行数据缓存的过程呢?
**网络连接方式 **
Kafka遵循了传统的方式,选择由producer向broker push消息并由consumer从broker pull消息,使用的是TCP长连接
生产者
**如何提高并发 **
- 1、多线程;
- 2、调整每次发送消息的批量大小
** 如何保证生产端的消息的可靠性 **
- 1、使用同步的方式发送消息
- 2、使用带callback的方式,发送消息,如果消息出问题,进行异常处理;
**拦截器 **
通过实现拦截器接口,重写方法,可以很方便的增加参数和做数据统计
**压缩 **
压缩有风险,使用时确保broker端没有配置压缩,否则如何生产者和broker的的压缩算法不一致,会导致broker的CPU飙升很高
broker
- 了解topic、partition、segment的概念,知道数据在broker上是如何存储的;
- 当broker接收到数据时,是如何一步一步的写入到磁盘的,又是如何一步一步的将数据通过零拷贝发送给消费者呢?
- 如何保证数据在broker的可靠性?ISR 低水位的概念? 禁止 消息落后的 broker,竞选leader
- 什么是reblance,rebalance触发的条件是什么,应该如何避免呢?
消费者
**如何保证消息被消费了? **
- 使用同步api,在消息处理完之后,手动提交位移;
**保证消息的幂等 **
- redis实现
提交位移的API自己就能规避了瞬时异常,那 CommitFailedException 产生的原因,如何避免 如何提升并发量呢?
如何保证消息的有序性?
为什么kafak具备高性能?
** broker:**
** 1、架构:多个partition,并发;**
** 2、NIO异步三层网络模型;**
** 3、磁盘顺序读写;刷磁盘的时候使用了oscache**
** 4、文件存储格式,跳表,增加索引效率;**
** 5、零拷贝,直接从内存中取数据,减少内存拷贝**
producer**:**
** 1、批处理;**
** 2、使用内存池,对象重复利用,减少GC**
** 3、封装同一服务器请求,减少网络连接次数**
** consumer:**
** 1、消费者组,实现点对点和发布订阅;**
** 2、设计的不是很好,因为reblance**