Question

Je pense ajouter une fonction de file d'attente dans un produit basé sur un ensemble de services WCF. J'en ai lu sur MSMQ, j'ai d'abord pensé que c'était ce dont j'avais besoin, mais je ne suis pas sûr et envisage de simplement mettre la file d'attente dans une table de base de données. Je me demande si quelqu'un ici a eu des commentaires sur la voie à suivre.

En gros, je prévois d'avoir un service WCF de façade appelé via http. Le service de façade ne doit écrire tous les messages entrants que dans une file d'attente pour donner une réponse rapide au système appelant. Les messages de la file d'attente doivent ensuite être traités par un autre composant, soit un service WCF, soit un service Windows selon mon choix de file d'attente.

Le produit fonctionne dans un environnement à charge équilibrée avec 2 à n serveurs Web.

Les options que j'envisage et les questions que j'ai sont:

  1. Pour laisser la façade WCF écrire dans un MSMQ puis faire lire un autre service WCF à partir de cette file d'attente pour effectuer le traitement des messages. Ce que je ne suis pas sûr pour cette alternative d'après ce que j'ai lu, c'est comment cela fonctionnera dans un environnement à charge équilibrée.

1A. Où placer le ou les MSMQ? Un sur chaque serveur Web? Un sur un serveur séparé? Mulitple sur un serveur séparé? (sans tenir compte du besoin de redondance et du fait que les données dans de rares cas pourraient être perdues et renvoyées)

1B. Comment la conception est-elle affectée si je veux que le système soit redondant? J'aimerais pouvoir perdre un serveur (il ne se remet jamais en ligne) tenant le MSMQ sans perdre les données de cette file d'attente. D'après ce que j'ai lu sur MSMQ, cela me laisse à la seule option de placer le MSMQ sur un cluster Windows. Est-ce exact? (Je voudrais éviter d'utiliser un cluster Windows pour cela).

  1. La deuxième alternative de conception consiste à laisser le service WCF de façade écrire la file d'attente dans une base de données. Ensuite, disposez de deux services Windows ou plus pour effectuer le traitement de la file d'attente. Je n'ai pas de questions sur cette alternative. Si vous vous demandez pourquoi je ne choisis pas celui-ci car il me semble plus simple, c'est parce que je voudrais le construire sans introduire de services Windows dans la solution, que je crois que MSMQ a des fonctionnalités que je ne veux pas code moi-même et je suis également curieux d'utiliser MSMQ car je ne l'ai jamais utilisé auparavant.

Meilleures salutations Håkan

Était-ce utile?

La solution 2

Après avoir lu un peu plus sur le sujet, j'ai décidé de ne pas utiliser MSMQ. Il semble que je n'ai vraiment aucune raison de s'engager dans cette voie. J'ai besoin que cela ne soit pas transactionnel et, d'après ce que je comprends, aucune des techniques de journalisation ou de lettre morte ne m'aidera à répondre à mes exigences de redondance.

Tous mes composants seront en ligne la plupart du temps (peut-être quelques heures par an lorsqu'ils ont des problèmes d'accès).

Le MSQM ne fera qu'ajouter de la complexité à la solution passionnante, une autre technique et peut-être un autre serveur à suivre.

Pour obtenir une redondance complète afin d'éviter la perte de données dans MSMQ, j'aurai besoin d'un cluster Windows ou implémenter l'envoi / la réception vers plusieurs files d'attente identiques. Je ne veux faire ni l'un ni l'autre.

Tout cela m'a conduit à présenter mon application de réception avec une façade WCF acceptant les appels http écrivant dans une file d'attente de base de données. Cette base de données est déjà protégée contre la perte de données. La file d'attente sera interrogée par plusieurs instances actives d'un serveur Windows contenant toute la logique métier lourde. Avec une faible priorité de processus, ces services pourraient être hébergés sur les nœuds déjà existants utilisés par l'application Web à charge équilibrée. Si j'ai le temps d'utiliser MSMQ ou si j'en avais besoin pour une autre raison dans ma candidature, je pourrais changer ma décision.

Autres conseils

OK, vous n'utilisez donc pas WCF avec l'intégration MSMQ, vous utilisez WCF pour créer des messages MSMQ en tant que produit final. Cela simplifie les choses: "Comment équilibrer la charge MSMQ?"

L'arrangement que vous utilisez est basé sur ce qui vous convient le mieux. Vous pouvez avoir plusieurs serveurs Web qui envoient des messages à une file d'attente distante sur une machine centrale. Au lieu de cela, vous pourriez avoir un serveur Web mettant les messages dans des files d'attente locales avec une machine centrale interrogeant les files d'attente pour les nouveaux arrivants.

Vous n'avez pas besoin de mettre en cluster MSMQ pour le rendre résilient. Vous pouvez à la place rendre votre code résilient afin qu'il fasse face aux messages perdus en utilisant des files d'attente de lettres mortes, des files d'attente transactionnelles, la journalisation, etc. Le clustering matériel est l'option la plus simple :-)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top