kafka01-生产者发送数据原理及分区的好处

Kafka 传统定义:是一个分布式的,基于“发布/订阅”模式的消息队列,主要应用于大数据实时处理领域。

kafka最新定义:是一个开源的分布式事件流平台,被数千家公司用于高性能数据管道、流分析、数据集成和关键任务应用。

在目前企业中,常见的消息队列有:Kafka、ActiveMQ 、RabbitMQ、RocketMQ.

传统消息队列的应用场景:缓存/消峰、解耦和异步通信。

消息队列的两种模式:

  1. 点对点模式:producer将数据发生到队列,consumer主动拉取数据,并通知队列确认消费,队列则会将已消费的数据删除

  2. 发布/订阅模式:可以有多个主题,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队列里面的所有节点收齐数据后应答

  1. 生产者发送过来的数据,不需要等待数据落盘应答

  2. 生产者发送过来的数据,leader收到数据后应答

应答成功,则会将sender队列数据和缓冲区分区内对应的数据删除。

失败则会重试(retries=maxInt),直到成功为止.(可修改)

 

 

 

Kafka分区的好处:

  1. 便于合理使用存储资源,每个partition在一个broker上存储,可以把海量数据按照分区切割成一块一块数据存储在多台broker上。合理控制分区的任务,可以实现负载均衡的效果。

  2. 提高并行度。生产者可以以分区为单位发送数据;消费者可以以分区为单位消费数据。(如果只有一个分区来收发数据,那么在数据量大的情况下效率会很慢,但如果分区存储,就可以把相同的数据均摊后并行发往不同的分区存储,消费也同样的道理,这样不仅效率提升而且解决了一台服务器无法存储大数据量的问题)

 

posted @ 2022-03-07 23:32  迷路小孩  阅读(242)  评论(0)    收藏  举报