DynamoDB Streams с Lambda, как обрабатывать связанные сообщения по порядку?

Я хочу использовать DynamoDB Streams + AWS Lambda для обработки сообщений чата. Сообщения, касающиеся одного и того же разговора user_idX: user_idY (комната), должны быть обработаны по порядку. Глобальный порядок не важен.

Предполагая, что я передаю DynamoDB в правильном порядке (комната: msg1, комната: msg2 и т. Д.), Как гарантировать, что Stream будет передавать AWS Lambda последовательно, с гарантированным порядком обработки связанных сообщений (комнаты) в одном потоке?

Например, учитывая, что у меня 2 шарда, как убедиться, что логическая группа переходит в тот же шард?

Я должен сделать это:

Shard 1: 12:12:msg3 12:12:msg2 12:12:msg1 ==> consumer
Shard 2: 13:24:msg2 51:91:msg3 13:24:msg1 51:92:msg2 51:92:msg1 ==> consumer

И не это (сообщения соответствуют порядку, который я сохранил в базе данных, но они помещаются в разные осколки, таким образом неправильно обрабатывая разные последовательности для одной комнаты параллельно):

Shard 1: 13:24:msg2 51:92:msg2 12:12:msg2 51:92:msg2 12:12:msg1 ==> consumer
Shard 2: 51:91:msg3 12:12:msg3 13:24:msg1 51:92:msg1 ==> consumer

Это официальное сообщение упоминает об этом, но я не смог найти нигде в документации, как это реализовать:

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

Вопросы

1) Как установить ключ разделения в DynamoDB Streams?

2) Как создать потоковые осколки, которые гарантируют согласованную доставку ключей разделов?

3) Это действительно возможно в конце концов? Поскольку в официальной статье упоминается: данный ключ будет присутствовать не более чем в одном из набора фрагментов одноуровневого типа, которые активны в данный момент времени, поэтому кажется, что msg1 может перейти к фрагменту 1, а затем к msg2 - 2, как мой пример выше?

4) В этом вопросе я нашел это:

Количество сегментов в вашем потоке зависит от количества разделов в таблице. Так что если у вас есть таблица DDB с 4 разделами, то в вашем потоке будет 4 шарда. Каждый шард соответствует определенному разделу, поэтому, поскольку все элементы с одинаковым ключом раздела должны присутствовать в одном и том же разделе, это также означает, что эти элементы будут присутствовать в одном и том же сегменте.

Значит ли это, что я могу автоматически достичь того, что мне нужно? Msgstr "Все элементы с одинаковым разделом будут присутствовать в одном и том же осколке". Лямбда уважает это?

5) Из FAQ:

Порядок записей в разных шардах не гарантируется, и обработка каждого шарда происходит параллельно.

Меня не волнует глобальный порядок, просто логичный, как в примере. Тем не менее, не ясно, логически ли группируются осколки с этим ответом из FAQ.

1 ответ

Этот ответ помогает?

https://stackoverflow.com/questions/44266633/how-do-dynamodb-streams-distribute-records-to-shards

Порядок записей в разных шардах не гарантируется, и обработка каждого шарда происходит параллельно.

Другие вопросы по тегам