Вопросы

Вопросы

Я хочу использовать 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) Как создать потоковые сегменты, гарантирующие согласованную доставку ключей разделов?

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

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

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

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

5) ИзЧасто задаваемые вопросы:

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

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

решение1

Помог ли этот ответ?

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

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

Связанный контент