0

Imaginez un téléchargement de fichiers sur Amazon S3 et, en cas de succès, l'emplacement du fichier (et des métadonnées) est stocké dans un enregistrement dans ElasticSearch. OK, c'est bon.Comment garder les données cohérentes? (Amazon S3 et ElasticSearch)

Mais, comment assurez-vous la cohérence des données (ACID?) Si l'une de la demande échoue ... Par exemple, si le service est ElasticSearch unavailible

  • le fichier sur S3 doit être supprimé
  • mais si la suppression sur S3 échoue

cela conduirait à un état incohérent. Donc, la question est de savoir comment garder ces instances en synchronisation?

Les idées sont:

  • S'il y a un état incohérent et l'utilisateur demande l'enregistrement ElasticSearch et rien se trouve l'enregistrement dans S3 est supprimé. (meeh)
  • Travail par lots pour rechercher des incohérences dans la base de données et les supprimer.
  • Exécuter les requêtes dans une transaction dans la base de données et si l'on ne réussit pas -> rollback et une nouvelle tentative plus tard (file d'attente, emploi = Overkill?)

Répondre

0

ACID est impossible dans ce cas, que vous travaillez avec des systèmes à terme cohérents .

Votre troisième suggestion est la plus proche des meilleures pratiques.

L'architecture de référence de ce système consiste à écrire l'objet dans AWS S3, puis à utiliser les notifications S3 Bucket dans AWS Lambda pour effectuer l'écriture dans Elasticsearch. Dans le cas d'une écriture échouée pendant la phase de notification de S3-> Lambda-> Elasticsearch, utilisez une file d'attente SQS morte pour collecter les travaux interrompus, puis vider la file d'attente périodiquement en utilisant CloudWatch Events-> Lambda sur une planification temporisée.