web-dev-qa-db-fra.com

Go Communication inter-processus

J'écris un système de serveur à charge équilibrée dans Go.

Le serveur d'équilibrage de charge communiquera avec plusieurs serveurs d'applications et traitera les demandes. Ces serveurs peuvent tous deux fonctionner sur la même machine ou sur le réseau.

J'ai déjà compris la mise en réseau, mais maintenant je dois trouver un moyen optimal pour l'équilibreur de charge de communiquer avec un serveur d'applications local. L'utilisation de localhost- mise en réseau semble loin d'être optimale.

J'essaie de partager la mémoire via les appels système shmget et shmat mais je n'ai trouvé aucun exemple de travail et le package syscall est également complètement non documenté.

Quelqu'un peut-il me donner un exemple de la façon d'utiliser ces appels ou une alternative réaliste qui fonctionne sur Go pour faire de l'IPC?

51
thwd

Go a un système RPC intégré ( http://golang.org/pkg/rpc/ ) pour une communication facile entre les processus Go.

Une autre option consiste à envoyer des données codées gob ( http://blog.golang.org/2011/03/gobs-of-data.html ) via une connexion réseau.

Vous ne devez pas rejeter le réseautage local sans analyse comparative. Par exemple Chrome utilise des canaux nommés pour IPC et ils transfèrent beaucoup de données (par exemple des bitmaps rendus) entre les processus:

Notre principale primitive de communication inter-processus est le canal nommé. Sous Linux et OS X, nous utilisons un socketpair ()

- http://www.chromium.org/developers/design-documents/inter-process-communication

Si les tuyaux nommés sont assez bons pour cela, ils sont probablement assez bons pour votre cas d'utilisation. De plus, si vous écrivez bien, vous pouvez commencer à utiliser des canaux nommés (car c'est facile) puis passer à la mémoire partagée si vous trouvez que les performances des canaux nommés ne sont pas assez bonnes (la mémoire partagée n'est pas facile quelle que soit la langue).

53
Krzysztof Kowalczyk

Je suggère de regarder mq . Il s'agit d'une bibliothèque de messagerie conçue pour être rapide et facile, que vous l'utilisiez sur le réseau, pour l'IPC local ou même pour la communication entre les threads. Il gère une grande partie des bits délicats de l'IPC, comme faire en sorte que les expéditeurs renoncent à envoyer des demandes si le récepteur est surchargé, le cadrage des messages et se reconnecter après l'échec. Et il a des liaisons pour BEAUCOUP de langues, y compris Go, ce qui le rend utile pour câbler des systèmes écrits dans différentes langues.

12
gsteff

Le package RPC intégré de Go est toujours utilisable, mais notez qu'il est gelé en raison de outstanding bugs that are hard to fix (voir https://github.com/golang/go/issues/16844 pour plus de détails).

1
yagami kishin