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