2010/10/17

YAPC::Asia Tokyo 2010 一日目

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のコマンド

  • svc
    • -u 起動
    • -h SIGHUPを送信
    • -d 停止

daemontoolsの注意点

  • runファイルでexecする
  • runファイルの書き換え後は-dしてから-u
  • サービス停止時はmvで.hogeにリネーム

cpanmの使い方

  • cpanm -l extlib Starman
  • アプリケーション用のユーザを作成してその$HOME以下でアプリ作成

Amazon EC2環境での構築

EC2のサーバ環境

  • web
    • small instance
  • db
    • large instance
    • mysql5.1

構築の祇園

  • 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 + 検索
  • エントリー入力
    • JavaScriptでごりごり
  • お店のミカタ ほっとペッパーでも同様のサービス
  • 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
    • 全環境でOS等をあわせる必要がある

*.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の障害対応

  • コピーを確認
    • file_on
    • X-REPORXY-URLを確認
  • Perlbalを再起動
    • X-REPORXY-CACHE-FOR

MogileFSの利バランス

  • データの平準化
  • バックグランドで動作
  • ストレージを追加・削除時に使う

FLVのストリーミング

  • Perlbal pluginを作成
    • FLVヘッダをボディに追加
    • フックポイントを追加

ソーシャルアプリ向けのシステム監視運用の勘所

  • tcpdumpで確認
  • DBのチューニングが遅かった
  • tcpdump + wiresharkでok
  • リクエストの開始からなのでレイテンシを気にする程度
    • 自宅 10ms
    • EC2 100-200ms

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
    • structも作れるよ

ExtUtils::XSpp

  • Module::Build::WithXSpp
  • c++をtypemapを用意すればかなり普通に使えるっぽい

質疑

  • crossplat form
  • libffiに依存

Studying HTTP with Perl

PerlにおけるHTTPクライアントの紹介

並列じゃないもの

  • LWP::UserAgent
    • デファクトスタンダード
  • LWP::Simple
  • LWP::RobotUA
    • Robot用
  • URI::Fetch
    • LWPのラッパー
    • Etag, LastModifiedに対応
    • キャッシュ対応
  • HTTP::Lite
    • 依存なし
    • httpsに未対応
  • LWPx::ParanoidAgent
    • ローカルネットワークへのアクセスを拒絶
    • DNSの検証
  • WWW::Curl
    • perl binding of libcurl
    • 速い
    • 癖がある
    • ラッパーがいくつかある

並列リクエスト可能なもの

  • お勧めじゃないもの
    • HTTP::Async
    • みのがした
  • 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によるマルチプロセス
    • IO多重化+イベント駆動
  • forkのメリット
    • マルチコアの生かせる
  • forkのデメリット
    • 生成コスト
    • メモリ
  • イベント駆動
    • 省メモリ
  • Perlだとイベント駆動+prefork

Preforkの話

  • prefork型はDoSに弱い
  • フロントにイベント駆動のロードバランサをおく
  • プロセス数を調節する
  • ピークリクエストと処理時間がわかれば,必要なワーカーを計算できる

イベント駆動向きなもの

  • 予想できなければイベント駆動が向いている
  • フラグを使った強調動作
    • 1ホストに対するリクエスト数の管理とか
  • クローラは相手のスペックがわからないのでイベント駆動がいい

チューニング

  • 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で送信
    • クライアント側ではDUI.jsで処理
  • 大量アクセスを裁けない
    • C10K問題

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

  • 便利
  • shutdown方法がない

Parallel::Prefork

  • シグナルで子プロセスを制御できる
  • 親が受け取ったシグナルを子プロセスのシグナルに対応づける
  • graceful
  • dynamic scaling
    • P::P::SpareWorkers
    • 非推奨

Server::Starter

  • 去年のLTと一緒
  • 環境変数をみてfd_openですでに開いているソケットを使うだけでSS対応できる

Parallel::Scoreboard

  • リソース監視
  • mod_statsuっぽいものを作成しやすくする
  • 監視側
    • Paralle::Scoreboard::PSGI::App
    • Paralle::Scoreboard::PSGI::App::JSON

0 件のコメント:

コメントを投稿