如何在Go语言中实现进程间通信?

64

我正在用Go语言编写一个负载均衡服务器系统。

负载均衡服务器将与多个应用服务器通信并处理请求。这些服务器既可以在同一台计算机上运行,也可以在网络上运行。

我已经解决了网络问题,但现在需要找到一种最优的方式让负载均衡器与本地应用服务器通信。使用“localhost”网络似乎远非最佳选择。

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

请问是否有人能够提供使用这些调用的示例或适用于Go的实际替代方案来进行IPC?

3个回答

75

Go内置了一个RPC系统 (http://golang.org/pkg/rpc/),方便Go进程之间的通讯。

另一种选择是通过网络连接发送编码为gob的数据 (http://blog.golang.org/2011/03/gobs-of-data.html)。

不要因为没有进行基准测试就轻易地忽视本地网络通信。例如,Chrome使用命名管道进行进程间通信,并在进程之间传输大量数据(如渲染位图):

我们的主要进程间通信原语是命名管道。在Linux和OS X上,我们使用socketpair()

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

如果命名管道对于Chrome来说足够好,那么对于您的用例来说它们很可能也足够好。此外,如果您编写得当,可以先使用命名管道(因为这很容易),然后在发现命名管道的性能不足时切换到共享内存(无论使用哪种语言,共享内存都不容易)。


2
我在本地使用了Unix套接字,在远程使用了TCP套接字,就像您建议的那样通过RPC进行通信。 - thwd
9
我认为命名管道甚至是Unix套接字并不是本地网络原语,它们实际上是IPC原语。 - 7hi4g0
2
那个链接已经失效了,但是webarchive有一个备份。另外还有源代码。还有一段关于这次讲座的视频 - David C. Bishop
1
@Ivan Black 哇,这对我来说是个新闻!我认为这可能是因为sec.jetlib.com托管在同一个IP地址上的原因。无论如何,感谢您提醒我,我会将jaytaylor.com移动到另一个IP地址。 - Jay Taylor

18

我建议看一下0mq。这是一个消息传输库,旨在快速、易用,无论您将其用于网络、本地IPC或甚至线程间通信。它处理了许多IPC的复杂部分,例如使发送者在接收方过载时停止发送请求、消息封装和失败后重新连接。同时,它还支持许多语言绑定,包括Go,这使得它有助于将使用不同语言编写的系统连接在一起。


Go驱动程序仍然只是一个原型。ømq基于套接字,尽可能使用Unix域套接字。我想我不会使用它,但感谢您提醒! - thwd

7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接