0

Представьте загрузку файла на Amazon S3, и при успешном расположении файла (и метаданных) будет сохранено в записи в ElasticSearch. Хорошо, отлично.Как сохранить данные согласованными? (Amazon S3 и ElasticSearch)

Но, как вы обеспечить согласованность данных (ACID?), Если один из запроса не может ... Например, если услуга ElasticSearch является unavailible

  • файл на S3 должен быть удален
  • , но что делать, если удаление на S3 не выполнено

Это приведет к несогласованному состоянию.

Итак, вопрос в том, как вы храните эти экземпляры в синхронизации?

Идеи:

  • Если есть несогласованное состояние, и пользователь запрашивает запись ElasticSearch и ничего не найдено запись в S3 удаляется. (meeh)
  • Пакетные задания для поиска БД для несоответствий и их удаления.
  • Выполнить оба запроса в транзакции в базе данных, и если один терпит неудачу -> Откат и повторите попытку позже (очередь, работа = Overkill?)

ответ

0

ACID невозможно в этом случае, как вы работаете с в конечном счете, согласующихся систем ,

Ваше третье предложение наиболее близко к лучшим практикам.

Эталонная архитектура для этой системы заключается в том, чтобы записать объект в AWS S3, а затем использовать уведомления S3 Bucket в AWS Lambda для выполнения записи в Elasticsearch. В случае неудачной записи во время фазы уведомления из S3-> Lambda-> Elasticsearch, используйте очередь SQS с мертвой буквой для сбора неработающих заданий, затем периодически очищайте очередь с помощью CloudWatch Events-> Lambda в расписании по времени.