这篇文章是第一部分的继续Kafka Technical Overview。在本系列的第2部分,让我们来看看卡夫卡制作人是如何工作的细节以及重要的配置。
卡夫卡制作人的主要角色是取得制作人的财产,将它们记录为输入,并将它们写到合适的卡夫卡经纪人那里。生产者基于分区跨代理序列化、分区、压缩和负载平衡数据。
一些生成器属性是引导服务器、ACKs、batch.size、linger.ms key.serializer、value.serializer等等。我们将在本文后面讨论其中的一些属性。
应该写给卡夫卡的信息被称为生产者记录。生产者记录包含应该写入的主题的名称和记录的值。分区、时间戳和密钥等其他字段是可选的。
卡夫卡集群中的任何代理都可以充当引导服务器。通常,传递的是引导服务器列表,而不是一个服务器。建议至少使用两台引导服务器。
为了向适当的代理发送生产者记录,生产者首先建立到引导服务器之一的连接。引导服务器返回集群中所有可用代理的列表以及所有元数据详细信息,如主题、分区、复制因子等。基于代理列表和元数据详细信息,生产者标识托管生产者记录的领导者分区的领导者代理,并将其写入代理。
下图显示了生产者的工作流程。
生产者的工作流程包括五个重要步骤:
在这一步中,生成器记录根据传递给生成器的序列化程序进行序列化。键和值都基于传递的序列化程序进行序列化。一些序列化程序包括字符串序列化程序、字节数组序列化程序和字节缓冲序列化程序。
在这一步中,生产者决定应该将记录写入主题的哪个分区。默认情况下,杂音2算法用于分区。杂音2算法根据传递的密钥生成唯一的哈希代码,并决定适当的分区。如果密钥未被传递,分区将按循环方式选择。
重要的是要理解,通过将相同的密钥传递给一组记录,卡夫卡将确保消息按照给定数量的分区接收到的顺序被写入相同的分区。如果您想保留收到的消息的顺序,对消息使用适当的密钥是很重要的。还可以将自定义分区器传递给生成器,以控制消息应该写入哪个分区。
在这一步中,生产者记录在写入记录累加器之前被压缩。默认情况下,卡夫卡制作人不启用压缩。以下是支持的压缩类型:
压缩不仅可以加快从生产者到代理的传输速度,还可以加快复制过程中的传输速度。压缩有助于提高吞吐量、低延迟和磁盘利用率。涉及this article有关基准测试的详细信息。
在这一步中,记录被累积在一个主题的每个分区的缓冲区中。根据生产者批次大小属性将记录分组到批次中。主题中的每个分区都有一个独立的累加器/缓冲区。
在这一步中,记录累加器中的分区批次由它们将被发送到的代理进行分组。批处理中的记录根据以下内容发送给代理batch.size
和linger.ms
属性。生产者根据两个条件发送记录:当达到规定的批量或规定的停留时间时。
当卡夫卡提交了消息时,制作者可以发送重复的消息,但是由于网络故障和其他问题,制作者从未收到确认。从卡夫卡0.11开始,为了避免在上述场景中出现重复的消息,卡夫卡根据其生产者标识和序列号来跟踪每个消息。当收到具有相同生产者标识和序列号的已提交消息的重复消息时,卡夫卡将把该消息视为重复消息,并且不会再次提交该消息;但是它会将确认发送回生产者,这样生产者就可以将消息视为已发送。
根据生成器工作流和生成器属性,调整配置以获得所需的结果。重要的是,关注以下属性:
在本系列的第3部分中,我们将研究卡夫卡生产者交付语义,以及如何调整一些生产者属性来实现我们期望的结果。