Go межпроцессное взаимодействие - PullRequest
51 голосов
/ 20 февраля 2012

Я пишу серверную систему с балансировкой нагрузки на Go.

Сервер балансировки нагрузки будет связываться с несколькими серверами приложений и обрабатывать запросы. Эти серверы могут работать на одном компьютере или в сети.

Я уже разобрался с сетью, но теперь мне нужно найти оптимальный способ для балансировщика нагрузки взаимодействовать с локальным сервером приложений. Использование localhost -сетей кажется далеко не оптимальным.

Я пытаюсь разделить память с помощью системных вызовов shmget и shmat, но не нашел никаких рабочих примеров, и пакет syscall также полностью недокументирован.

Может ли кто-нибудь предоставить мне пример использования этих вызовов или реалистичную альтернативу, которая работает на Go для выполнения IPC?

Ответы [ 3 ]

53 голосов
/ 21 февраля 2012

Go имеет встроенную систему RPC (http://golang.org/pkg/rpc/) для простой связи между процессами Go.

Другой вариант - отправка закодированных данных (http://blog.golang.org/2011/03/gobs-of-data.html) через сетевое соединение.

Вы не должны отказываться от локальной сети без бенчмаркинга. Например, Chrome использует именованные каналы для IPC, и они передают много данных (например, отрисованные растровые изображения) между процессами:

Нашим основным примитивом межпроцессного взаимодействия является именованный канал. На Linux & OS X, мы используем socketpair ()

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

Если именованные каналы достаточно хороши для этого, они, вероятно, достаточно хороши для вашего случая использования. Кроме того, если вы хорошо пишете, вы можете начать использовать именованные каналы (потому что это легко), а затем переключиться на разделяемую память, если вы обнаружите, что производительность именованных каналов не достаточно хорошая (общая память не легка независимо от языка).

12 голосов
/ 20 февраля 2012

Я бы посоветовал посмотреть на 0mq .Это библиотека обмена сообщениями, разработанная для быстрой и простой работы, независимо от того, используете ли вы ее по сети, для локального IPC или даже для связи между потоками.Он обрабатывает многие хитрые биты IPC, например, заставляет отправителей откладывать отправку запросов, если получатель перегружается, формирование сообщений и повторное подключение после сбоя.И он имеет привязки для многих языков, включая Go, что делает его полезным для соединения систем, написанных на разных языках.

1 голос
/ 04 декабря 2018

Встроенный RPC-пакет Go по-прежнему можно использовать, но учтите, что он завис из-за outstanding bugs that are hard to fix (подробности см. https://github.com/golang/go/issues/16844).

...