YAPC::Asia Tokyo 2010に行ってきたので,セッションのメモを記録としてアップします.
Moderl Perl Web Development on Amazon EC2
PSGI
- PSGI APP = coderef
- sub { [ $status, [ @Headers ], [ @Body ] ] }
Plack
- PSGIの実装
- plackupの使い方
- サーバ実装を切り替えられる
- Starman, Starlet
- gracefulに対応しているかどうか
- DelayedとShotgunどっちがいいのか
- ベンチとって使うといい
- miyagawaさんが解説が違うと突っ込み
- Server::Starter
- start_server
- --port
- --interval
PSGIアプリの書き方
- 自分で作るのがお勧め
- CPAN Moduleを使うと簡単にかける
- Plack::Request
- 継承して必要な部分を追加
- parametersをflagged utf8に変換
- DBIx::Skinny
- Router::Simple
- 昨日も紹介されていた(TODO 後で確認)
- JSON::XS
daemontoolsとは
- daemontoolsからstart_server
daemontoolsのコマンド
daemontoolsの注意点
- runファイルでexecする
- runファイルの書き換え後は-dしてから-u
- サービス停止時はmvで.hogeにリネーム
cpanmの使い方
- cpanm -l extlib Starman
- アプリケーション用のユーザを作成してその$HOME以下でアプリ作成
Amazon EC2環境での構築
EC2のサーバ環境
構築の祇園
- IPアドレスが変わる
- Disk内容が保持されない
- 負荷分散
- アプリケーションのdeploy
IPアドレス
- Elastic IPでDNS, Global IPを固定
- webサーバはauto scale
- dbサーバは使ってる
- amazonのDNSに対して,ElasticIPで取得したDNS名を問い合わせ
DISKが消える
- instanceを消すと消える
- EBSブートを使ってる
負荷分散
- instanceを増やせばいい
- オートスケールを使えば自動で負荷分散
- CPU Usageなどで閾値を設定すると勝手に増減する
デプロイ
- オートスケールはイメージから起動なので,元のインスタンスイメージを更新する
- テスト用にElasticIPをとる
- ここでテストして問題なければイメージ化
- 後はオートスケールにまかせる
- NAS, NFSを使う人もいるらしい
感想
- 開発作業に得に違いはない
- daemontools + Server::Sterter + Starman
- ElasticIP
- オートスケールが便利
まとめ
- Plack
- Starman
- cpanm
- daemontools
- amazon特有の環境に注意
最近のPerlなものづくりの事例
- RECRUIT
- Toshimasa Ishibashi
MTLProject
- 自前サービス運営
- 演劇ライフ
- コマーシャライザー
- ハモニナ(携帯系)
- docomo公式コンテンツ
- モバゲー SocialApp
- ATND
- 調整さん
個社ホームページサービス
- Perl CMS
- suumo.jpからcentury21.on.s-bs.jpとかにデータを抽出
- TypePad + 検索
- エントリー入力
- お店のミカタ ほっとペッパーでも同様のサービス
- 10人前後を色々割り振って開発
VMwareで開発
- 各個人にVMwareをinstall
- subversionで管理
Test
- test code
- Model(ビジネスロジック) ここは100%にする
- View + Controller
- どう書いてるの?
- production, stagingでもsvn up後にprove -r .
- staging, productionのsvn upはリーダーが手動!
- リーダーがmergeをごりごり
- テスト専用のデータベースが環境ごとにある
CPAN
- cpan installしたモジュールは全部 svn addする
- $HOME/site_local_envにPERL5LIB等を追加する
- make installした*.soもsvn add
*.conf
- ln -s /etc/my.cnf $HOME/etc/my.cnf
- my.cnf.personal, mmy.cnf.staging, my.cnf.productionを$HOME/etc/my.cnfにln -sする
サーバ環境
- ユーザ認証はRECRUITでシングルサインオン web apiを用意
- Perl FrameworkはPlack
- xen server
その他
- エンジニアは企画から参加
- backlogでリポジトリ等を管理
Mashup Awards
- llevalも使える
- R25 API
- mbga
- NHK
30days Albumの裏側
30daysの裏
- Web Ruby on Rails
- mogilefs
- gearmn
- schwartz
- HTTP APIを使用
- RESTを意識
MogileFSの障害対応
MogileFSの利バランス
- データの平準化
- バックグランドで動作
- ストレージを追加・削除時に使う
FLVのストリーミング
ソーシャルアプリ向けのシステム監視運用の勘所
- tcpdumpで確認
- DBのチューニングが遅かった
- tcpdump + wiresharkでok
- リクエストの開始からなのでレイテンシを気にする程度
Perl and C binding: new and upcoming ways
- c_ushort
- PerlDLL
- Libperl++
- goal c++
- for calling perl xs funxtions
- provides xs environmenent for called funciton
Libperl++
- Cからperl packageの呼び出しの例
- Ref testr = universe.package('Tester').call('new',1);
- Any Perl Variable have take_ref().
- custom type convertion
ExtUtils::XSpp
- Module::Build::WithXSpp
- c++をtypemapを用意すればかなり普通に使えるっぽい
質疑
Studying HTTP with Perl
PerlにおけるHTTPクライアントの紹介
並列じゃないもの
- LWP::UserAgent
- LWP::Simple
- LWP::RobotUA
- URI::Fetch
- LWPのラッパー
- Etag, LastModifiedに対応
- キャッシュ対応
- HTTP::Lite
- LWPx::ParanoidAgent
- ローカルネットワークへのアクセスを拒絶
- DNSの検証
- WWW::Curl
- perl binding of libcurl
- 速い
- 癖がある
- ラッパーがいくつかある
並列リクエスト可能なもの
- お勧めじゃないもの
- AnyEvent::HTTP
- Coro::LWP
- Coroとは
- Perlでコルーチンを実現するライブラリ
- お勧めだけど考えて使う必要がある
LLによるネットワーキングプログラミング
- 相手の処理待ちが多いからLLでもOK
- だけどLWPは遅い
- ベンチマークをとる
- LWPで200req/s
AnyEvent::Curl
- on github
- LWPの8倍速い
- WWW::Curlとの違い
- ブロッキングしていいのかどうか
- event駆動のサーバの場合
- LWP互換機能
- WWW::Curl::Multiがベース
並列処理
- thread バグってる
- forkによるマルチプロセス
- forkのメリット
- forkのデメリット
- イベント駆動
- Perlだとイベント駆動+prefork
Preforkの話
- prefork型はDoSに弱い
- フロントにイベント駆動のロードバランサをおく
- プロセス数を調節する
- ピークリクエストと処理時間がわかれば,必要なワーカーを計算できる
イベント駆動向きなもの
- 予想できなければイベント駆動が向いている
- フラグを使った強調動作
- クローラは相手のスペックがわからないのでイベント駆動がいい
チューニング
- HTTP::Responseが遅い.HTTP::HeadersをXS化
- 名前解決のコスト
- WWW::Curlは非同期解決のオプションがある
- パフォーマンスが劣化する
- 外向けのクローラーはSquidを通すと楽
RPCのプロトコル
- HTTPでいいんでない
- HTTPのメリット
- HTTPは別に遅くない
テスト
- Test::TCP
- Plack/PSGIで簡単サーバを作る
- ローカル環境だけで動くようにする
非同期処理の通知処理 with Tatsumaki
CGI
- $|でautoflushをonにする
- long-polling
- multipart/mixedで送信
- 大量アクセスを裁けない
PSGI/Plackストリーミング
- めんどくさい
- coderef coderef coderef ...
- 全部IO処理を非同期にしなければならない
どうやって簡単にするか
- Tastumaki::Handler
- Tatsumaki::Application
- Gearman
- jobはMyJobとか作ってその中にjob_hogeなメソッドを定義
- Class::InspectorでMyJobからジョブを読み出す
- AnyEvent::Gearmanがクライアントにはいい
- WebService::Async
Writing prefork job workers / servers
Parallel::ForkManager
Parallel::Prefork
- シグナルで子プロセスを制御できる
- 親が受け取ったシグナルを子プロセスのシグナルに対応づける
- graceful
- dynamic scaling
Server::Starter
- 去年のLTと一緒
- 環境変数をみてfd_openですでに開いているソケットを使うだけでSS対応できる
Parallel::Scoreboard
- リソース監視
- mod_statsuっぽいものを作成しやすくする
- 監視側
- Paralle::Scoreboard::PSGI::App
- Paralle::Scoreboard::PSGI::App::JSON
0 件のコメント:
コメントを投稿