KafkaProducer及其API

KafkaProducer

向Kafka集群发布记录的Kafka客户端。

生产者是线程安全的,并且在线程之间共享一个生产者实例通常比拥有多个实例要快。




生产者由缓冲空间池组成,缓冲空间池保存尚未传输到服务器的记录,以及后台I/O线程,该线程负责将这些记录转换为请求并将它们传输到集群。未在使用后关闭生产者将泄漏这些资源。

send()方法是异步的。调用时,它将记录添加到挂起记录发送的缓冲区,并立即返回。这样,生产者就可以为提高效率而对单个记录进行批处理。

ack配置控制请求被认为是完整的条件。我们指定的“all”设置将导致阻塞记录的全部提交,这是最慢但最持久的设置。

如果请求失败,生产者可以自动重试,但由于我们已经指定重试为0,它不会。启用重试还打开了复制的可能性(详细信息请参阅关于消息传递语义的文档)。

生产者为每个分区维护未发送记录的缓冲区。这些缓冲区的大小由批处理指定。大小配置。使这个更大可以导致更多的批处理,但是需要更多的内存(因为我们通常会为每个活动分区拥有一个这样的缓冲区)。

默认情况下,即使缓冲区中还有未使用的空间,也可以立即发送缓冲区。但是,如果您想减少可以设置linger的请求数。m的大于0次方。这将指示生成程序在发送请求之前等待该毫秒数,希望到达更多的记录以填充相同的批处理。这类似于Nagle在TCP中的算法。例如,在上面的代码片段中,由于我们将逗留时间设置为1毫秒,所以很可能所有100条记录都将在一个请求中发送。但是,如果我们不填充缓冲区,这个设置将为我们的请求增加1毫秒的延迟,等待更多的记录到达。注意,及时接近的记录通常会与linger一起批处理。ms=0,因此,在重载下,无论逗留配置如何,都将发生批处理;然而,将其设置为大于0的值会导致更少的、更有效的请求,而不是在最大负载下以少量延迟为代价。

缓冲。内存控制用于缓冲的内存的总量。如果记录的发送速度超过了传输到服务器的速度,那么这个缓冲区空间将被耗尽。当缓冲区空间耗尽时,将阻塞额外的发送调用。块的时间阈值由max.block确定。之后,它抛出一个TimeoutException。

关键。序列化器和价值。序列化器指示如何将用户提供的产品记录的键和值对象转换为字节。对于简单的字符串或字节类型,可以使用所包含的ByteArraySerializer或StringSerializer。

此客户端可以与版本为0.10.0或更新的代理进行通信。较老或较新的代理可能不支持某些客户端特性。当调用运行的代理verion不可用的API时,您将收到一个UnsupportedVersionException。

KafkaProducer及其API_第1张图片

将记录异步发送到主题,并在确认发送后调用所提供的回调。

发送是异步的,一旦记录被存储在等待发送的记录的缓冲区中,此方法将立即返回。这允许并行地发送多个记录,而不阻塞,以便在每个记录之后等待响应。

发送的结果是一个记录元数据,它指定发送记录的分区、分配记录的偏移量和记录的时间戳。如果主题使用CreateTime,那么如果用户没有为记录指定时间戳,则时间戳将是用户提供的时间戳或记录发送时间。如果为主题使用LogAppendTime,那么当消息被追加时,时间戳将是Kafka代理本地时间。

由于发送调用是异步的,它将返回将分配给此记录的记录元数据的未来。在这个将来调用get()将会阻塞,直到相关请求完成,然后返回记录的元数据,或者抛出发送记录时发生的任何异常。

如果您想模拟一个简单的阻塞调用,可以立即调用get()方法:


你可能感兴趣的:(kafka)