GoとPythonをZeroMQで繋ぐ

April 26, 2013 - python, golang

最近Rubyでプロジェクトオイラーを解きながらRubyに慣れようとしてるのですが、ちょっと飽きてきたので息抜きにGoを書いたりしています。

ついでにZeroMQも試してみたかったので、GoとPythonをZeroMQで繋いでみました。

構成はこんな感じで、Python(かGo)clientを起動し、Goで動くmonitorq経由でGoのserverにつながります。PUB/SUBでmonitorからモニタリングできるのがミソです。

                  +----------------------------------------+
                  |                                        |
  +------+        |--------------------------+     +-----+ |
  |client|--------|9001     monitorq     9002|-----|serv | |
  |(REQ) |        |(ROUTER)   9003   (DEALER)|     |(REP)| |
  +------+        |--------------------------+     +-----+ |
                  |          |(PUB)                        |
                  |          |                             |
                  |          |                             |
                  |          |(SUB)                        |
                  |      +-------+                         |
                  |      |monitor|                         |
                  |      +-------+                         |
                  +----------------------------------------+

※client/server/monitorは複数たちあげるとよしなに振り分けてくれます。

  • monitorqでfan-in/outする
$ go run queue.go monitorq
  • clientから”PING”を投げる(と、”PONG#“が帰る)
$ python run queue.py client
PONG#<28870>
PONG#<28870>
 :
  • serverから”PONG”を返す(clientからのPINGを表示)
$ go run queue.go serv
Recv: PING#<73835>
Recv: PING#<73835>
 :
  • monitorでリクエスト総数をモニタリング
$ go run queue.go monitor
MONITOR: IN: 2082, OUT 2082
MONITOR: IN: 2083, OUT 2083
 :

コードはgistにあげてます。

ZeroMQなら他にもいろんな構成がとれるので、使いどころは結構あるのではないかと。

今回、不慣れなGoで書いてみましたが、これくらいであればもわりと素直にかけるなぁという印象です。

Goで書かれたZeroMQのサンプルは以下githubリポジトリにたくさんあるので、覗いてみると色々勉強になります。