BPStudy#34 に参加しました キャバクラとErlangについて¶
BPStudy#34 に参加してきました。 いままで3回くらい申込みだけして全然参加出来てませんでした。 ということで、今回初参加。ネタは"AWS+Tornado+Django+AS3"と"Erlang"。
# pyspaのネタも書かないとなー?
第一部「Amazon Web Service+Tornado+Django+AS3によるリアルチャットサービスの裏側」¶
- 発表
@torufurukawa
@akisutesama
@wozozo
- https://xacariva.jp/
特徴: アバター, チャット, 内緒話チャット, キャバクラ
導入 by @torufurukawa¶
- チャットのレスポンスは大事だよね
EC2の応答性悪いかも知れないよね?
国内のサーバーよりはやはり重い
staticについてはクラウドフロントを使うのでなんとか
スケーラビリティーを考慮してEC2に決めた
- 構成
nginx: フロント
django: アバターの着替えなど
CloudFront: 静的データ(画像/SWF)
Tornado: チャット, ロングポーリング
- nginx
ロードバランシング
静的コンテンツ
SSL
SWF by @akisutesama¶
SWFの話。開発中のswfファイルの分割などについての苦労話。 Flashは開発者向けじゃない感じがトークから伝わってきました(笑)
SWCはマジ使えない http://akisute.com/2010/02/flash-swc.html
- 通信リクエストキューの独自実装
シリアル通信
パラレル通信
排他的通信
- デザイナーさんがデザインを自由に決められる
クローゼット、部屋、歩行領域など。
レイヤーがたくさん、たくさんあります
- アバター
1つのアバターを表示するのに120個のswfをとってきて合成
遅そうに聞こえるがかなり実用的な速度で実現している
アニメーション、着せ替え(重ね着)、表上アニメーション
重ね着の順番は自由。スーツの上にシャツとか
10人くらい出すとパーツが1000を超える
- アバターを歩かせる
A*アルゴリズムを使う。経路探索。(清水川の大学の時の研究課題でした。なつかしい)
目標近傍72ピクセルまで近づく、などもA*の拡張でできた
イスに回り込んで正しい角度で座る、という鬼門
- 成功した点(プログラム)
Trnadoのパフォーマンスがすさまじく強力, 25人同時スパムも難なく処理
通信制御のキューは比較的うまくいった
- リリースとテストのビルド環境を分けた
ASUnitとかあるけど非同期通信のテストなどは諦めた
環境を分けたメリットはリリース回数に比例して出てきた
- 成功した点(デザイナー)
デザイナーさんにFlashの知識があると断然楽!
- デザイナーさん、ディレクターさん向け確認ツールを用意した
アバターをAIRですぐ確認できる
ローカルファイルを読めるのでデザイナーさんが更新してすぐ確認できる
- 失敗した点
全面Flashで作っていた方が良かったかも
- HTTPリクエストが多すぎる
API実行がX本
チャットが常時1,2本
アバター読み込み時に100本以上の通信
- IEは同時に2本しかできない
サブドメイン切って対処した
- 椅子はやめとけ
アバターとの重ね合わせ、アニメーションとの整合性など、とにかく大変
flaファイルはできるだけ分割しとけ
うーん、Flashの話は難しいというか、Flashでとても難しいことを実現している。
結論、 椅子はやめとけ 。
Tornado by @wozozo¶
@wozozo 本人を初めて見ました。
チャット以外は全てDjangoでやっています
10000コネクションくらいいけた
Tornadoのデモコードからインスパイア(笑)されたコード
- 自宅サーバーでデモ(笑)
自宅サーバー程度のスペックでも20人くらいじゃ全然落ちない
デバッグが大変。稼働中のオンメモリの内容を確認する
タイムゾーンがハードコーディングで'+0:00'になってた
資料公開希望。シーケンス図とかメモれへんねん。
第二部 Erlang/OTP¶
発表 @voluntas
Erlangプロダクト¶
- RabbitMQ
AMQPサーバ
VMWareに買収された
オープンソース
- ejabberd
XMPPサーバ
eXtensible messaging and Presence Protocol
GoogleTalkが採用しているプロトコル
オープンソース
- MochiWeb
Webサーバ
MochiMediaで開発
FacebookやCouchDBで採用
- CouchDB
ドキュメント指向DBサーバ
IBMが投資
T-MobileやBBCで採用
オープンソース
Ubuntu 10.0.4に最初っから入ってます
- ErlyVideo
RTMPサーバ
1台で数千クライアントを処理可能...らしい(ロシア語資料しかない)
ロシア製
オープンソース
- パケット可視化
WebSocket Server(Erlang)(HTML5)
WebGL (HTML5)
- アクセンステクノロジーでDEMO用に開発
@MiCHiLU + @webos_godies
- この組み合わせは世界初!
AppEngineで作った
サーバーからクライアントにJSONデータを送り続ける
ブラウザはJSONをWebGLで描画し続ける
ErlangサーバーなのでTornadoには負けません
Erlangってなに?¶
- 並列指向言語
関数型って言ったら怒られたので並列指向って言うことにします
spawn(Moduke, Function, Args)で別プロセスを生成可能
軽量プロセス(fibre?)
- プロセス生成が2,3マイクロ秒
コンテキストスイッチはVMがうまいことやってくれる。高速
メッセージパッシング
- 再代入禁止
A=10の後にA=20と書けません
Aという箱に10を入れているのではなく、10という数字をAに束縛している
- グローバル変数禁止
関数単位でしか値が存在できない
グローバル変数という概念がそもそもない
- パターンマッチ
パターンマッチがあればifは要らない
ifは1万行のうち1回使うかどうか
関数の引数でパターンマッチ
関数の評価結果はcase ofでパターンマッチ
- ビット列でパターンマッチ
<<A:1, B:2, C:5>> = <<255>>. でA=1,B=3になる
ネットワークパケットをパターンマッチで処理分岐する
これをCでやることを考えると泣けてくる
OTP¶
- Open Telecom Platform
名前は負の遺産じゃない?
OTPがあることが重要。Erlangそのものより重要
- サーバーが簡単に立てられる
そのサーバーを監視するSuperVisorも用意されている
gen_server, supervisr, applicationの3つが基本
ErlangのDB¶
- Mnesia
Erlang標準の分散DB
メモリとファイルの二方式
障害にも強い
同期はTCP
トランザクション処理すれば同期先まで保証
2GBまでしか入らないという制限も。
- QLCというSQLっぽいものもあるけどそんなに使えない
[ A || A <= [1,2,3,4] ].
<< A:8 || A<- [1,2,3,4] >>. (書き方忘れたvoluntas)
[ A || A <= mnesia:table(Schema), B <- mnesia:table(Schema2), A =:= B]
- mnesiaの使い方
mnesia:write(Table, A).
mnesia:read(Table, Key).
activity いいよ!
CouchDBは自前のBTreeで作っている
R14A¶
末尾のAはアルファリリース, Bはベータ
- 2010/6/16 にR14Aがリリースされた
けっこう大きく更新された
9月にR14Bが公開される予定
その他¶
- こぼれ話
ErlangはJavaより遅くてPythonより早いです
超簡単に負荷ツールを作れるのでTornadoくらい簡単に落とせます
でも経験上、先に送信元のルーターが落ちます(笑)
Erlangはすごい簡単。覚えること少ないのでPythonより簡単
パターンマッチ覚えたらPythonに戻れない
将来載せたい機能は"取りあえず載せて置いて、アンドキュメント&自己責任"
Erlangはネットワークサーバーを書くための言語
- 文字列処理は本気でいけてない。OSSのサードパーティー製も放置が多い
XMLパーサはひどい (xmerl)
やるなら自社または個人で開発してGitHubなどに公開して採用する方がよほどよい
ScalaはXMLのパターンマッチが出来る(@methane)
Erlang陣営はXMLイケテナイと思っているので期待しない
- C拡張するには
SEGV覚悟で内部に結合するか(速いけど落ちる)
別プロセスにして通信するか(遅い)
- ASN.1を食わせるとパーサーをはき出してくれる
LDAPのを食わせるとLDAPのプロトコルパーサーをすぐ作れる
- Q and A
プロセスの優先度設定などは? -> 出来ません
escriptがR14Aで良い感じ
- OMakeいいよ
OCamlで作られたMake
1台に幾つのErlangを立ち上げるのがよいか? -> 1台1つが良いと思います -> 1つ落ちても死なない構成にするのがよい
GCの停止時間はありますか? -> 無いです
TCPコネクション開きすぎでボトルネックにならない? -> fdは100万くらいいけるので大丈夫
デバッガは無いんですか? -> printfです(笑)
UnitTestは? -> あります。ゴリゴリテスト書きましょう
- (voluntas) 本音を言ってしまえば、Erlangに使い道は無いです
Erlangベースのプロダクトを使う、というのはあり。
MochiWebは現実的
第三部 懇親会¶
13人申込み http://atnd.org/events/5202