Есть несколько вещей, которые следует учитывать. Прежде всего, производитель в Binder основан на режиме KinesisMessageHandler
с async
по умолчанию:
messageHandler.setSync(producerProperties.getExtension().isSync());
Таким образом, даже если вам кажется, что вы отправляете эти сообщения в правильном порядке одно за другим, это не означает, что они достигают потока в AWS в том же порядке.
Также нет никакой гарантии, что они в любом случае рассчитываются на AWS в том же порядке, даже если вы отправляете их в режиме синхронизации.
Смотрите здесь: Amazon Kinesis и гарантированный заказ
Также вы можете получить гарантию заказа в том же шарде с помощью явного sequenceNumber
:
Чтобы гарантировать строго возрастающее упорядочение, пишите последовательно в шард и используйте параметр SequenceNumberForOrdering.
https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecord.html
К сожалению, в данный момент Kinesis Binder не поддерживает эту опцию, но мы можем преодолеть ее с помощью явного AwsHeaders.SEQUENCE_NUMBER
, установленного в сообщении, перед отправкой его в output
пункт назначения Binder:
String sequenceNumber = messageHeaders.get(AwsHeaders.SEQUENCE_NUMBER, String.class);
if (!StringUtils.hasText(sequenceNumber) && this.sequenceNumberExpression != null) {
sequenceNumber = this.sequenceNumberExpression.getValue(getEvaluationContext(), message, String.class);
}