进行进程间通信

thw*_*hwd 51 ipc go

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

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

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

我试图通过shmgetshmat系统调用共享内存,但没有找到任何工作示例,该syscall包也完全没有记录.

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

Krz*_*zyk 53

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

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

  • 我相信命名管道甚至unix套接字都不是本地网络原语.它们实际上是IPC原语. (6认同)
  • 我在远程的本地TCP套接字上使用了unix套接字.按照你的建议过RPC. (2认同)
  • 该链接已关闭,但 [webarchive 有一个副本](https://web.archive.org/web/20120501231630/http://wh3rd.net/practical-go/#\(41\))。否则有[来源](https://github.com/nf/goto/blob/master/talk/index.html)。还有[演讲视频](https://www.youtube.com/watch?v=2-pPAvqyluI#t=2415)。 (2认同)

gst*_*eff 12

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


yag*_*hin 5

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