2009-11-03 3 views
4

J'ai plusieurs consommateurs concurrents distribués tirant chacun des messages de la même file d'attente (transactionnelle). Je veux implémenter chaque consommateur comme un Idempotent Receiver ainsi je ne traite jamais le même message plus d'une fois (à travers tous les consommateurs) même si un double arrive. Comment puis-je accomplir cela avec plusieurs consommateurs? Ma première pensée est de générer en quelque sorte un numéro de séquence consécutif pour chaque message avant de les mettre dans la file d'attente, puis d'utiliser une table de base de données partagée pour coordonner le travail entre les consommateurs. C'est à dire. Le consommateur n ° 1 traite le msg n ° 1 puis écrit une ligne dans la table DB en disant "msg # 1 est traité" (le souhaite dans une base de données pour assurer la durabilité). Lorsqu'un consommateur est prêt à traiter un message, il passe en revue le suivant disponible dans la file d'attente, consulte la table DB partagée et détermine s'il s'agit du message suivant dans l'ordre. Si c'est le cas, il l'enlève de la file d'attente. Sinon, il l'ignore. De cette façon, j'ai seulement besoin de stocker le dernier message traité (comme il y a un numéro de séquence consécutif pour tous les msgs), je n'ai pas besoin d'utiliser un tampon stockant les ID de tous les messages reçus avec une fenêtre négociée 'taille, et les messages sont toujours traités en série (ce qui est ce que je veux pour ce scénario).Comment assurer l'idempotence des messages avec plusieurs consommateurs concurrents?

Juste curieux s'il y a un meilleur moyen? Je suis préoccupé par le coût de l'interrogation de la base de données chaque fois que j'ai besoin de traiter un message.

Si la réponse est « cela dépend du cadre », alors j'avais MSMQ à l'esprit

Répondre

1

Le point de récepteur est idempotent qui est n'a pas d'importance si un message est traité plusieurs fois. Par conséquent, les récepteurs idempotents ne doivent somhow détecter qu'un message est un double, ils peuvent tout simplement le traiter comme d'habitude ...

Donc, soit votre récepteur ne soit pas idempotente, ou vous vous inquiétez inutilement ...

+0

Si ma logique de traitement API/message est conçu de manière à être idempotent alors oui, je ne suis pas à me soucier de recevoir msgs en double. Ce n'est pas le cas pour mon scénario. J'ai besoin de filtrer les messages en double et pas seulement pour une instance d'un consommateur mais sur plusieurs instances. – emertechie

+0

Mais que se passe-t-il si je suis le seul moyen de garantir l'idempotence en évitant que les effets secondaires se produisent une seconde fois? –

0

Andrew -

Une autre option consiste à regarder comment votre file d'attente gère les messages. Il y a des files d'attente qui suppriment des messages après qu'ils ont été récupérés par un consommateur. C'est un comportement typique pour une file d'attente et il ne devrait pas être difficile de trouver une file d'attente avec ce type de fonctionnalité. Cela devrait vous fournir une solution simple au lieu de la construction d'un moyen pour chaque consommateur pour s'assurer qu'ils ne reçoivent pas un message qui a déjà été traité par un autre consommateur.

Best, Henry

Questions connexes