Spring Kinesis Binder быстро заполняет пространство кучи, что приводит к частой очистке GC и замедляет процесс обработки сообщений. - PullRequest
0 голосов
/ 17 апреля 2019

Мое приложение использует один поток, а затем отправляет сообщения в три потока

Связующее:

public interface MyBinder {

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

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

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

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


}

Config:

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

Данные, которые мы отправляем в поток в каждой записи, около 800 КБ. Мы видим, что в AbstractAwsMessageHandler / AmazonKinesisAsyncClient имеется больше данных, которые приводят к очень частому сбросу GC.

Мы используем 1.0.0. РЕЛИЗ-версию Binder

Не могли бы вы помочь.

1 Ответ

2 голосов
/ 17 апреля 2019

Только то, что я могу сказать по вашей конфигурации, что у вас будет 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

В случае меньшего количества записей впотреблять у вас будет меньше объектов в памяти.В случае режима создания синхронизации вы собираетесь заблокировать поток потребителя, поэтому он не будет извлекать больше записей из входного потока.

...