Назад | Перейти на главную страницу

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

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

Предполагая, что я загружаю DynamoDB в правильном порядке (room: msg1, room: 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) Как создать сегменты Stream, гарантирующие согласованную доставку ключа раздела?

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

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

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

Означает ли это, что я могу достичь того, что мне нужно, автоматически? «Все предметы с одним и тем же разделом будут находиться в одном осколке». Уважает ли это Lambda?

5) Из Вопросы-Ответы:

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

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

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

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

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