Qudo-2010
YAPC::Asia 2010
2010/10/15
Agenda
- Self Introduction
- What is Qudo (Review)
- Change Points
- Ohter Distribution
- Conclusion
Self Introduction
continued...
Self Introduction
continued...
Self Introduction
- 名前:星野 将(ホシノ マサル)
- id :masartz(マサルツ)
continued...
Self Introduction
- 名前:星野 将(ホシノ マサル)
- id :masartz(マサルツ)
- 所属:yusukebeさんに「おもしろい」と言ってもらえないSNSの会社
continued...
Self Introduction
- 名前:星野 将(ホシノ マサル)
- id :masartz(マサルツ)
- 所属:yusukebeさんに「おもしろい」と言ってもらえないSNSの会社
continued...
Self Introduction
- 名前:星野 将(ホシノ マサル)
- id :masartz(マサルツ)
- 所属:yusukebeさんに「おもしろい」と言ってもらえないSNSの会社
- Qudoの開発者の中ではおそらく唯一プロダクトを実運用してない・・・
What is Qudo (Review)
continued...
What is Qudo (Review)
- データストアにRDBMSを用いた非同期処理システム
continued...
What is Qudo (Review)
- データストアにRDBMSを用いた非同期処理システム
- 元ネタはTheSchwartz
continued...
What is Qudo (Review)
- データストアにRDBMSを用いた非同期処理システム
- 元ネタはTheSchwartz
- 問題と思ったのは
continued...
What is Qudo (Review)
- データストアにRDBMSを用いた非同期処理システム
- 元ネタはTheSchwartz
- 問題と思ったのは
- 拡張性
- エラーハンドリング
- モジュール構成
- あとtypo...「 T h e S c h w a r t z 」
continued...
What is Qudo (Review)
- データストアにRDBMSを用いた非同期処理システム
- 元ネタはTheSchwartz
- 問題と思ったのは
- 拡張性
- エラーハンドリング
- モジュール構成
- あとtypo...「 T h e S c h w a r t z 」
- これらの点を工夫しつつ作ってみた
Change Points
continued...
Change Points
continued...
Change Points
continued...
Change Points
continued...
Change Points
continued...
Change Points
continued...
Change Points
continued...
Change Points
continued...
Change Points
continued...
Change Points
Change Points
continued...
Change Points
continued...
Change Points
- 複数DBへの接続をサポート
- jobにpriority概念を導入
continued...
Change Points
- 複数DBへの接続をサポート
- jobにpriority概念を導入
- Worker毎のHook指定機能を除去
continued...
Change Points
- 複数DBへの接続をサポート
- jobにpriority概念を導入
- Worker毎のHook指定機能を除去
- jobのメソッド追加
continued...
Change Points
- 複数DBへの接続をサポート
- jobにpriority概念を導入
- Worker毎のHook指定機能を除去
- jobのメソッド追加
- qudoコマンドから初期スキーマのセットアップ
continued...
Change Points
- 複数DBへの接続をサポート
- jobにpriority概念を導入
- Worker毎のHook指定機能を除去
- jobのメソッド追加
- qudoコマンドから初期スキーマのセットアップ
- 別プロジェクトへの切り出し
continued...
Change Points
- 複数DBへの接続をサポート
- jobにpriority概念を導入
- Worker毎のHook指定機能を除去
- jobのメソッド追加
- qudoコマンドから初期スキーマのセットアップ
- 別プロジェクトへの切り出し
- Qudo::Plugin::*
- Workerの処理内で使える便利メソッドが生える系
continued...
Change Points
- 複数DBへの接続をサポート
- jobにpriority概念を導入
- Worker毎のHook指定機能を除去
- jobのメソッド追加
- qudoコマンドから初期スキーマのセットアップ
- 別プロジェクトへの切り出し
- Qudo::Plugin::*
- Workerの処理内で使える便利メソッドが生える系
- Qudo::Hook::*
Ohter Distribution
- Qudo::Plugin::Logger
- Qudo::Hook::Notify
- Qudo::Hook::ForceQuitJob
- Qudo::Parallel::Manager
- Qudo::Parallel::Worker
- Qudo::Driver::DBI
- Qudo-Wiki
- Qudo::Web
Qudo::Plugin::Logger
continued...
Qudo::Plugin::Logger
- Plugin系では現時点唯一の別ディストリビューション
continued...
Qudo::Plugin::Logger
- Plugin系では現時点唯一の別ディストリビューション
- 内部ではLog::Dispatchを使用
continued...
Qudo::Plugin::Logger
- Plugin系では現時点唯一の別ディストリビューション
- 内部ではLog::Dispatchを使用
$manager->register_plugins(
+{
name => 'Qudo::Plugin::Logger',
option => +{
dispatchers => ['screen'],
screen => {
class => 'Log::Dispatch::Screen',
min_level => 'debug',
stderr => 0,
},
},
}
);
$job->manager->plugin->{logger}->debug('debug message here.');
Qudo::Hook::Notify
continued...
Qudo::Hook::Notify
- Jobが正常終了しなかった場合に検知するためのもの
continued...
Qudo::Hook::Notify
- Jobが正常終了しなかった場合に検知するためのもの
- Qudo::Hook::Notify::Abort
- Qudo::Jobのmethodで設けている -> 明示的に抜ける
continued...
Qudo::Hook::Notify
- Jobが正常終了しなかった場合に検知するためのもの
- Qudo::Hook::Notify::Abort
- Qudo::Jobのmethodで設けている -> 明示的に抜ける
- Qudo::Hook::Notify::Failed
- completedフラグが立たない or 例外発生による失敗
continued...
Qudo::Hook::Notify
- Jobが正常終了しなかった場合に検知するためのもの
- Qudo::Hook::Notify::Abort
- Qudo::Jobのmethodで設けている -> 明示的に抜ける
- Qudo::Hook::Notify::Failed
- completedフラグが立たない or 例外発生による失敗
- Qudo::Hook::Notify::ReachMaxRetry
- 各workerのmax_retriesの設定値と比較
continued...
Qudo::Hook::Notify
- Jobが正常終了しなかった場合に検知するためのもの
- Qudo::Hook::Notify::Abort
- Qudo::Jobのmethodで設けている -> 明示的に抜ける
- Qudo::Hook::Notify::Failed
- completedフラグが立たない or 例外発生による失敗
- Qudo::Hook::Notify::ReachMaxRetry
- 各workerのmax_retriesの設定値と比較
- Qudo::Plugin::Loggerと合わせて使うのを想定している
Qudo::Hook::ForceQuitJob
continued...
Qudo::Hook::ForceQuitJob
- 各workerで設定可能なgrab_forの値を利用する
continued...
Qudo::Hook::ForceQuitJob
- 各workerで設定可能なgrab_forの値を利用する
- jobの処理時間がこの値よりかかった場合、処理を中断(=die)する
- grab_forは標準で3600秒
- このHookを設定してもgrab_forが0ならば設定は無効
continued...
Qudo::Hook::ForceQuitJob
- 各workerで設定可能なgrab_forの値を利用する
- jobの処理時間がこの値よりかかった場合、処理を中断(=die)する
- grab_forは標準で3600秒
- このHookを設定してもgrab_forが0ならば設定は無効
- 各workerのdie自体はQudo::Workerのevalによって拾われるためExceptionとして管理出来る
continued...
Qudo::Hook::ForceQuitJob
- 各workerで設定可能なgrab_forの値を利用する
- jobの処理時間がこの値よりかかった場合、処理を中断(=die)する
- grab_forは標準で3600秒
- このHookを設定してもgrab_forが0ならば設定は無効
- 各workerのdie自体はQudo::Workerのevalによって拾われるためExceptionとして管理出来る
- 未CPAN UP
Qudo::Parallel::Manager
continued...
Qudo::Parallel::Manager
continued...
Qudo::Parallel::Manager
- workerのプロセス管理を行える
- 内部ではParallel::Prefork::SpareWorkersを使用
continued...
Qudo::Parallel::Manager
- workerのプロセス管理を行える
- 内部ではParallel::Prefork::SpareWorkersを使用
- スコアボードが見られたりなど
continued...
Qudo::Parallel::Manager
- workerのプロセス管理を行える
- 内部ではParallel::Prefork::SpareWorkersを使用
- スコアボードが見られたりなど
- さらにCloudForecastを使えば、グラフ化も可能
Qudo::Parallel::Worker
continued...
Qudo::Parallel::Worker
continued...
Qudo::Parallel::Worker
- まだアルファ版レベル
- Forkではなく、複数の関連するWorkerを管理するためのWorker
continued...
Qudo::Parallel::Worker
- まだアルファ版レベル
- Forkではなく、複数の関連するWorkerを管理するためのWorker
- Jobから複数の子Jobにjobを分割するのはreplace
continued...
Qudo::Parallel::Worker
- まだアルファ版レベル
- Forkではなく、複数の関連するWorkerを管理するためのWorker
- Jobから複数の子Jobにjobを分割するのはreplace
- 複数に分割した子jobが全部終了したことを確認して子Jobが全部終了したあとに別のJobを処理させたいはこちら
continued...
Qudo::Parallel::Worker
- まだアルファ版レベル
- Forkではなく、複数の関連するWorkerを管理するためのWorker
- Jobから複数の子Jobにjobを分割するのはreplace
- 複数に分割した子jobが全部終了したことを確認して子Jobが全部終了したあとに別のJobを処理させたいはこちら
- 使用実績はまだない
continued...
Qudo::Parallel::Worker
- まだアルファ版レベル
- Forkではなく、複数の関連するWorkerを管理するためのWorker
- Jobから複数の子Jobにjobを分割するのはreplace
- 複数に分割した子jobが全部終了したことを確認して子Jobが全部終了したあとに別のJobを処理させたいはこちら
- 使用実績はまだない
- 未CPAN UP
continued...
Qudo::Parallel::Worker
- まだアルファ版レベル
- Forkではなく、複数の関連するWorkerを管理するためのWorker
- Jobから複数の子Jobにjobを分割するのはreplace
- 複数に分割した子jobが全部終了したことを確認して子Jobが全部終了したあとに別のJobを処理させたいはこちら
- 使用実績はまだない
- 未CPAN UP
- 今後に期待age
Qudo::Driver::DBI
continued...
Qudo::Driver::DBI
continued...
Qudo::Driver::DBI
- 初期にはQudo本体にパッケージングされていた
- DBとの接続部分を生のDBIでやりとりする場合に使用
continued...
Qudo::Driver::DBI
- 初期にはQudo本体にパッケージングされていた
- DBとの接続部分を生のDBIでやりとりする場合に使用
- メンテの問題とDBIx::Skinnyの台頭もあり別ディストリビューション化
continued...
Qudo::Driver::DBI
- 初期にはQudo本体にパッケージングされていた
- DBとの接続部分を生のDBIでやりとりする場合に使用
- メンテの問題とDBIx::Skinnyの台頭もあり別ディストリビューション化
- 現時点では本体に追従出来ている(ハズ)
continued...
Qudo::Driver::DBI
- 初期にはQudo本体にパッケージングされていた
- DBとの接続部分を生のDBIでやりとりする場合に使用
- メンテの問題とDBIx::Skinnyの台頭もあり別ディストリビューション化
- 現時点では本体に追従出来ている(ハズ)
- テスト方法の改善は必要
Qudo::Driver::DBI
continued...
Qudo::Driver::DBI
continued...
Qudo::Driver::DBI
Rate qudo_skinny the_schwartz qudo_dbi the_schwartz_cached qudo_skinny_cached the_schwartz_simple gearman gearman_xs qudo_dbi_cached gearman_cached the_schwartz_simple_cached
qudo_skinny 188/s -- -16% -46% -55% -65% -72% -75% -76% -86% -95% -96%
the_schwartz 225/s 20% -- -35% -46% -58% -67% -70% -71% -84% -93% -95%
qudo_dbi 346/s 84% 54% -- -16% -35% -48% -54% -56% -75% -90% -92%
the_schwartz_cached 413/s 120% 84% 19% -- -23% -38% -45% -47% -70% -88% -90%
qudo_skinny_cached 535/s 184% 138% 55% 29% -- -20% -29% -32% -61% -84% -88%
the_schwartz_simple 671/s 257% 199% 94% 62% 26% -- -11% -14% -51% -81% -85%
gearman 758/s 303% 237% 119% 83% 42% 13% -- -3% -45% -78% -83%
gearman_xs 781/s 316% 248% 126% 89% 46% 16% 3% -- -43% -77% -82%
qudo_dbi_cached 1370/s 629% 510% 296% 232% 156% 104% 81% 75% -- -60% -68%
gearman_cached 3448/s 1734% 1434% 897% 734% 545% 414% 355% 341% 152% -- -21%
the_schwartz_simple_cached 4348/s 2213% 1835% 1157% 952% 713% 548% 474% 457% 217% 26% --
continued...
Qudo::Driver::DBI
Rate qudo_skinny the_schwartz qudo_dbi the_schwartz_cached qudo_skinny_cached the_schwartz_simple gearman gearman_xs qudo_dbi_cached gearman_cached the_schwartz_simple_cached
qudo_skinny 188/s -- -16% -46% -55% -65% -72% -75% -76% -86% -95% -96%
the_schwartz 225/s 20% -- -35% -46% -58% -67% -70% -71% -84% -93% -95%
qudo_dbi 346/s 84% 54% -- -16% -35% -48% -54% -56% -75% -90% -92%
the_schwartz_cached 413/s 120% 84% 19% -- -23% -38% -45% -47% -70% -88% -90%
qudo_skinny_cached 535/s 184% 138% 55% 29% -- -20% -29% -32% -61% -84% -88%
the_schwartz_simple 671/s 257% 199% 94% 62% 26% -- -11% -14% -51% -81% -85%
gearman 758/s 303% 237% 119% 83% 42% 13% -- -3% -45% -78% -83%
gearman_xs 781/s 316% 248% 126% 89% 46% 16% 3% -- -43% -77% -82%
qudo_dbi_cached 1370/s 629% 510% 296% 232% 156% 104% 81% 75% -- -60% -68%
gearman_cached 3448/s 1734% 1434% 897% 734% 545% 414% 355% 341% 152% -- -21%
the_schwartz_simple_cached 4348/s 2213% 1835% 1157% 952% 713% 548% 474% 457% 217% 26% --
continued...
Qudo::Driver::DBI
Rate qudo_skinny the_schwartz qudo_dbi the_schwartz_cached qudo_skinny_cached the_schwartz_simple gearman gearman_xs qudo_dbi_cached gearman_cached the_schwartz_simple_cached
qudo_skinny 188/s -- -16% -46% -55% -65% -72% -75% -76% -86% -95% -96%
the_schwartz 225/s 20% -- -35% -46% -58% -67% -70% -71% -84% -93% -95%
qudo_dbi 346/s 84% 54% -- -16% -35% -48% -54% -56% -75% -90% -92%
the_schwartz_cached 413/s 120% 84% 19% -- -23% -38% -45% -47% -70% -88% -90%
qudo_skinny_cached 535/s 184% 138% 55% 29% -- -20% -29% -32% -61% -84% -88%
the_schwartz_simple 671/s 257% 199% 94% 62% 26% -- -11% -14% -51% -81% -85%
gearman 758/s 303% 237% 119% 83% 42% 13% -- -3% -45% -78% -83%
gearman_xs 781/s 316% 248% 126% 89% 46% 16% 3% -- -43% -77% -82%
qudo_dbi_cached 1370/s 629% 510% 296% 232% 156% 104% 81% 75% -- -60% -68%
gearman_cached 3448/s 1734% 1434% 897% 734% 545% 414% 355% 341% 152% -- -21%
the_schwartz_simple_cached 4348/s 2213% 1835% 1157% 952% 713% 548% 474% 457% 217% 26% --
- 標準のSkinny版よりちょっとだけ早い
- メンテナは募集中です
continued...
Qudo::Driver::DBI
Rate qudo_skinny the_schwartz qudo_dbi the_schwartz_cached qudo_skinny_cached the_schwartz_simple gearman gearman_xs qudo_dbi_cached gearman_cached the_schwartz_simple_cached
qudo_skinny 188/s -- -16% -46% -55% -65% -72% -75% -76% -86% -95% -96%
the_schwartz 225/s 20% -- -35% -46% -58% -67% -70% -71% -84% -93% -95%
qudo_dbi 346/s 84% 54% -- -16% -35% -48% -54% -56% -75% -90% -92%
the_schwartz_cached 413/s 120% 84% 19% -- -23% -38% -45% -47% -70% -88% -90%
qudo_skinny_cached 535/s 184% 138% 55% 29% -- -20% -29% -32% -61% -84% -88%
the_schwartz_simple 671/s 257% 199% 94% 62% 26% -- -11% -14% -51% -81% -85%
gearman 758/s 303% 237% 119% 83% 42% 13% -- -3% -45% -78% -83%
gearman_xs 781/s 316% 248% 126% 89% 46% 16% 3% -- -43% -77% -82%
qudo_dbi_cached 1370/s 629% 510% 296% 232% 156% 104% 81% 75% -- -60% -68%
gearman_cached 3448/s 1734% 1434% 897% 734% 545% 414% 355% 341% 152% -- -21%
the_schwartz_simple_cached 4348/s 2213% 1835% 1157% 952% 713% 548% 474% 457% 217% 26% --
- 標準のSkinny版よりちょっとだけ早い
- メンテナは募集中です
- 未CPAN UP
Qudo-Wiki
continued...
Qudo::Web
continued...
Qudo::Web
- 開発停滞中
- DBをイチイチ覗かずにWeb上からJobの状態確認をする
continued...
Qudo::Web
- 開発停滞中
- DBをイチイチ覗かずにWeb上からJobの状態確認をする
- 未CPAN UP
Conclusion
continued...
Conclusion
- repos
- IRC
- 引き続き開発していく予定です
- 良ければ、試しに使っていただいてフィードバック貰えると嬉しいです
continued...
Conclusion
- repos
- IRC
- 引き続き開発していく予定です
- 良ければ、試しに使っていただいてフィードバック貰えると嬉しいです
- 良ければ、「ミクシィおもしろい」エントリ書いてくれると嬉しいです(お金は払いません)