Spring Integration Kinesis适配器和使用者组

时间:2018-08-30 17:28:18

标签: amazon-kinesis spring-cloud-stream spring-integration-aws

我有一个使用spring-integration-aws版本1.1.0.RELEASE开发的运动消费者应用程序。

在测试中,我正在同一使用者组中运行此应用程序的两个实例,并从具有两个分片的流中进行使用。在测试中,我意识到KinesisMessageDrivenChannelAdapter将以三种方式分发消息:

  1. 所有传递给一位消费者的邮件
  2. 分发给两个消费者的消息(不均匀)
  3. 两个消费者都收到了相同的消息

在生产者端,消息在两个分片之间平均分配。我想知道kinesis适配器如何在消费者之间分配消息,以及如果得到支持,我如何才能在消费者之间平均分配消息。

谢谢

UPDATE(适配器配置)

@Bean
  public KinesisMessageDrivenChannelAdapter kinesisInboundChannelAdapter(
      AmazonKinesis amazonKinesis) {
    String[] streamNames = this.consumerClientProperties.getKinesis().getStreamNames();
    KinesisMessageDrivenChannelAdapter adapter =
        new KinesisMessageDrivenChannelAdapter(amazonKinesis, streamNames);
    adapter.setConverter(null);
    adapter.setOutputChannel(new QueueChannel());
    adapter.setCheckpointStore(dynamoDbMetaDataStore());
    adapter.setCheckpointMode(CheckpointMode.record);
    adapter.setStartTimeout(10000);
    adapter.setConsumerGroup(consumerClientProperties.getName());
    adapter.setListenerMode(ListenerMode.record);
    adapter.setDescribeStreamRetries(1);
    return adapter;
  }

  @Bean
  public DynamoDbMetadataStore dynamoDbMetaDataStore() {
    DynamoDbMetadataStore dynamoDbMetaDataStore = new DynamoDbMetadataStore(amazonDynamoDB(),
        consumerClientProperties.getName());
    return dynamoDbMetaDataStore;
  }

1 个答案:

答案 0 :(得分:0)

建议所有人升级到最新的Spring Integration AWS 2.0https://spring.io/blog/2018/08/21/spring-integration-for-aws-2-0-ga-and-spring-cloud-stream-kinesis-binder-1-0-ga

在Kinesis消费者级别上进行了大量修复,现在我们进行的领导人选举不只一次订阅相同的分片。

我们的想法是在处理记录时要严格排序,因此每个群集中只有一个线程可以访问一个分片。该线程可能会处理多个分片。

无论如何,如果您使用应用程序的两个实例,则需要注入一个基于共享数据的MetadataStore,例如DynamoDbMetadataStore