Question

Comment envoyer des messages entre les entreprises . Si je décide que la société S (ournisseur) devrait interroger les commandes de la société (B) dans une HTTP simple basée Way quelle est la meilleure mise en œuvre.

  • Je suppose que la société B a un serveur Web en cours d'exécution et la base de données principale de ce serveur Web est durable. Nous devons faire en quelques hypothèses possibles sur un processus de stockage à S et si elles sont en mesure de maintenir l'état (par exemple une liste de GUIDs déjà transmis)
  • La connexion Internet entre B et S est peu fiable.
  • Nous devons atteindre cohérence éventuelle qui signifie à un moment donné dans le temps entre tous les ordres B et S doit être transféré.

Quelle est la meilleure pratique pour mettre en œuvre un tel système?

Était-ce utile?

La solution

Une approche de ce genre de problème est d'utiliser une sorte de produit faire la queue, comme une personne IBM je considère immédiatement MQ. Cependant, comme je ne suis pas en fait personne MQ moi-même, comme vous, je serais probablement heureux avec l'approche basée sur les services que vous prenez.

Il existe deux approches possibles qui viennent à l'esprit. La première consiste à utiliser le WS fiable messagerie , qui pousse le problème de la fiabilité vers le bas dans le service Web Infrastructure. L'autre est le protocole à manivelle votre propre fiable au-dessus de simple, mais peu fiables, des services.

Je n'ai pas eu de graves expérience pratique de la mise en œuvre d'un système avec WS messagerie fiable, je crois qu'il peut être au travail, mais il ne nécessite un certain degré de contrôle sur les participants - comme il est un nous norme relativement récente ne peut pas garantir que toute donnée informatique magasin aura une mise en œuvre à la main, et l'interopérabilité entre les fournisseurs peut être un problème. Plus je contrôle sur les piles de SW à chaque extrémité plus enclin que je serais à utiliser WS messagerie fiable. [Je dois mentionner WS Transaction atomique aussi, qui peut également être utilisé pour construire des services realiable, les mêmes préoccupations inter-op appliquent.]

Alors qu'en est-à rouler propre? La clé est ici pour faire tous les services idempotent. Comme nous n'avons pas garanties transactionnelles qui couvrent les deux systèmes, nous devons supposer que tout appel de service donné peut échouer avec le résultat inconnu.

Je vais supposer que B veut avoir la confirmation que S a pris une ordonnance, donc nous avons besoin des informations de mise à jour à la fois B et S lorsqu'une commande est transférée.

B doit offrir des services tels que ceux-ci:

 Give me the next order(s)

 I have stored {orders ...}

Alors, comment définissons-nous « à côté ». Le cas le plus simple fonctionne bien si les volumes que nous traitons peuvent nous permettre d'avoir un « fil » de transfert. Alors B est cochant les ordres envoyés un à la fois, et les commandes ont une pièce d'identité de plus en plus de façon monotone. On peut alors simplifier à:

 I have stored order <65,004> please give me the next

Notez que ceci est une demande de idempotent: il peut en toute sécurité être répétée plusieurs fois. A noter également que S doit prévoir la possibilité d'obtenir le même ordre deux fois, et vérifier les doublons.

Autres conseils

Ce que vous cherchez probablement est validation en deux phases. Il est bien décrit dans Internet, par exemple ici:

http://en.wikipedia.org/wiki/Two-phase_commit_protocol

L'essentiel de celui-ci:

Le commettras processus se déroule comme suit:

* Phase 1
      o Each participating resource manager coordinates local 
        operations and forces all log records out:
      o If successful, respond "OK"
      o If unsuccessful, either allow a time-out or respond "OOPS" 
* Phase 2
      o If all participants respond "OK":
            * Coordinator instructs participating resource managers to "COMMIT"
            * Participants complete operation writing the log record
              for the commit 
      o Otherwise:
            * Coordinator instructs participating resource managers to "ROLLBACK"
            * Participants complete their respective local undos 

Les travaux devraient pour tout type de données.

D'accord, tout d'abord vous ne pouvez pas garantie rien sur un lien peu fiable. problème Deux généraux de prouve pour les deux protocoles déterministes et non déterministes. Tout ce que vous pouvez faire est d'atténuer le manque de fiabilité à un degré acceptable.

La méthode la plus simple est, dans votre cas, une fois que le serveur reçoit une requête de sondage, il envoie le numéro de x des réponses, tous avec le même GUID. Par exemple.

