Spring boot 如何在spring云数据流kafka中存储发送到主题失败的数据

Spring boot 如何在spring云数据流kafka中存储发送到主题失败的数据,spring-boot,apache-kafka,spring-kafka,spring-cloud-stream,spring-cloud-stream-binder-kafka,Spring Boot,Apache Kafka,Spring Kafka,Spring Cloud Stream,Spring Cloud Stream Binder Kafka,我在Kafka中配置了3个代理,在不同的端口上运行。我使用的是spring cloud stream Kafka brokers: localhost:9092,localhost:9093,localhost:9094. 我正在创建一个获取连续数据流的数据管道。我正在kafka主题中存储数据流,有3个代理正在运行。到目前为止没有问题。我担心的是假设3个代理宕机5分钟,那么当时我无法获取kafka主题的数据。将有5分钟的数据丢失。从春季启动开始,我将得到警告 2020-10-06 11:44

我在Kafka中配置了3个代理,在不同的端口上运行。我使用的是spring cloud stream Kafka

brokers:  localhost:9092,localhost:9093,localhost:9094.
我正在创建一个获取连续数据流的数据管道。我正在kafka主题中存储数据流,有3个代理正在运行。到目前为止没有问题。我担心的是假设3个代理宕机5分钟,那么当时我无法获取kafka主题的数据。将有5分钟的数据丢失。从春季启动开始,我将得到警告

2020-10-06 11:44:20.840  WARN 2906 --- [ad | producer-2] org.apache.kafka.clients.NetworkClient   : [Producer clientId=producer-2] Connection to node 0 (/192.168.1.78:9092) could not be established. Broker may not be available. 

是否有一种方法可以在所有代理都停止时临时存储数据,并在代理再次启动时再次开始从临时存储恢复对主题的写入?

您可以利用生产者正在使用的内部缓冲区将数据发送到集群。KafkaProducer有一个隐藏的队列和一个专用的I/O线程,该线程实际将数据发送到集群

结合生产者配置
重试
(默认设置为0),您可能需要增加
缓冲区。内存
,如下所述:

生产者可用于缓冲等待发送到服务器的记录的内存总字节数。如果记录发送速度快于发送到服务器的速度,生产者将阻止max.block.ms,之后将抛出异常

此设置应大致对应于生产者将使用的总内存,但不是硬限制,因为并非生产者使用的所有内存都用于缓冲。一些额外的内存将用于压缩(如果启用了压缩)以及维护飞行中的请求

然而,我不认为让生产者自己处理一个完整的集群故障通常是一个好主意。卡夫卡本身就是为应对个别经纪人的失败而设计的,但如果你所有的经纪人都无法控制地同时倒下,你可能会遇到比丢失个别制片人的一些数据更大的问题


如果在一段时间内只有一个代理无法访问,则无需执行任何操作,因为Kafka会在内部将主题的分区前导切换到另一个代理(当然,如果分区已复制)。

您可以利用生产者使用的内部缓冲区将数据发送到集群。KafkaProducer有一个隐藏的队列和一个专用的I/O线程,该线程实际将数据发送到集群

结合生产者配置
重试
(默认设置为0),您可能需要增加
缓冲区。内存
,如下所述:

生产者可用于缓冲等待发送到服务器的记录的内存总字节数。如果记录发送速度快于发送到服务器的速度,生产者将阻止max.block.ms,之后将抛出异常

此设置应大致对应于生产者将使用的总内存,但不是硬限制,因为并非生产者使用的所有内存都用于缓冲。一些额外的内存将用于压缩(如果启用了压缩)以及维护飞行中的请求

然而,我不认为让生产者自己处理一个完整的集群故障通常是一个好主意。卡夫卡本身就是为应对个别经纪人的失败而设计的,但如果你所有的经纪人都无法控制地同时倒下,你可能会遇到比丢失个别制片人的一些数据更大的问题

如果只有一个代理在一段时间内不可访问,则无需执行任何操作,因为Kafka会在内部将主题的分区领导切换到另一个代理(当然,如果分区已复制)