zeromq 調査 その2: PHPサンプルコード(SUBSCRIBE)

TODO

  • zeromq @ CentOS 5.4 -> 環境構築が面倒すぎて断念
  • Ubuntuに仮想環境構築してドキュメントを読みつつPHPでコードを書いて遊ぶ

仮想環境セットアップ

  • 192.168.11.4(srv1)
  • 192.168.11.15(srv2)

mysample1

+------+    send    +------+    +------------------+
| srv1 |<---------->| srv2 +<-->+ unix domain sock +--- client1
+------+    recv    +------+    +--------+---------+
                                         +--- client2
  • 接続を1本(図を参照)
    • local通信はIPCで行う
    • ついでに以下も確認
      1. 1つのclientから接続を受けたらmultiserver側で5秒sleep。2つめのclientも接続してみる
      2. multiserverを起動してからremote serverを起動して、通信できるか確認
  • 結果
    • すべて想定どおりの通信が確認できた
  • 詳細
    • 接続は1本で複数clientの通信ができた
    • 1.の場合、2つめのclientは1つめのclientの通信が完全に終わるまでwaitし、その後5秒待たされた(予想通りの挙動)
      • この構成だと1つの通信が遅くなったときに通信が詰まる恐れがある
      • 回避策は別途考察
    • 2.の場合、multiserver起動時はremote serverは起動していないのでエラーになるかと思いきや、問題なく通信できた
      • うまくfailover/接続リトライしてくれている雰囲気
      • 別の方法で詳しく確認する

Getting the Message OutサンプルをPHPで動かしてみる

 

 

<?php

$ctx = new ZMQContext();
$s   = $ctx->getSocket(ZMQ::SOCKET_PUB);
$s->bind("tcp://127.0.0.1:5556");

// client(subscriber)の有無にかかわらず、メッセージを送りつづける
while (1){
    $message = rand(0,10000);
    var_dump($message);
    $s->send($message);
}
  • client(subscriber)
<?php
$ctx = new ZMQContext();
$c   = $ctx->getSocket(ZMQ::SOCKET_SUB);
$c->connect("tcp://127.0.0.1:5556");

// 送られてきたメッセージが20から始まるものだけを受け取る
$c->setSockOpt(ZMQ::SOCKOPT_SUBSCRIBE, "20");

for ($update_nbr = 0; $update_nbr < 100; $update_nbr++) {
    $ret = $c->recv();
    var_dump($ret);
}
  • 大きなデータの分散処理をそれぞれ子プロセスに分割して処理する場合などに有用
  • ドキュメントにあるように、「one-way data distribution」

次のTODO

  • Divide and Conquer サンプルお試し