【问题标题】:How to implement inter-process communication in Go?Go如何实现进程间通信?
【发布时间】:2012-03-11 02:43:33
【问题描述】:

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

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

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

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

谁能给我提供一个例子来说明如何使用这些调用或在 Go 上运行 IPC 的现实替代方案?

【问题讨论】:

    标签: ipc go


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      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 套接字,在远程使用 TCP 套接字。按照您的建议通过 RPC。
      • 我相信命名管道甚至 unix 套接字都不是本地网络原语。它们实际上是 IPC 原语。
      • 该链接已关闭,但webarchive has a copy。否则有source。还有a video of the talk
      • @Ivan Black 哇,这对我来说是个新闻!我认为这可能是因为 sec.jetlib.com 托管在同一个 IP 地址上。无论如何,感谢您的提醒,我会将 jaytaylor.com 移至其他 IP。
      【解决方案3】:

      我建议查看0mq。它是一个消息传递库,无论您是通过网络使用它、本地 IPC 还是线程间通信,它都设计得既快速又简单。它处理了 IPC 的许多棘手问题,例如,如果接收方过载,则让发送方停止发送请求,消息帧,以及在失败后重新连接。它还绑定了很多语言,包括 Go,这使得它可以用于将用不同语言编写的系统连接在一起。

      【讨论】:

      • go驱动还只是一个原型。 ømq 是基于套接字的,将尽可能使用 unix 域套接字。我想我不会使用它,但感谢您的提醒!
      猜你喜欢
      • 2012-12-28
      • 1970-01-01
      • 1970-01-01
      • 2014-05-05
      • 2014-04-10
      • 2021-11-27
      • 1970-01-01
      • 2021-02-28
      • 1970-01-01
      相关资源
      最近更新 更多