Date: 2010-06-30
Tags: event, python

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

../../_images/20100630_bpstudy34_1.jpg ../../_images/20100630_bpstudy34_2.jpg ../../_images/20100630_bpstudy34_3.jpg ../../_images/20100630_bpstudy34_4.jpg ../../_images/20100630_bpstudy34_5.jpg ../../_images/20100630_bpstudy34_6.jpg ../../_images/20100630_bpstudy34_7.jpg ../../_images/20100630_bpstudy34_8.jpg ../../_images/20100630_bpstudy34_9.jpg