1.发送原理:
在消息发送的过程中,涉及到了两个线程——main 线程和 Sender 线程。在 main 线程
中创建了一个双端队列 RecordAccumulator。main 线程将消息发送给 RecordAccumulator,
Sender 线程不断从 RecordAccumulator 中拉取消息发送到 Kafka Broker。
- 通用是不使用这个拦截器的,使用的是Flume的拦截器,对数据进行加工
- 不使用Java的序列化工具,因为Java的序列化太重,大数据量并不适用
- 数据经过分区器后,一个分区会创建一个队列
- 创建队列的过程都是在内存中完成的,队列内存的总大小是32M,传输数据的批次大小是16KB,
- sender线程是专门用来将数据发送至broker的。缓冲区大小到达阙值后发送或者是时间到达后开启发送
消息发送到哪一个partition呢?
(1)如果消息中指定了Partition id,那就发送到对应的partition;
(2)如果没有,那就消息的key进行hash一下;
(3)如果id和key都没有,那就随机;
kafka消息的确认机制ack
(1)0表示不需要ACK,安全性低效率高;
(2)1表示需要一个ACK才会继续下一条;(一个follower接收就可以)
(3)-1(all)表示所有的follower都完成才会继续下一条,效率最低;