进行进程间通信

时间:2012-02-20 18:36:58

标签: ipc go

我正在Go中编写一个负载均衡的服务器系统。

负载平衡服务器将与多个应用程序服务器和进程请求进行通信。这些服务器可以在同一台机器上运行,也可以在网络上运行。

我已经想出了网络,但现在我需要找到负载均衡器与本地应用服务器通信的最佳方式。使用localhost - 网络似乎远非最佳。

我正在尝试通过shmgetshmat系统调用共享内存,但没有找到任何有效的示例,syscall包也完全没有记录。

有人可以向我提供一个如何使用这些调用的示例,或者一个适用于Go的实际替代方案吗?

3 个答案:

答案 0 :(得分:52)

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

如果命名管道足够好,它们可能足以满足您的使用需求。另外,如果你写得好,你可以开始使用命名管道(因为它很容易)然后切换到共享内存,如果你发现命名管道的性能不够好(无论语言如何共享内存都不容易)。

答案 1 :(得分:12)

我建议看0mq。它是一个消息库,无论您是通过网络使用,还是本地IPC,甚至是线程间通信,都可以快速轻松地进行设计。它处理IPC的许多棘手问题,例如,如果接收器过载,消息成帧以及故障后重新连接,则使发送者退回发送请求。它具有许多语言的绑定,包括Go,这使得它可以将用不同语言编写的系统连接在一起。

答案 2 :(得分:1)

Go的内置RPC软件包仍然可以使用,但是请注意,由于outstanding bugs that are hard to fix(有关详细信息,请参见https://github.com/golang/go/issues/16844),该软件包已被冻结。