S: B, anything new?
S: B, anything new?
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
B: Yes, S, I need some shoes (order #124).
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
B: Yes, S, I need some shoes (order #124).
S: B, anything new?
B: Yes, S, I need some shoes (order #124).
S: B, anything new?
B: Yes, S, I need some shoes (order #124).
...

S peut obtenir avec des commandes spammé, mais puisque le # est envoyé avec chaque demande, ce n'est pas une grosse affaire. Si nous l'avons raté avant, nous recevons maintenant. Si nous n'avons pas avant, Woohoo! Nous l'avons maintenant. Le système fonctionne! Vous remarquerez que B envoie des messages 5 fois dans mon exemple. Dans un scénario réaliste, vous auriez probablement des centaines envoyer un message ou des milliers de fois, jusqu'à ce que vous avez la fiabilité voulue.

Maintenant, la solution ci-dessus est le traitement et la bande passante intensive, mais il fonctionne. Une méthode plus intelligente est de faire ce que TCP ne. A une poignée de main à trois voies

S: Hello B. Are you there? -> SYN
B: Hello S, yep I'm here. What's up? -> SYN+ACK
S: Oh good, you're there. -> ACK
S: B, anything new?
B: Yes, S, I need a jacket (order #123).

Mais .. HTTP fait déjà. Donc, si quelque chose ne va pas quelque part, vous saurez. Délai de connexion dépassé, la connexion a cassé, etc.

Maintenant, vous pouvez ré-écrire ces scénarios dans le niveau de l'application (entrer WS-ReliableMessaging), mais vraiment TCP est déjà fiable. Certains critiques de ces SOAP (ish) cadres et faux-protocoles (ils travaillent habituellement au-dessus de HTTP) les accusent de essentiellement réinventer la roue - et les problèmes de la roue -. À un niveau supérieur d'abstraction

L'essentiel est que tout système peut échouer, y compris les systèmes de messagerie fiables.

En ce qui concerne la cohérence éventuelle est, je pense que vous pouvez être confus. cohérence dans le temps applique uniquement aux systèmes de stockage distribués où après une Write(), vous ne pouvez pas être en mesure de récupérer avec un déterministe Read() pendant un certain temps. Cela ne semble pas votre problème. Je veux dire, je vois ce que vous dites, mais dans un système de eventually consistent, une connexion fiable (de suffisamment) est supposé entre les nœuds. Vous ne faites pas cette hypothèse (même si je pense que vous devriez .. TCP est sacrément fiable).

Miser sur ce que, dina mentionné. Webservices serait une solution parfaite au problème ci-dessus. Certains protocole peut être convenu qui définirait le nombre d'enregistrements.

S ---> D ( Call a service which would list record keys)
D----> S ( provide xml of keys)
S----> D ( Request each of the records)
D----> S ( Submit record)

Dans le cas d'une nouvelle entrée d'enregistrement étant effectué après la synchronisation, Destination peut invoquer un service déployé à la source, qui traiterait un nouveau record.

Puisque la communication est gérée acheter un moteur de service Web, ne vous inquiétez pas au sujet des paramètres de message. SSL peut être ajouté pour la sécurité.

Vive!

Je pense que vous essayez de dire que la société B est un participant passif. S (fournisseur) a juste besoin de la possibilité d'obtenir toutes les commandes que les postes B (cohérence éventuelle). Mais B n'a pas besoin ou de soins sur ce que les ordres a déjà (pas besoin de commettre).

Si la société B a une horloge semi-précis, vous pouvez utiliser la date comme le GUID de plus en plus de façon monotone, selon la résolution des événements - vous ne voudrez pas au vote si vous avez besoin de résolution milliseconde de toute façon. Vous utilisez uniquement l'horloge B de sorte que vous n'avez pas à vous soucier de la synchronisation. Si B publie toutes les commandes, S peut simplement prendre les commandes de l'endroit où il avait laissé la dernière.

Je ne sais pas si vous vouliez dire les meilleures pratiques ou meilleures pour un compromis facile à mettre en œuvre le système. En fonction du volume et de temps de réponse, il n'y a pas besoin d'en faire un système dynamique si vous êtes de toute façon de vote. Dump commandes sous forme de fichiers texte (nommés par horodatage) dans un répertoire nommé par la date et les tirer vers le bas (ou de manière sélective). Vous pouvez même les stocker dans des répertoires à l'heure ou tout sens. HTTP GET est idempotent.

Cela pourrait être laid, mais il semble que vous ne vous attendez pas beaucoup la complexité de la société B. Utiliser SSL et auth et il est verrouillé et crypté.

Si vous ne avez besoin de performances, il est faux de rien avec simple. Qu'est-ce que vous gagnez vraiment d'un protocole compliqué?

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