Spring Kinesis Binder快速填充堆空间导致频繁的GC刷新并且正在减慢消息处理过程

问题描述 投票:0回答:1

我的应用程序正在使用一个流,然后在三个流上推送消息

活页夹:

public interface MyBinder {

  @Input("input1")
  SubscribableChannel input1();

  @Output("output1")
  MessageChannel output1();

  @Output("output2")
  MessageChannel output2();

  @Output("output3")
  MessageChannel output3();


}

配置:

spring:
  cloud:
    stream:
      kinesis:
        binder:
          locks:
            leaseDuration: 30
            refreshPeriod: 3000
        bindings:
          input1:
            consumer:
              listenerMode: batch
              recordsLimit: 1500
              idleBetweenPolls: 10000
              consumer-backoff: 1000
      bindings:
        input1:
          group: my-group
          destination: input1-stream
          content-type: application/json
        output1:
          destination: output1-stream
          content-type: application/json
        output2:
          destination: output2-stream
          content-type: application/json
        output3:
          destination: output3-stream
          content-type: application/json

我们推送的数据流量约为800kb。我们看到AbstractAwsMessageHandler / AmazonKinesisAsyncClient中有更多数据导致非常频繁的GC刷新。

我们正在使用1.0.0.RELEASE版本的Binder

你能帮忙吗?

spring-cloud-stream spring-cloud-aws spring-integration-aws
1个回答
2
投票

只有我可以通过您的配置说明您将在1500 * 3上拥有PutRecordRequest AbstractAwsMessageHandler实例,并且由于它默认处于async模式,您可能会导致队列开销等待AWS服务处理它们。

您可以考虑减少recordsLimit或将所有生产者配置为sync模式:https://github.com/spring-cloud/spring-cloud-stream-binder-aws-kinesis/blob/master/spring-cloud-stream-binder-kinesis-docs/src/main/asciidoc/overview.adoc#kinesis-producer-properties

如果要消耗的记录较少,则内存中的对象将减少。在同步生成模式的情况下,您将阻止使用者线程,因此它不会从输入流中提取更多记录。

© www.soinside.com 2019 - 2024. All rights reserved.