zeromq 調査 その3: N:M 双方向通信をためす

今回の調査内容

環境

  • とりあえず、1 Server内のTCP通信で動作確認

コード

  • https://github.com/tanarky/sample-codes/tree/master/php/zmq/broker/
  • s1.php(server process)を2つ起動して、c1.php(1つのclient process)から10回メッセージを送った
    • 2つのs1.phpにリクエストが分散された
    • 1つのs1.phpプロセスを落としたら、起動しているs1.phpプロセスにのみ振られた

問題

  • 2つのserver processのうち、1つは処理に3秒以上かかるようにsleepを入れた
  • 1回だけ遅いserver processに振られ残りは処理が早いserver processにリクエストが振られる、という挙動を期待
  • 結果としては、期待した挙動にならず
  • 2つのserver processに均等にリクエストが振られた
  • 対応策はあるか? => ありそう
    • http://zguide.zeromq.org/chapter:all#toc45
    • 「Least-Recently Used Routing」のサンプルは、期待した挙動をしそう
    • Cのサンプルを動かして動作確認できた
    • PHPに移植中
    • clientから、$sock->setSockOpt(ZMQ::SOCKOPT_IDENTITY, str_repeat("a", 300))、といった感じで使う

次回TODO

  • 性能評価

その他メモ

  • ruby bindingはpollがなく、古い

totoでお金持ちになる その3 直近10試合の勝点差による勝率

アグレッシブエンジニア: totoでお金持ちになる その2 ホーム&アウェイの勝率
前回からだいぶ時間があいたけど、もう一度データを整理して、
過去の10試合結果とその場合の勝率を計算してみた。

J1の結果において、
ホームチームの直近10試合の勝点をHとし、
アウェーチームの直近10試合の勝点をAとし、
(H-A) の値により、勝率がどの程度変わるか計算してみた。

結果としては以下の通り。
  1. H-Aの値が8を越えると、ホームチームの勝率60%以上(totoの結果的に1)
  2. H-Aの値が-17以下の場合、アウェーチームの勝率60%以上(totoの結果的に2)
 -17を下回ることはあまりないけど、8を越えることは結構ありそうなので、
今後はこれを参考に購入してみるか、と。

ちなみに、J2の場合は、直近10試合の勝点には関係なく、
ホームチームが有利、という結果に。

(H-A)の値が0の場合、つまり直近10試合の調子が同じでも、
ホームチームの勝ちが50%、引き分けが27%と、合わせて77%。
J2の場合は、マルチで買っておくのが無難、というお話。

三菱東京UFJポイントをYahoo!ポイントに交換

メインバンクに三菱東京UFJを使ってるんですが、
カード払い時などにたまっていたポイントを、Yahoo!ポイントに交換できる
みたいなんで、交換してみました。

三菱東京UFJポイント:三菱東京UFJ銀行

よく見ると、Tポイントも交換対象みたいなんで、
Yahoo!ショッピングでTポイントが貯まる! 使える! - Yahoo!ショッピング
Yahoo!ショッピングとの相性がいいです。

自分はある名義口座に500ポイント、別の名義口座に100ポイントもっていたので、
あわせて1つのYahooIDにまとめるように
インターネット(三菱東京UFJ ダイレクト)から申し込みました。

難点は、交換にかかる期間で、

11/1: Twitter / @tanarky: メインバンクが東京三菱なんですが、Yahooポイントと交換できると判明。しかも東京三菱ポイントが500ポイントもあったので、Yahooポイントが5倍の2500ポイントに。

11/22: Twitter / @tanarky: 東京三菱ポイントのYahooポイントへの交換が完了した! 3500ポイントなり。

と、20日くらいかかりました。
今からやって、年内に交換完了するかしないか、くらいなんで
年末商戦でほしいものがある方はお早めに。。。


自宅 Mac mini のファストユーザスイッチを有効にしてみた

[Mac] ファストユーザスイッチ を 有効 にする方法 | Apple Voice

家族で共有して使ってるMac miniの設定を変えてみた。
いちいち使用する度にログアウトしたりしてたのが面倒になったので。

これからは、シャットダウンせずにスリープ、
ユーザを切り替えるときはファストユーザスイッチでやることにした。

ついでに、VirtualBoxにUbuntu Server 10.04 LTSをインストールして
Macでの開発環境にした。
Macで開発する時は、Ubuntu ServerにSSHログインして開発、
終了する時は、スリープで終了して、再開する時はスリープ解除で、という方法。

