I have a kinesis consumer application developed using spring-integration-aws
version 1.1.0.RELEASE
.
In my tests, I am running two instance of this application in the same consumer group and consuming from a stream with two shards. In my tests I realized KinesisMessageDrivenChannelAdapter
would distribute messages in three ways:
- All messages delivered to one consumer
- messages distributed to the both consumers (not evenly)
- Both consumers received same messages
From producer side, messages are distributed evenly between two shards. I would like to know how kinesis adapter distributes messages among consumers and if supported how I can get an even distribution among consumers.
Thank you
UPDATE (Adapter Configuration)
@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;
}