web-dev-qa-db-ja.com

プロセス間通信に行く

Goで負荷分散サーバーシステムを作成しています。

負荷分散サーバーは、複数のアプリケーションサーバーと通信し、要求を処理します。これらのサーバーは両方とも、同じマシンまたはネットワーク上で実行できます。

すでにネットワークを理解していましたが、ロードバランサーがローカルアプリケーションサーバーと通信するための最適な方法を見つける必要があります。 localhost- networkingの使用は最適とはほど遠いようです。

shmgetおよびshmatシステムコールを介してメモリを共有しようとしていますが、実際の例は見つかりませんでした。また、syscallパッケージも完全に文書化されていません。

誰かがこれらの呼び出しを使用する方法の例や、IPCを行うためにGoで動作する現実的な代替案を提供できますか?

51
thwd

Goには、Goプロセス間の通信を容易にするための組み込みRPCシステム( http://golang.org/pkg/rpc/ )があります。

別のオプションは、ネットワーク接続を介して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

名前付きパイプがそのために十分であれば、ユースケースにはおそらく十分です。さらに、物事をうまく書けば、名前付きパイプの使用を開始し(簡単だから)、名前付きパイプのパフォーマンスが十分でない場合は共有メモリに切り替えることができます(言語に関係なく共有メモリは簡単ではありません)。

53

mq を見ることをお勧めします。ネットワーク経由で使用する場合でも、ローカルIPCで使用する場合でも、スレッド間通信で使用する場合でも、高速かつ簡単に設計されたメッセージングライブラリです。 IPCの多くのトリッキーなビットを処理します。たとえば、受信者が過負荷になった場合に送信者が要求を送信しないようにし、メッセージのフレーミングを行い、障害後に再接続します。また、Goを含む多くの言語のバインディングがあり、異なる言語で記述されたシステムを相互に接続するのに役立ちます。

12
gsteff

Goの組み込みRPCパッケージは引き続き使用できますが、outstanding bugs that are hard to fix(詳細は https://github.com/golang/go/issues/16844 をご覧ください)。

1
yagami kishin