如何使用单个应用程序实例和单个主题分区有效地运行kafka流?

时间:2019-01-29 07:39:42

标签: apache-kafka apache-kafka-streams spring-cloud-stream spring-kafka

当前设置-我正在从16个单个分区主题中流式传输数据,并进行KTable-KTable联接,并从所有流中发送包含聚合数据的输出。我还将每个KTable实现到本地状态存储。

场景-

  • 当我尝试运行两个应用程序实例时,我期望它的kafka流可以在单个实例上运行,但由于某种原因,它也可以在其他实例上运行。看起来它可以在某些流异常期间在实例#1上的kafka流失败期间在其他应用程序实例上创建流任务。有关主题的大量待办事项已清除,但是当我通过InteractiveQueryService查询聚合数据状态存储时,我发现几乎没有流数据。看起来它为实例#2上的几个流创建了状态存储。不确定。

  • 当我尝试在大量积压的单个实例上运行时,我看到各种异常-超时异常,RecordTooLarge异常。对于记录太大的异常,我实现了productionexceptionhandler来捕获异常并继续。但是看起来它正在超时,而不是KafkaStreams一直崩溃-

    1. org.apache.kafka.common.errors.TimeoutException:60000毫秒后无法更新元数据。您可以增加生产者参数
         retriesretry.backoff.ms来避免此错误。
    2. 针对分区0的5条记录已过期:自上次追加以来已过去381960毫秒;没有更多的记录将被发送,没有更多的抵消    将记录此任务。
    3. 由于先前记录(键1值[B @ 2时间戳记1548700011925]捕获到错误)而中止发送    abc-xyz-store-changelog由于    org.apache.kafka.common.errors.TimeoutException:更新失败    60000 ms之后的元数据。

当前配置-

  • retry.backoff.ms:5000 request.timeout.ms:300000重试次数:5 commit.interval.ms:1000个PROCESSING_GUARANTEE:at_least_once

所有其他值都是默认值,例如-

  • MAX_POLL_INTERVAL_MS:2147483647 MAX_POLL_RECORDS:1000 BATCH_SIZE:16384 NUM_STREAM_THREADS:1 LINGER_MS:100 MAX_BLOCK_MS:60000 MAX_IN_FLIGHT_REQ_PER_CONN:5

我希望在单个实例上运行该应用程序而不会崩溃,即使它运行缓慢以确保清除积压也是如此。

0 个答案:

没有答案