kafka01-生产者发送数据原理及分区的好处
kafka最新定义:是一个开源的分布式事件流平台,被数千家公司用于高性能数据管道、流分析、数据集成和关键任务应用。
在目前企业中,常见的消息队列有:Kafka、ActiveMQ 、RabbitMQ、RocketMQ.
传统消息队列的应用场景:缓存/消峰、解耦和异步通信。
点对点模式:producer将数据发生到队列,consumer主动拉取数据,并通知队列确认消费,队列则会将已消费的数据删除
发布/订阅模式:可以有多个主题,producer将数据推送到不同的主题,consumer订阅主题进行消费,被消费过的数据并不会删除,其他消费者仍可以继续消费数据。那队列什么时候会删除数据呢?后面会讲到
kafKa2.8.0前必须采用Zookeeper进行配合使用,2.8.0之后则可以不采用zk
KafKa副本有leader和follower之分,无论是生产还是消费,只针对于leader,follower只用于备份,等leader挂掉之后,follower才会有条件成为leader.
配置Kafka环境变量和配置文件.
生产者发送数据到kafka集群的原理:
Producer -> send(ProducerRecord) -> Interceptors拦截器(对数据进行加工处理,可选项) -> Serizlizer(kafka自己的,不使用java序列化的原因是太重了,辅助项太多,不适用于大数据传输) -> Partitioner分区器(根据规则指定往那个分区存储数据。我们会把海量数据切分成多块进行存储,每个分区会创建一个队列,方便数据管理)
分区数据(缓冲队列)都是存储在内存中,RecordAccumulator默认32m。生产者向缓冲区推送数据,每一批次推送大小ProducerBatch默认为16k.
Sender线程将缓存队列内的数据读取出来,发往对应的kafka集群。
达到batch.size或linger.ms,sender线程才会拉取数据发往kafka集群:
batch.size: 只有数据积累到batch.size(默认16k),sender才会发送数据。
linger.ms: 如果数据迟迟未达到batch.size,sender等待linger.ms设置的时间到了,也会发送数据。单位ms,默认值为0ms,表示没有延迟。
生成环境中,这两个值都需要灵活调整。
kafka节点收到第一条数据后如果没有及时的应答,sender仍然会继续发送,最多可以缓存5个数据,便不会再发,直到第一条数据有应答后才会继续发送。
Selector 链路(缓冲区和kafka之间io的桥梁)
kafka应答机制asks:
-1. all 生产者发送过来的数据,leader和isr队列里面的所有节点收齐数据后应答
生产者发送过来的数据,不需要等待数据落盘应答
生产者发送过来的数据,leader收到数据后应答
应答成功,则会将sender队列数据和缓冲区分区内对应的数据删除。
失败则会重试(retries=maxInt),直到成功为止.(可修改)

Kafka分区的好处:
便于合理使用存储资源,每个partition在一个broker上存储,可以把海量数据按照分区切割成一块一块数据存储在多台broker上。合理控制分区的任务,可以实现负载均衡的效果。
提高并行度。生产者可以以分区为单位发送数据;消费者可以以分区为单位消费数据。(如果只有一个分区来收发数据,那么在数据量大的情况下效率会很慢,但如果分区存储,就可以把相同的数据均摊后并行发往不同的分区存储,消费也同样的道理,这样不仅效率提升而且解决了一台服务器无法存储大数据量的问题)


浙公网安备 33010602011771号