Spring Kinesis Binder 填满堆 space 快速导致频繁的 GC 刷新并减慢消息处理
Spring Kinesis Binder filling the Heap space quickly leading to frequent GC flush and is slowing down message process
我的应用程序从一个流中消费,然后将消息推送到三个流中
活页夹:
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 flush 非常频繁。
我们使用的是 1.0.0.RELEASE 版本的 Binder
你能帮忙吗
根据您的配置,我只能说您将在 AbstractAwsMessageHandler
上拥有 1500 * 3
PutRecordRequest
个实例,因为它默认处于 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
如果要消耗的记录较少,您将在内存中拥有较少的对象。
在同步生产模式的情况下,您将阻止消费者线程,因此它不会从输入流中提取更多记录。
我的应用程序从一个流中消费,然后将消息推送到三个流中
活页夹:
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 flush 非常频繁。
我们使用的是 1.0.0.RELEASE 版本的 Binder
你能帮忙吗
根据您的配置,我只能说您将在 AbstractAwsMessageHandler
上拥有 1500 * 3
PutRecordRequest
个实例,因为它默认处于 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
如果要消耗的记录较少,您将在内存中拥有较少的对象。 在同步生产模式的情况下,您将阻止消费者线程,因此它不会从输入流中提取更多记录。