kafka也有生产者和消费者的概念,生产者把音讯发给kafka,消费者从kafka拿音讯进行生产,这个跟之前的activemq和rabbitmq相似。

咱们从生产者发消息开始,探讨kafka的整个流程。这里的版本是0.10.1.0

音讯对象

音讯对象 ProducerRecord蕴含了topic、partition、key、value、timestamp,其中topic和value在构建ProducerRecord时是必须的。

topic代表了一个汇合的名称,当音讯发往kafka的时候,kafka须要把这个音讯寄存起来的,此时就须要一个汇合的名称,把同一个汇合的音讯,寄存在一起,这个就类比于mysql的表,同一个表的数据,都是寄存在一个表中。

value是音讯的主体,比方咱们往名称为topic1的topic发送一个hello的音讯时,这个value就等于hello。

partition代表着分区号,kafka是分布式系统的,也就是说,一个topic的数据,会寄存在多个服务器中,所以就有很多分区,设置partition能够指定音讯发完哪个分区。

key作为音讯的键,能够依据key对这个音讯进行分区。

timestamp指音讯的工夫戳,既能够示意音讯的工夫戳,也能够示意音讯追加到日志文件的工夫。

咱们假设一个音讯体为hello的音讯发送给topic1。

KafkaProducer

音讯构建好后,咱们就须要把音讯收回去,不然构建干嘛,对吧。

负责发消息的是KafkaProducer,每个KafkaProducer都有一个clientId,如果没有设置,就会默认为producer-+数字,这个数字是AtomicInteger类型的,所以是线程平安的,没有设置的话,clientId就是producer-1producer-2。因为KafkaProducer也是线程平安的,所以客户端构建一个KafkaProducer用来发送音讯,也是能够的。

发送音讯的时候,咱们是须要晓得服务器(即broker)地址的,所以实例化KafkaProducer的时候,bootstrap.servers也是须要赋值的,如果有多个的话,用逗号隔开,格局为host1:port1,host2:port2,这里咱们假如服务器地址为hadoop1:9092

拦截器

拦截器并不是必须的,比方对音讯做一些定制化的操作,对topic和value批改等或者定制回调函数,不过失常状况,个别是不必的。

序列化

在网络传输中,broker是以以字节数组(byte[])的模式进行接管的,所以在发送的时候,须要事后把音讯的key和value进行序列化。

在初始化KafkaProducer的时候,设置key.serializervalue.serialize来制订key和value的序列化器。

分区器

Kafka是一个分布式系统,每个topic都对应着多个broker,所以咱们在发送音讯之前,须要对音讯调配他所在的分区。

音讯累加器

Kafka并不是一条一条的音讯进行发送,而且保留在音讯累加器这个缓存中,而后再批次发送,这样能够缩小网络传输的资源耗费,进而晋升性能。

Sender线程

音讯保留在内存后,Sender线程就会把符合条件的音讯依照批次进行发送。除了发送音讯,元数据的加载也是通过Sender线程来解决的。

Sneder线程发送音讯以及接管音讯,都是基于java NIO的Selector。通过Selector把音讯收回去,并通过Selector接管音讯。

前面咱们缓缓对本章的内容进行开展。