Подтвердить что ты не робот

Переключить межпроцессное общение

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

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

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

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

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

4b9b3361

Ответ 1

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

Другой вариант - отправить gob-закодированные данные (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

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

Ответ 2

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

Ответ 3

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