1. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Developers Summit 2015
技術選択と
アーキテクトの役割
19-A-3
February 19, 2015
Toru Yamaguchi
Senior Architect
Platform System Division
DeNA Co., Ltd.
12. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Developers Summit 2015
DX ゲームのスキームと課題
DX ゲームは大きく分けて二つの開発スキームがあった
⁃ いずれのケースも、開発会社ごとに開発用のサーバーを用意するモ
デル
⁃ これが当時はスケールしない状態だった
12
WAF
MobaSif (Perl)
SNS DX API
WAF
MobaSif (Perl)
SNS DX API
Game
Game Server
MobaSiF
拡張モデル
DX API
連携モデル
14. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Developers Summit 2015
スクラッチで書く際の課題
MobaSiF からスイッチ出来ない理由の一つはミドルウェアへの独自のア
クセス方法が他に無い事が主要な要因
14
WAF
MobaSif (Perl)
SNS Avatar DX API
App Server
MySQL
Cluster
memcached
Cluster
Configuration Discovery Library
Discovery Service
(memcached)
Discovery Service
(MyDNS)
23. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Developers Summit 2015
Y!Mobage のリリース
技術選択とアーキテクトの役割
23
24. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Developers Summit 2015
当時のミッション
Feature Phone での成功の余韻、醒めやまぬ中で早速 PC 展開を模索
⁃ DeNA はこの辺のスピード感が突き抜けております、はい
Y!Japan さんとの協業がもの凄い勢いで決定、PC 展開へ
PC でのソーシャルゲームの実績は、Feature Phone 以前に mixi さんが
十分に実績を積んでいるので選択として OpenSocial 一択に。
24
25. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Developers Summit 2015
Y!Mobage とは
Y!Mobage は OpenSocial 1.0 (対外的には 0.8) に則った OpenSocial
Container です
⁃ OpenSocial は Gadget と呼ばれる HTML アプリケーションが動作
する枠組みの事です
⁃ 2010/07 Sandbox リリース、2010/10 サービスリリース
Backend
⁃ Shindig 拡張や修正
⁃ JavaScript API の拡張や修正
⁃ Social API の全て
Container
⁃ Shindig 連携
25
26. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Developers Summit 2015
Shindig とは
当時の OpenSocial のリファレンス実装
⁃ ベースは Google の OpenSocial 実行環境(iGoogle とか)で使って
いたプロダクトがオープンソースになった物だと記憶しております
Shindig の持つ機能
⁃ Gadget のレンダリング
• Gadgets XML から JS API を埋め込んでレンダリングする機能
⁃ 外部コンテンツの取得
• XHR の Same Origin Policy でも外部コンテンツが取得出来るような形
⁃ JavaScript API の Serve
⁃ Social API のひな形
• 但し Y!Mobage では使っていない
26
27. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Developers Summit 2015
OpenSocial のアーキテクチャ – Render Gadgets (1)
Container URL から appId を取得
appId から Gadgets XML の URL を DB から取得
Security Token を生成
iframe 要素から /gadgets/ifr エンドポイントを呼び出し
27
<iframe>
</iframe>
Shindig
Gadgets XML
yahoo-mbga.jp
*.app.mbga-platform.jp
example.com
28. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Developers Summit 2015
OpenSocial のアーキテクチャ – Render Gadgets (2)
Gadgets XML や Security Token などをパラメータとして Shindig に
渡す
28
<iframe>
</iframe>
Shindig
Gadgets XML
yahoo-mbga.jp
*.app.mbga-platform.jp
example.com
29. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Developers Summit 2015
OpenSocial のアーキテクチャ – Render Gadgets (3)
Shindig は Gadgetx XML を http(s) 経由で取得
⁃ ちなみに Y!Mobage では間に Squid を入れています
29
<iframe>
</iframe>
Shindig
Gadgets XML
yahoo-mbga.jp
*.app.mbga-platform.jp
example.com
30. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Developers Summit 2015
OpenSocial のアーキテクチャ – Render Gadgets (4)
Shindig は Gadgets XML を受け取ります
30
<iframe>
</iframe>
Shindig
Gadgets XML
yahoo-mbga.jp
*.app.mbga-platform.jp
example.com
31. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Developers Summit 2015
OpenSocial のアーキテクチャ – Render Gadgets (5)
Gadgets XML から該当するコンテンツを HTML として出力する
JavaScript API などを埋め込む
31
<iframe>
</iframe>
Shindig
Gadgets XML
yahoo-mbga.jp
*.app.mbga-platform.jp
example.com
32. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Developers Summit 2015
OpenSocial のアーキテクチャ – Render Gadgets (6)
これで Gadget のレンダリングがおしまい
32
<iframe>
</iframe>
Shindig
Gadgets XML
yahoo-mbga.jp
*.app.mbga-platform.jp
example.com
33. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Developers Summit 2015
Y!Mobage の構築時に必要だったこと
世界的に見ても OpenSocial Container の実装例は両手で数えられる程
度の事例しか無かった (参考)
⁃ OpenSocial 環境でアプリケーションを作る事例は腐るほどある
OpenSocial Gadget Server も Shindig 以外の現実的な選択肢は無かっ
た
つまり必要だったのは以下
⁃ OpenSocial Container を作る方法を知る
• 当然後ろの Gadget Server との連携方法を知る
⁃ OpenSocial Gadget Server の拡張の仕方を知る
この辺は自分を含めた三名で調査しました
OpenSocial Container と Gadget Server との連携に必要なライブラリ
は自ら書きました
33
34. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Developers Summit 2015
当時の Gadgets Server の構成
Shindig 自体も Social API のひな形があるが、Perl で書いた方が早かっ
たので L7 分散して OpenSocial 0.9 相当の API を書く事にした
⁃ JavaScript API は JSON-RPC による呼び出しを期待してるので、
このとき始めて JSON-RPC を提供する事になりました
34
Shindig
API Server
lighttpd
/gadgets
*.app.mbga-platform.jp
/social
• Gadgets XML の取得とレンダリング
• JS API のサーブ
• 外部コンテンツの取得
• Social API の提供 (Security Token で呼び出し)
35. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Developers Summit 2015
API Server の刷新 – 課題
Feature Phone 時代に作った API Server がありましたが、これを契機
に新しく作り直す事にしました
⁃ 学習コストの面
⁃ パフォーマンスの面
FP 時代の API の課題
⁃ 学習コストの面
• 当時の Perl 界隈で流行っていた Catalyst (RoR みたいな奴) ベースで作ら
れていたが、お作法が必要以上に多かった
• 但しスタンドアローンの FastCGI Server や HTTP Server として動作する
他の選択肢が無かったので当時は断念
⁃ パフォーマンスの面
• WAF や中で用いられているライブラリが必要以上にインスタンスを大量に
生成する
35
36. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Developers Summit 2015
API Server の刷新 – アプローチ
2010 年頃の Perl 界隈
⁃ Rack (Ruby), WSGI (Python) に当たる PSGI (Perl) の環境がだい
ぶ充実しつつあった
⁃ WAF を作る為の部品 (Router だとか) がだいぶ充実してきた
RESTful API と JSON-RPC に特化したドメインスペシフィックで軽量
なサーバーを構築する事にした
⁃ 極力、CoW (Copy on Write) の恩恵に授かれるようにした
• モジュールだけでなくインスタンスも。
⁃ 動的にインスタンスを量産しないようにした
⁃ オブジェクトコンテナごと設定に応じて切り替えられるようにした
⁃ etc …
36
37. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Developers Summit 2015
API Server の刷新 – 技術選択
使ってみたいという選択は素人
⁃ 選択した上で何をもたらすかを明確にするべき
• ここでは学習コストが低く軽量に動作する REST/JSON-RPC 特化というコ
ンセプトにした
その後の人の関わりや今後の展開をイメージすべき
⁃ その後何人で開発を進めて行くのか、今後プロジェクトにどういっ
た展開が考えられるか
• 今の所は3人だが、今後10人くらいになるかもしれない
• 今は Feature Phone や PC のみだが、スマホが普及するにつれスマホ対応
もあるだろう
37
50. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Developers Summit 2015
アーキテクトの役割
コンセプトメーカーたるべし
⁃ ユーザーにどう使って欲しいか、どう見せたいか
⁃ ユーザーにどのタイミングで伝えるべきか
⁃ これらをイメージした上でどのようなシステム構成が最適かを考え
る
データのフローを俯瞰的に見る
⁃ システム全体を捉え、個々のサービスは小さく保ち、どのようにデ
ータが流れて加工されていくかをデザインしていく
50
51. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Developers Summit 2015
グローバル展開と Leaderboard/Remote
Notification
技術選択とアーキテクトの役割
51
52. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Developers Summit 2015
Mobage のグローバル展開
SDK は共通の実装で Localize し、API の実装は別々
⁃ インターフェースの統一を行い実装は別
⁃ インターフェースは JP/US で議論して合意
52
JP KR CN TW West
Japan China US
SDK
API Impl API Impl
Common API Interface
53. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Developers Summit 2015
インターフェースの統一の困難 (1)
異なる実装で同じインターフェースはかなり厳しい
言語の壁
⁃ I cannot speak English!
データ型の定義が曖昧
⁃ id は String じゃ曖昧
• 文字列長は?どういうパターン?
• The length of the field equals or greater than 10 bytes and …
⁃ やってられるかw
⁃ この辺のやりとりが厳格にならず、軽量の Schema があると良いな
と思った
• 後の JSON Schema 導入に繋がる
53
55. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Developers Summit 2015
グローバル展開で生まれた API たち
Bank API
⁃ アイテム課金系の API 群
Remote Notification API
Leaderboard API
⁃ ランキング
55
61. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Developers Summit 2015
Leaderboard (1)
突然ですが問題です
上記のクエリの問題点を5秒以内に答えよ
61
SELECT user_id, score
FROM user_scores
WHERE app_id = @app_id
ORDER BY score DESC
LIMIT 100 OFFSET 10000;
62. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Developers Summit 2015
Leaderboard (2)
MySQL の OFFSET は値が大きくなればなるほど重たい
62
SELECT user_id, score
FROM user_scores
WHERE app_id = @app_id
ORDER BY score DESC
LIMIT 100 OFFSET 10000;
70. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Developers Summit 2015
mixi Platform で目指した物
ただお題を満たすだけではつまらない
やるべき事が決まっている時は出来る限り高い技術的ハードルを儲ける
とモチベーションが維持出来ます
⁃ 常日頃からやりたかった事や、今まであまりやっていなかった事を
試験的に盛り込んで行く事にしました
70
71. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Developers Summit 2015
インドの神様 – 三神一体(トリニティ)
Mobage Platform の Microservices 推進の為に、最終的にはこういう世界観
にしようと考えた
⁃ ちょうど役目が三つあったのでトリニティという事でコンポーネント名
も決定
71
Token
Brahman
Vishnu Shiva
Internal API
Internal API
Client
Resource Owner
Authorization Server
Authorization Proxy
Server
Micro Internal API
Framework
API call
OAuth 2.0/OpenID Connect
72. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Developers Summit 2015
インドの神様 – mixi の場合
mixi Platform 構築では赤字の部分を構築しようと決めた
⁃ 残りはいつかやろうと思ってましたが、結果的に後に始める事とな
る NBPF プロジェクトで作る事に。
72
Token
mixi
Vishnu Shiva Agni
Mobafy
Resource Owner
Authorization Server
Authorization Proxy
Server
Micro Internal API
Framework
API call
OAuth 2.0/OpenID Connect
Internal API
for mixi
73. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Developers Summit 2015
mixi でのデータ同期
User だけでなく Client 情報も Sandbox/Service で同期
⁃ こうする事によって mixi 上でもアプリケーション扱いされカタロ
グや検索などそのまま用いる事ができ、そのクライアントの権限に
よって API アクセスも可能
73
mixi
Authorization
Server
Hermit
mixi
Authorization
Server
Hermit
Internal API Internal API
App App
Application
Sandbox Service
74. Copyright (C) DeNA Co.,Ltd. All Rights Reserved.
Developers Summit 2015
JSON Web Token の実践投入
mixi Platform では Session Cookie に適用した
⁃ ついでに Japan Identity and Cloud Summit 2013 の基調講演で
話して来ました
⁃ http://tinyurl.com/kzzlgfq
⁃ 実はボツ版が存在していて、そっちのが面白いです
多分 Session ID に構造化データを入れる例は昔からあったと思います
が、内部ネットワークトラフィック軽減を視野に入れた JWT の利用っ
てのはかなり先進的な取り組みだったと思います
この辺りの話は How to bake delicious cookie において書いてますが
、今までと同じやり方を疑うというポリシーで検討した上で導入した物
です
74