Question

Je me demande si elle est une bonne idée de laisser les applications locales (dans le même serveur) communiquent entre eux entièrement par API RESTful?

Je sais que ce n'est pas une chose rare, parce que nous avons déjà des applications comme CouchDB qui utilise REST HTTP pour la communication, même avec des applications locales.

Mais je veux le prendre à un niveau supérieur en créant des applications qui agissent comme des modules pour une application plus grande, ce qui pourrait aussi être un module pour une autre application et ainsi de suite. En d'autres termes, il y aura beaucoup d'applications locales / modules qui communiquent avec API RESTful.

De cette façon, ces applications / modules pourraient être dans toutes les langues et ils pourraient communiquer sur le fil entre les serveurs.

Mais j'ai quelques questions:

  • Est-ce une bonne idée?
  • Est-ce que le transfert de données entre elles lente?
  • Si je le fais, chaque application / modules doivent être un droit serveur HTTP? Donc, si mon application utilise 100 applications / modules puis chacun d'entre eux doivent être un serveur Web HTTP local chaque cours d'exécution sur un autre port (http: // localhost: 81, http: // localhost: 82 , http: // localhost: 83 et ainsi sur) droit?
  • Toutes les meilleures pratiques / gotchas que je sache de?
Était-ce utile?

La solution

  • Est-ce une bonne idée?

Bien sûr, peut-être.

  • Est-ce que les données transfert entre eux soit lent?

Eh oui! Mais par rapport à quoi? Par rapport aux natifs, les appels internes, tout à fait - ce sera glaciaire. Par rapport à une autre API réseau, hein, pas forcément plus lent.

  • Si je cela, chaque application / module de doivent être un droit serveur HTTP? Donc si mon application utilise 100 applications / modules I doivent avoir 100 serveurs HTTP Web locaux vers le haut et l'exécution de chaque autre port avec (Http: // localhost: 81, http: // localhost: 82 , http: // localhost: 83 et ainsi de suite)

Non, aucune raison d'attribuer un port par module. Toutes sortes de façons de le faire.

  • Tous les meilleures pratiques / gotchas que je connaître?

La seule façon réussira est si les services dont vous parlez sont assez grossiers. Ceux-ci doivent être grands types boxy noirs de services qui font les frais de les appeler la peine. Vous serez encourir des coûts de connexion, les coûts de transfert de données et les données marshaling coût sur chaque transaction. Donc, vous voulez que ces transactions soient aussi rares que possible, et vous voulez que les charges utiles soient aussi grande que possible pour tirer le meilleur bénéfice.

Vous parlez réellement utiliser l'architecture REST ou tout simplement envoyer des trucs et-vient via HTTP? (Ce sont des choses différentes) REST engage ses propres coûts, notamment les liens intégrés, les types de données omniprésents et communs, etc.

Enfin, vous pouvez tout simplement pas besoin de faire cela. Il pourrait bien être « assez cool », un « agréable d'avoir », « semble bon sur le tableau blanc », mais si, vraiment, ne pas avoir besoin, alors ne le faites pas. Il suffit de suivre les bonnes pratiques d'isoler vos services internes afin que si vous décidez plus tard pour faire quelque chose comme cela, il vous suffit d'insérer la couche de colle nécessaire pour gérer la communication, etc. L'ajout de distribution à distance augmentera les risques, la complexité et des performances moindres, (mise à l'échelle ! = performance) donc il devrait y avoir une bonne raison de le faire du tout.

Ce, sans doute, est la "meilleure pratique" de tous.

Edit - Réponse au commentaire:

  

Vous voulez dire que je lance un serveur web qui   traiter toutes les demandes entrantes? Mais alors   les modules ne seront pas autonomes   applications, ce qui contrecarre l'ensemble   objectif. Je veux chacun des   modules pour être en mesure de fonctionner par lui-même.

Non, il ne bat pas le but.

Voici l'affaire.

Disons que vous avez 3 services.

En bref, il serait juste de dire que ces trois services différents, sur 3 machines différentes, en cours d'exécution en 3 serveurs Web différents.

Mais la vérité est que ceux-ci peuvent tous être en cours d'exécution sur la même machine, sur le serveur Web SAME, même jusqu'à (pour prendre ce à l'extrême) en cours d'exécution exactement la même logique.

HTTP vous permet de cartographier toutes sortes de choses. HTTP est lui-même mécanisme d'abstraction.

En tant que client tout ce que vous aimez est l'URL à utiliser et la charge utile d'envoyer. Sur quelle machine il finit par parler, ou quel code réel, il l'exécute pas le problème des clients.

Au niveau de l'architecture, vous avez réalisé une manière d'abstraction et de la modularisation. Les URL vous permettent d'organiser votre système est tout LOGIQUE mise en page que vous voulez. La mise en œuvre physique est distincte de la vue logique.

Les 3 services peuvent être en cours d'exécution sur une seule machine desservie par un seul processus. D'autre part, ils peuvent représenter 1000 machines. Combien de machines pensez-vous répondre à « www.google.com "?

Vous pouvez facilement accueillir tous les 3 services sur une seule machine, sans partager tout code de sauvegarde du serveur Web lui-même. Faire de déplacer facilement un service de sa machine d'origine à une autre machine.

Le nom d'hôte est le plus simple moyen de mapper un service à une machine. Tout serveur web moderne peut servir un certain nombre de différents hôtes. Chaque « hôte virtuel » peut desservir un certain nombre de critères d'évaluation de services individuels dans l'espace de nom de cet hôte. Au niveau « hôte » son trivial déménagerais d'une machine de code à un autre si et quand vous devez.

Vous devriez explorer plus les capacités d'un serveur web moderne pour diriger les requêtes arbitraires à la logique réelle sur le serveur. Vous les trouverez très flexible.

Autres conseils

  

Est-ce une bonne idée?

Oui. Il a fait tout le temps. C'est ainsi que fonctionnent tous les serveurs de base de données, par exemple. Linux est rempli d'applications client / serveur de communication via TCP / IP.

  

Est-ce que le transfert de données entre elles lente?

Non. TCP / IP utilise localhost comme raccourci pour sauver faire réseau réel E / S.

Le protocole HTTP n'est pas la meilleure chose pour les connexions dédiées, mais il est simple et bien pris en charge.

  

Si je le fais, chaque application / modules doivent être un droit serveur HTTP?

Pas nécessairement. Certains modules peuvent être des clients et ne pas avoir un serveur.

  

Donc, si mon application utilise 100 applications / modules puis chacun de ceux-ci doivent être un serveur Web HTTP local chaque cours d'exécution sur un autre port (http: // localhost: 81, http: // localhost: 82 , http: // localhost: 83 et ainsi de suite) à droite?

Oui. C'est la façon dont il fonctionne.

  

Les meilleures pratiques / Gotchas que je ne connais?

Ne pas "hard-code" numéros de port.

Ne pas utiliser les numéros de port "privilégiés" (en 1024).

Utilisez une bibliothèque WSGI et vous serez plus heureux faites tous vos modules dans des applications WSGI. Vous pouvez ensuite utiliser un trivial serveur HTTP 2 en ligne pour envelopper votre module.

Lisez ceci. http://docs.python.org/library/wsgiref.html#examples

En utilisant des solutions reposant pour l'intégration des applications, je crois que c'est une bonne idée et professe des vues similaires à une autre question.

Pour être franc, je ne pense pas que vous avez besoin de 100 serveurs pour 100 applications, peut-être juste utiliser 100 ports sur le même serveur.

et aussi, l'interface RESTful vous donnera la flexibilité nécessaire pour étendre les serveurs et activer l'équilibrage de charge si vous voulez avoir la possibilité d'évoluer jusqu'à énorme.

Non - ce n'est pas une bonne idée si vous n'avez pas une bonne raison. Il est une bonne idée de couche le code de votre application de sorte qu'il peut être « reposé » à un stade ultérieur en cas de besoin. (Ou quelle que soit l'amélioration des performances est jugée nécessaire.) La complexité accrue de déploiement « couches à base de serveur » est une bonne raison de ne pas le faire. Je suggère:

  • Ecrire une application bien structuré avec le code bon, propre.
  • Testez avec des charges de production attendues
  • si nécessaire - factoriser en couches qui sont des serveurs - mais .....

Une meilleure approche consiste à équilibrer la charge de l'application. Si vous faites quelque chose comme des rails sans état dans le serveur d'application, il devrait y avoir aucun problème à exécuter plusieurs instances en parallèle.

Si vous êtes à la recherche de la complexité - ne pas tenir compte ma réponse. : -)

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