Share
Embed
ゲーム会社でのRuby : rails活用事例
第76回Ruby関西での発表で使ったスライドです
https://rubykansai.doorkeeper.jp/events/55398
Yasutomo Uemori PRO
January 17, 2017
Transcript
27 slides
-
About me 植森康友 twitter: @wakaba260yen github: yuemori 所属: 株式会社Aiming Web
エンジニア Rails でのAPI サー バやWeb アプリケー ション開発 インフラサイドも少し -
今日のテー マ: 「 ゲー ム会社でのRuby / Rails 活用事例」 「 ゲー
ム会社でRuby / Rails って何に使ってるの?」 についてお話します -
主なエンジニアリング領域 ゲー ムクライアント開発 ゲー ムサー バ開発 リアルタイムサー バ WebAPI サー
バ バッチサー バ 開発環境 基盤開発 インフラ 運用 -
主なエンジニアリング領域 ゲー ムクライアント開発 ゲー ムサー バ開発 リアルタイムサー バ WebAPI サー
バ バッチサー バ 開発環境 基盤開発 インフラ 運用 -
ゲー ム開発 WebAPI Rails によるゲー ムのWebAPI の開発 ゲー ムクライアント、 リアルタイムサー
バとやり取りする デー タフォー マットはMessagePack を採用 内製のIDL を利用して異なる言語間でのプロトコルを定義 Unity(C#), リアルタイムサー バ(C++) などとのやり取りに利用 IDL = Interface Description Language 詳しくは後述 -
ゲー ム開発 バッチサー バ Resque やSidekiq といったgem によるバッチ処理用サー バ 利用シー
ンはプロジェクトにより様々 キャラクター へのギフト配布 デー タベー スのお掃除 Push 通知の送信 -
開発環境 IDL IDL = インター フェー ス記述言語 Ruby のDSL を使って異なる言語間でのメッセー
ジを定義する 専用のパー サを使って定義を読み込んだ後、ERB を使ったテンプレ ー トで各言語のコー ドを生成する -
IDL Contract( インター フェー ス定義) 例 r p c (
: c r e a t e _ s a m p l e ) { u r l ' / s a m p l e / c r e a t e ' m e t h o d ' P O S T ' r e q u e s t { p a r a m ' i d ' , : i n t , ' I D ' p a r a m ' n a m e ' , : s t r i n g , ' 素敵な名前' } r e s p o n s e { p a r a m ' s a m p l e ' , : s a m p l e , ' 作成したさんぷる' } } -
IDL コー ドテンプレー ト例 < % ‐ d o c
u m e n t . e a c h _ r p c d o | r p c | ‐ % > m o d u l e < % = r p c . n a m e . c a m e l i z e % > c l a s s R e q u e s t < T y p e : : B a s e < % ‐ r p c . r e s p o n s e . p a r a m s . e a c h d o | p a r a m | ‐ % > a t t r i b u t e < % = p a r a m . n a m e % > , < % = p a r a m . t y p e % > < % ‐ e n d ‐ % > e n d c l a s s R e s p o n s e < T y p e : : B a s e < % ‐ r p c . r e s p o n s e . p a r a m s . e a c h d o | p a r a m | ‐ % > a t t r i b u t e < % = p a r a m . n a m e % > , < % = p a r a m . t y p e % > < % ‐ e n d ‐ % > e n d e n d < % ‐ e n d ‐ % > -
生成されるコー ド例 m o d u l e S a
m p l e : : C r e a t e c l a s s R e q u e s t < T y p e : : B a s e a t t r i b u t e : i d , I n t e g e r a t t r i b u t e : n a m e , S t r i n g e n d c l a s s R e s p o n s e < T y p e : : B a s e a t t r i b u t e : s a m p l e , T y p e : : S a m p l e e n d e n d -
IDL レスポンスの例 s a m p l e = T
y p e : : S a m p l e . n e w ( i d : 1 , n a m e : ' f o o ' ) r e s p o n s e = S a m p l e : : C r e a t e : : R e s p o n s e . n e w ( s a m p l e : s a m p l e ) r e s p o n d _ t o d o | f o r m a t | f o r m a t . m s g p a c k ( b o d y : r e s p o n s e . t o _ m s g p a c k ) e n d 生成された型を使ってMessagePack でシリアライズ・ デシリアラ イズをする Contract からコー ドを自動生成するメリット 各言語のテンプレー トを用意することで、 異なる言語間での型 の違いなどを吸収しやすい 開発効率の上昇 インター フェー スのドキュメント化 -
開発環境 rake タスク マスター デー タのインポー ト 大量のデー タを扱うゲー ム開発ではExcel
などで設定を行うこ とが多い デー タベー スにExcel からデー タをインポー トするなど コー ドジェネレー タの実行など 定形作業を自動化する クライアント、 リアルタイムサー バ、WebAPI サー バと異なる 開発環境で複数の定形作業が発生することが多々 ある Jenkins などでのバッチ処理 CI や簡単なスクリプトなどをRuby スクリプトで記述して実行 -
共通基盤開発 認証・ 課金基盤システム 複数のプロジェクトをまたいで利用できる認証、 課金用の基盤シス テム Rails でWebAPI+ 管理用ツー ルを実装
簡易的なOauth Provider として振る舞う SNS 連携や端末の引き継ぎなどもサポー トされている -
共通基盤開発 会計ツー ル 毎月の売上を自動で計上する基盤システム ゲー ム内の仮想通貨を売上に換算する プロジェクトによって仮想通貨の単価が異なる 各プロジェクトでの収入を単価に応じてレポー トにする 日本国外の通貨にも対応
海外展開が増えてきたため、 正確な収入を出す必要があった -
共通基盤開発 KPI 分析ツー ル KPI 分析に必要な指標を日時で表示するためのツー ル AU ARPPU 課金率
継続率 FQ5 など SQL クエリを登録するとグラフにして出力するのが主な機能 OSS のRe:Dash と似た機能を持つ CSV 出力などにも対応している -
インフラ Deploy / Provisioning WebAPI では定番のCapistrano を主に利用している WebAPI だけならメンテナンスを挟まずにアップデー トやバグ修正
が可能 git が利用しづらいシー ンではcapistrano‑scm‑copy も使っている 海外展開などで諸事情によりソー スコー ド履歴をサー バに置き たくないとき 特定のディレクトリだけをコピー してデプロイしたいとき Provisioning にChef を使っているところもある メインはansible -
インフラ バッチ処理 Aiming ではログデー タ保存先にgoogle のbigquery を利用している 各種ゲー ムサー バの出力したログをバッチ処理でアップロー
ド ログがアップロー ドされているかのチェックなども シェルスクリプトよりもRuby の方が柔軟で、 リトライ処理な ども記述しやすい -
インフラ ミドルウェアPlugin fluentd やembulk など、Ruby でPlugin が書けるものでは内製Plugin を作成することも fluentd: 特殊なログのデー
タ加工 embulk: マスター デー タのインポー ト時のデー タ加工 -
運用 管理ツー ル プロジェクトで運用業務をするために必要な機能を持つWeb アプリ ケー ション 主な機能 キャラクター や所持アイテム、
課金履歴などのゲー ム内検索 アイテム操作履歴やクエスト受託履歴などのログ検索 対象キャラクター へのギフト配布 DB からのデー タ検索だけでなく、bigquery からのデー タ取得・ 閲 覧にも対応 プランナー 向け機能として、 デバッグ環境でのデー タ変更なども -
まとめ 様々 な技術領域が求められるゲー ム開発では、Ruby にはたくさんの 利用シー ンがある なぜRuby を使うのか? すばやく価値を届けられる
スピー ド感の求められるゲー ム開発では重要 柔軟に書けて活用できる領域が広い Ruby エンジニアの文化も社内に良い影響を与えていると感じる 名前重要 テストコー ド ツー ル、 自動化 Happy Hacking!