Hatena::Groupdann

gearman

Gearman

Gearman::Client

  • dispatch_backgroundでJobをdispatch.非同期になり、Jobが死んでもApp Server上では刺さらない。
  • dispatch_backgroundでdispatchした先のjobが刺さったら、gearmandはどうなる?
    • Client側ではtimetou機構がないからダメ。worker側でtimeoutさせられるかも?(要確認)

以下のでいけそう。$timeoutでtimeoutできるかを確認。(試したけれど、だめそう).

$worker->register_function($funcname, $timeout, $subref)

Registers the function $funcname as being provided by the worker $worker, and advertises these capabilities to all of the job servers defined in this worker.

$subref must be a subroutine reference that will be invoked when the worker receives a request for this function. It will be passed a Gearman::Job object representing the job that has been received by the worker.

$timeout is an optional parameter specifying how long the jobserver will wait for your subroutine to give an answer. Exceeding this time will result in the jobserver reassigning the task and ignoring your result. This prevents a gimpy worker from ruining the 'user experience' in many situations.

The subroutine reference can return a return value, which will be sent back to the job server.


流れ

  • 処理中フラグをmemcachedに記録
  • Gearmandにdispatch_backgroundで投げる(status waiting)
    • modperlは即コネクションを切る
  • worker側ではJobのstatusをcompleteに書き換えて、memcachedにstatus書き込む
  • データの利用側では、mod_perl経由してmemcachedにアクセス
    • 何らかの形でPollingしてデータ受け取り

これだと、enqueueする側と、実際のJobを処理する側、処理結果を受ける側のサーバーを分離できる。

Gearman::Client::Async

  • Job登録後、Jobが終わってもWatchedSocketsが0にならないのをどうすればいいのかいまいちわからない
  • AsyncでDanga::Socket使った場合に、Danga::Socket->SetPostLoopEventCallbackに渡すcoderefでworkerのconnectionを切らないと空のWorkerが増え続けるかも(確認)
  • EventLoopはずっとまわしっぱなしにしても大丈夫?
    • EventLoopまわしっぱなしにして、JobをAddTimerでenqueueしていくって形.
  • AsyncでCallback待つ場合のメリットは、Imagerなどのプロセスを外に出せる事
    • ただ、callbackが戻るまでenqueueする側がすぐにconnection切れないので、enqueueする側のサーバーがネックになる可能性あり。そういう用途では使えない?

TODO

Asyncはもうちょっと使わないとわからないなぁ。Danga::Socketとepollをまだ理解しきれてない。

telnetでgearmanの状態管理

telnet localhost 7003でgearmandの管理がコマンドベースでできます。

statusコマンド

jobの関数名   キュー中のジョブのトータル数   実行中のjobの数

の順で表示される

workersコマンド

登録されたWorkerのfds, IP, client ids, 登録されている関数郡の名前(そのworkerが実行できる事)

形式は、以下の通り。

  fd ip.x.y.z client_id : func_a func_b func_c
  fd ip.x.y.z client_id : func_a func_b func_c
  fd ip.x.y.z client_id : func_a func_b func_c

shutdown

gearmand落とす

gladiatorコマンド

  • デバッグ用っぽいけど、Devel::Gladiatorがないと使えないうえに、CPANにこのモジュールがない?何するものなのか、よくわかってない。

maxqueueコマンド

どういうときに使うコマンドなのか、よくわからない

version

Gearman::Serverのversion

おまけ

Ctrl+]で抜ける.

* はてなダイアリーキーワード:Gearman