ZMQ で PUSH/PULL を使ってロードバランシングしてみる

PUSH/PULL で PULL 側を複数立てた場合は、
PUSH 側で自動でロードバランシングするようなので確認してみました。

PULL 側を複数立てて、PUSH 側から複数メッセージを投げた場合で、やってみます。

PUSH

range で簡単に回して、ロードバランスしてくれているかを確認します。

import time

import zmq

ctx = zmq.Context()
sock = ctx.socket(zmq.PUSH)

sock.bind('tcp://127.0.0.1:5555')

time.sleep(1.0)

for i in range(0, 10):
  sock.send_json({'foo': ['bing', 2.3, True]})

PULL

JSON データを自動でデシリアライズする以外は特に難しい事はしていません。

import zmq
from zmq.eventloop import ioloop

loop = ioloop.IOLoop.instance()

ctx = zmq.Context()
sock = ctx.socket(zmq.PULL)
sock.connect('tcp://127.0.0.1:5555')

def sub_handler(sock, events):
  json = sock.recv_json()
  print json

loop.add_handler(sock, sub_handler, zmq.POLLIN)

loop.start()

確認

まずは PULL 側を起動して、そして push.py を実行します。
で、実行結果が以下です。

ひとつめ

$ python pull.py
[1, {'foo': ['bing', 2.3, True]}]
[3, {'foo': ['bing', 2.3, True]}]
[5, {'foo': ['bing', 2.3, True]}]
[7, {'foo': ['bing', 2.3, True]}]
[9, {'foo': ['bing', 2.3, True]}]

ふたつめ

$ python pull.py
[0, {'foo': ['bing', 2.3, True]}]
[2, {'foo': ['bing', 2.3, True]}]
[4, {'foo': ['bing', 2.3, True]}]
[6, {'foo': ['bing', 2.3, True]}]
[8, {'foo': ['bing', 2.3, True]}]

ちゃんとロードバランシング出来ていることが確認出来ました。

これで、処理のロードバランスができるようになりました。