Quel est le plus efficace node.js communication inter-processus de bibliothèque/méthode?
Nous avons quelques node.js les processus qui devrait être en mesure de transmettre des messages,
Quel est le moyen le plus efficace de faire cela?
Comment sur l'utilisation de node_redis pub/sub
EDIT: les processus peuvent s'exécuter sur des machines différentes
- aucun, je voudrais avoir une idée de ce que devrais-je essayer..quelles sont les possibilités?
- TCP, UDP, les sockets UNIX
- eh bien, je suis à la recherche d'une bibliothèque , que diriez-vous redis(pub/sub)?
- inter processus communication entre les machines doit être fait sur les sockets. Vous pouvez le faire par le biais d'une base de données comme le redis mais qui a pour aller sur le réseau. UDP est va être le plus efficace.
- UDP n'est pas fiable (il y a duplication de paquets, le paquet de commande n'est pas garanti) et n'est pas apte pour le scénario qu'il décrit. Son bon pour des trucs comme hearbeats, DNS, la diffusion ou la mise en œuvre de votre propre protocole.
- Il y a une bonne discussion ici: groups.google.com/forum/?fromgroups=#!topic/nodejs/Pxbb_kgOQEs
- Vous êtes à la recherche d'envoyer de point à point, la diffusion, ou les deux? Aucun souci au sujet de la fiabilité de la livraison?
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez envoyer des messages à partir d'une machine à une autre et ne se soucient pas de rappels puis Redis pub/sub est la meilleure solution. Il est vraiment facile à mettre en œuvre et Redis est vraiment très rapide.
Vous devez d'abord installer le Redis sur une de vos machines.
Son vraiment facile de se connecter à Redis:
Mais ne pas oublier l'ouverture Redis port dans votre pare-feu!
Ensuite, vous devez souscrire chaque machine à certains canaux:
Vous pouvez sauter
your_namespace
et utiliser l'espace de noms global, mais vous allez le regretter tôt ou tard.Il est vraiment facile pour envoyer des messages, trop:
Si vous souhaitez envoyer des différents types de messages, vous pouvez utiliser pmessages au lieu de messages:
La meilleure pratique consiste à donner un nom à votre processus (ou des machines) par leur fonctionnalité (par exemple,
'send_email'
). Dans ce cas, le processus (ou la machine) peuvent être abonné à plus d'un canal si elle met en œuvre plus d'une fonctionnalité.En fait, il est possible de construire une communication bi-directionnelle à l'aide de redis. Mais c'est plus délicate, car il aurait besoin pour ajouter unique de rappel nom de la chaîne à chaque message afin de recevoir de rappel sans perdre contexte.
Donc, ma conclusion est: est-ce Utiliser Redis si vous avez besoin d' "envoyer et oublier", de communication, d'enquêter sur une autre solutions si vous en avez besoin à part entière de la communication bi-directionnelle.
json.parse
etjson.stringify
. Je l'utilise nodejs pour mon gameserver et sont à l'aide de 3, 4, et encore plus de nœud de toutes les instances de communiquer avec le Redis (donc je peux faire la mise à l'échelle horizontale) -- et c'est un aRPG jeu que je suis en train d'élaborer ainsi, par exemple, l'attaque d'un mob, le déplacement, et ce genre de trucs ça va être très occupé. Encore faudrait-il être beau? Ou suis-je la frontière-ligne preMatureOptimization penser dès maintenant? MerciPourquoi ne pas utiliser ZeroMQ/0mq pour l'IPC? Redis (une base de données) est de plus en plus de tuer pour faire quelque chose d'aussi simple que l'IPC.
Citant le guide:
L'avantage de l'utilisation de 0MQ (ou même de vanille prises par net-library dans le Nœud de base, moins toutes les fonctionnalités fournies par un 0MQ socket) est qu'il n'y a pas de maîtriser le processus. Ses courtier en moins de réglages est le meilleur ajustement pour le scénario que vous décrivez. Si vous êtes juste de pousser des messages sur différents nœuds d'un processus central, vous pouvez utiliser PUB/SUB prise en 0mq (prend également en charge la multidiffusion IP via PGM/EPGM). En dehors de cela, 0mq prévoit également différents types de socket (PUSH/PULL/objet xrep/XREQ/ROUTEUR/REVENDEUR) avec lequel vous pouvez créer des dispositifs personnalisés.
Commencer avec cet excellent guide:
http://zguide.zeromq.org/page:all
Pour 0MQ 2.x:
http://github.com/JustinTulloss/zeromq.node
Pour 0MQ 3.x (Une branche du dessus du module. Cet ÉDITEUR prend en charge le filtrage côté pour PUBSUB):
http://github.com/shripadk/zeromq.node
Plus de 4 ans après la question été demander, il est un système de communication interprocessus module appelé nœud-cib. Il prend en charge unix/windows sockets pour la communication sur la même machine ainsi que TCP, TLS et UDP, affirmant qu'au moins les sockets TCP et UDP sont stables.
Voici un petit exemple tiré de la documentation depuis le dépôt github:
Serveur de Sockets Unix, Windows Sockets & les Sockets TCP
Client pour les Sockets Unix & les Sockets TCP
Je suis actuellement à l'évaluation de ce module pour un remplacement locale de la cib (mais il pourrait être à distance de la cib dans le futur) comme un remplacement pour une vieille solution via stdin/stdout. Peut-être que je vais développer ma réponse quand je suis fait pour donner plus d'informations comment et à quel point ce module fonctionne.
je voudrais commencer avec la fonctionnalité intégrée qui nœud fournir.
vous pouvez utiliser processus de signalisation comme:
cette signalisation
Une fois que vous savez à propos de processus vous pouvez spwn un enfant-processus et de le raccorder à la
message
événement de restauration et d'envoyer des messages. Lors de l'utilisation dechild_process.fork()
vous pouvez écrire à l'enfant à l'aide dechild.send(message, [sendHandle])
et les messages sont reçus par un "message" de l'événement sur l'enfant.Aussi - vous pouvez utiliser cluster. Le cluster module vous permet de créer facilement un réseau de processus qui partagent tous les ports du serveur.
Pour la 3e partie des services que vous pouvez vérifier:
crochet.io, les signaux et bean.
prendre un coup d'oeil au niveau du nœud-messenger
https://github.com/weixiyen/messenger.js
s'adapter à la plupart des besoins facilement (pub/sub ... le feu et oublier .. envoyer/demande) avec auto-entretenu connectionpool
nous travaillons sur multi-nœud de processus d'application, ce qui est nécessaire pour traiter un grand nombre de temps réel de la croix-traiter le message.
Nous avons essayé de redis-pub-sous-la première, qui a échoué à répondre aux exigences.
Ensuite essayé socket tcp, ce qui était mieux, mais pas encore la meilleure.
Alors nous avons changé de datagramme UDP, qui est beaucoup plus rapide.
Voici le code des pensions, juste quelques lignes de code.
https://github.com/SGF-Games/node-udpcomm