Предположим, мы используем триггеры AWS в таблице DynamoDB, и этот триггер должен запустить лямбда-функцию, задача которой - обновить запись в CloudSearch (чтобы синхронизировать DynamoDB и CS).
Я не очень понимаю, как Lambda всегда синхронизирует данные с данными в DynamoDB. Рассмотрим следующий поток:
- Приложение обновляет запись A таблицы DynamoDB (скажем, до A1)
- Очень близко после этого приложение обновляет ту же запись A той же таблицы (до A2)
- Триггер для 1 заставляет лямбда, равную 1, начать выполнение
- Триггер для 2 заставляет лямбду 2 начать выполнение
- Шаг 4 выполняется первым, поэтому CloudSearch видит A2
- Шаг 3 завершен, поэтому CloudSearch видит A1.
Не гарантируется, что лямбда-триггеры будут запускаться ТОЛЬКО после завершения предыдущего вызова (исправьте, если нет, и предоставьте мне ссылку)
Как видим, дело не в синхронизации.
Самое близкое, что я могу придумать, - это использовать AWS Kinesis Streams, но и те, что тоже с одним Shard (ограничение в 1 МБ в ps). Если это ограничение работает, то ваше потребительское приложение может быть написано таким образом, чтобы запись сначала обрабатывалась последовательно, то есть только после того, как предыдущая запись была помещена в CS, должна быть обработана следующая запись. Предполагая, что вышеупомянутое утверждение верно, как обеспечить правильную синхронизацию, если в DynamoDB поступает так много данных, что в Kinesis требуется более одного осколка?