急にMacでの開発が快適になってワロタ。

Macbook Air 並みのSSD搭載Mac miniがでたら、
開発用にもう1台買おうかと思っている。

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 サンプルお試し

launchpad使い方まとめ その1:アカウント作成とか

Launchpadとは - はてなキーワード
Launchpad - Wikipedia
Ubuntu向けのAPT レポジトリ作成 (ビルドシステムを含む)
を使ってみたくなったので、launchpadにアカウントを作ってみた。
普通のサイトだと、E-mailアドレスからアカウントを作って終了、という
ところだが、色々めんどくさかったので、メモっておく。

Ubuntu Weekly Recipe:第46回 PPAの活用|gihyo.jp … 技術評論社
手順の最大の山場は、CoCへの署名。
すでに登録しておいたgpgの公開鍵をもとに、暗号化されてきたメールを複合化して
本文に書かれているURL(だったかな?)にアクセスして同意完了、という流れ。

メールは、いつもブラウザからGmailやらYahooメールやらを使っているので、
複合化に若干手間取りました。
結果的には、メールの本文をコピーして、コマンドラインから、
gpg --decrypt [保存したメール本文ファイル]
として複合化させました。
あとは、SSH keysを登録して準備完了。

Satoshi Tanaka in Launchpad

zeromq 調査

関連リンク

セットアップ

% ./configure
% tar xvzf zeromq-2.0.10.tar.gz
% cd zeromq-2.0.10/
% ./configure && make && sudo make install

PHP binding setup

FAIL Test that high-watermark works [tests/022-highwatermark.phpt]
-----
Fatal error: Undefined class constant 'SOCKOPT_LINGER' \
 in /home/satoshi/github/php-zmq/tests/022-highwatermark.php on line 14

サンプルを動かしてみる

  • PHPサンプル
  • 確認できたこと
    • simple server / simple client メッセージ動作確認(TCP)
    • simple server / non blocking client メッセージ動作確認(TCP)
    • simple server / simple client メッセージ動作確認(IPC)
    • simple server / non blocking client メッセージ動作確認(IPC)
  • 次、確認すること
    • failover(ドキュメントを読みながらコード書いている途中)
    • もう少し深いレベルのコード確認
    • 性能測定
  • 感想
    • msgpackと組み合わせやすそう

HandlerSocket plugin for MySQL


HandlerSocketに関する非常にわかりやすいスライド。
ようやくHandlerSocketがなんであるかイメージできた(気がする)


NoSQLとしてのMySQLの動作確認(HandlerSocket) Makefile.PL patch

なんか、せっかくperl clientがついてるのに、
make perl
が通らなかったので、ちょっとMakefileを修正してみた。

/home/satoshi/github/HandlerSocket-Plugin-for-MySQL/perl-Net-HandlerSocket
% git diff Makefile.PL 
diff --git a/perl-Net-HandlerSocket/Makefile.PL b/perl-Net-HandlerSocket/Makefile.PL
index 1b76494..50ad0dc 100644
--- a/perl-Net-HandlerSocket/Makefile.PL
+++ b/perl-Net-HandlerSocket/Makefile.PL
@@ -13,7 +13,7 @@ WriteMakefile(
     LD                => 'g++ -fPIC',
     LIBS              => ['-lhsclient'], # e.g., '-lm'
     DEFINE            => '', # e.g., '-DHAVE_SOMETHING'
-    INC               => '-I. -I/usr/include/handlersocket',
+    INC               => '-I. -I../libhsclient',
     OPTIMIZE          => '-g -O3 -Wall -Wno-unused',
        # Un-comment this if you add C files to link with later:
     # OBJECT            => '$(O_FILES)', # link all the C files too

rpmを作成してinstallする方は動いたけど、
今日はUbuntuで動作確認してみたかったので、修正した。

別に修正しなくても、headerファイルもしかるべきところにおけば通るっぽいし、
間違いとは言えないので、どうしたもんか。

さて、どうやって作者に連絡するか・・・。
(このBlogを作者に連絡してくれる有志募集中)


MLで、というアドバイスをもらったので突撃してみた。

→ (2010/11/09追記)
無事に取り込んでもらえました。
https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL/commit/bbd256250ed04c72915d09cd1de4c3cb12d24961