web-dev-qa-db-fra.com

Utilisation d'Amazon SQS avec plusieurs consommateurs

J'ai une application basée sur les services qui utilise Amazon SQS avec plusieurs files d'attente et plusieurs consommateurs. Je le fais pour pouvoir implémenter une architecture basée sur les événements et découpler tous les services, où les différents services réagissent aux changements d'état d'autres systèmes. Par exemple:

  • Service d'enregistrement:
    • Émet l'événement "registration-new" lorsqu'un nouvel utilisateur s'enregistre.
  • Service utilisateur:
    • Émet l'événement "mis à jour par l'utilisateur" lorsque l'utilisateur est mis à jour.
  • Service de recherche:
    • Lit à partir de la file d'attente "enregistrement-nouveau" et indexe l'utilisateur dans la recherche.
    • Lit dans la file d'attente "mis à jour par l'utilisateur" et met à jour l'utilisateur dans la recherche.
  • Service de métriques:
    • Lit à partir de la file d'attente "registration-new" et envoie à Mixpanel.
    • Lit à partir de la file d'attente "mise à jour par l'utilisateur" et envoie à Mixpanel.

J'ai un certain nombre de problèmes:

  • Un message peut être reçu plusieurs fois lors de l'interrogation. Je peux concevoir de nombreux systèmes pour qu'ils soient idempotents, mais pour certains services (comme le service de métriques), ce serait beaucoup plus difficile.
  • Un message doit être supprimé manuellement de la file d'attente dans SQS. J'ai pensé à mettre en place un "service de gestion des messages" qui gère la suppression des messages lorsque tous les services les ont reçus (chaque service émettrait un événement "message-accusé de réception" après avoir manipulé un message).

Je suppose que ma question est la suivante: quels modèles dois-je utiliser pour m'assurer que je peux avoir plusieurs consommateurs pour une seule file d'attente dans SQS, tout en veillant à ce que les messages soient également livrés et supprimés de manière fiable. Merci de votre aide.

24
user2205763

Je pense que vous vous trompez.

Il me semble que vous utilisez la même file d'attente pour faire plusieurs choses différentes. Il vaut mieux utiliser une seule file d'attente dans un seul but.

Au lieu de mettre un événement dans la file d'attente `` registration-new '', puis de demander à deux services différents d'interroger cette file d'attente, les DEUX ayant besoin de lire ce message et de faire quelque chose de différent avec lui (et d'avoir ensuite besoin d'un 3e processus qui est censé le supprimer) message après que les 2 autres l'ont traité).

Une file d'attente doit être utilisée dans un seul but.

  • Créez une file d'attente "index-user-search" et une file "send to mixpanels" pour que le service de recherche lise à partir des files d'attente de recherche, indexe l'utilisateur et supprime immédiatement le message.

  • Le service mixpanel lit à partir de la file d'attente mix-panels, traite le
    et supprime le message.

Le service d'enregistrement, au lieu d'émettre un "enregistrement nouveau" vers une seule file d'attente, l'émet maintenant vers deux files d'attente.

Pour aller plus loin, ajoutez SNS dans le mélange ici et demandez au service d'enregistrement d'émettre un message SNS dans la rubrique 'registration-new' (pas la file d'attente), puis abonnez-vous aux deux files d'attente que j'ai mentionnées ci-dessus, à ce sujet dans un modèle de "fan-out".

https://aws.Amazon.com/blogs/aws/queues-and-notifications-now-best-friends/

Les deux files d'attente recevront le message, mais vous ne le chargez qu'une seule fois dans SNS - si en cours de route, un troisième service non lié doit également traiter les événements `` enregistrement-nouveau '', vous créez une autre file d'attente et vous y abonnez également - il peut courir sans dépendances ni connaissance de ce que font les autres services - c'est le but.

39
E.J. Brennan