Я хочу использовать 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
Порядок записей по разным шардам не гарантируется, и обработка каждого шарда происходит параллельно.