ゲーム会社でのRuby : rails活用事例

290 views

Published on

第76回Ruby関西での発表で使ったスライドです
https://rubykansai.doorkeeper.jp/events/55398

Published in: Engineering
1 Comment
2 Likes
Statistics
Notes
No Downloads
Views
Total views
290
On SlideShare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
1
Comments
1
Likes
2
Embeds 0
No embeds

No notes for slide

ゲーム会社でのRuby : rails活用事例

  1. 1. ゲーム会社でのRuby / Rails活用事例
  2. 2. About me 植森康友 twitter: @wakaba260yen github: yuemori 所属:株式会社Aiming Webエンジニア RailsでのAPIサーバやWebアプリケーション開発 インフラサイドも少し
  3. 3. 今日のテーマ: 「ゲーム会社でのRuby / Rails活用事例」 「ゲーム会社でRuby / Railsって何に使ってるの?」についてお話します
  4. 4. Aimingについて ソーシャルゲーム・オンラインゲーム開発 企画、開発から運営・プロデュースまで
  5. 5. 主なエンジニアリング領域 ゲームクライアント開発 ゲームサーバ開発 リアルタイムサーバ WebAPIサーバ バッチサーバ 開発環境 基盤開発 インフラ 運用
  6. 6. 主なエンジニアリング領域 ゲームクライアント開発 ゲームサーバ開発 リアルタイムサーバ WebAPIサーバ バッチサーバ 開発環境 基盤開発 インフラ 運用
  7. 7. ゲーム開発 RailsによりゲームのAPIサーバを開発 バックグラウンドサーバにも活用
  8. 8. ゲーム開発 WebAPI RailsによるゲームのWebAPIの開発 ゲームクライアント、リアルタイムサーバとやり取りする データフォーマットはMessagePackを採用 内製のIDLを利用して異なる言語間でのプロトコルを定義 Unity(C#),リアルタイムサーバ(C++)などとのやり取りに利用 IDL = Interface Description Language 詳しくは後述
  9. 9. ゲーム開発 バッチサーバ ResqueやSidekiqといったgemによるバッチ処理用サーバ 利用シーンはプロジェクトにより様々 キャラクターへのギフト配布 データベースのお掃除 Push通知の送信
  10. 10. 開発環境 開発環境の効率化にRubyを活用 シェルスクリプトよりも複雑な作業を自動化する
  11. 11. 開発環境 IDL IDL = インターフェース記述言語 RubyのDSLを使って異なる言語間でのメッセージを定義する 専用のパーサを使って定義を読み込んだ後、ERBを使ったテンプレ ートで各言語のコードを生成する
  12. 12. IDL Contract(インターフェース定義)例 rpc(:create_sample) {   url '/sample/create'   method 'POST'   request {     param 'id', :int, 'ID'     param 'name', :string, '素敵な名前'   }   response {     param 'sample', :sample, '作成したさんぷる'   } }
  13. 13. IDL コードテンプレート例 <%‐ document.each_rpc do |rpc| ‐%> module <%= rpc.name.camelize %>   class Request < Type::Base     <%‐ rpc.response.params.each do |param|‐%>     attribute <%= param.name %>, <%= param.type %>     <%‐ end ‐%>   end   class Response < Type::Base     <%‐ rpc.response.params.each do |param|‐%>     attribute <%= param.name %>, <%= param.type %>     <%‐ end ‐%>   end end <%‐ end ‐%>
  14. 14. 生成されるコード例 module Sample::Create   class Request < Type::Base     attribute :id, Integer     attribute :name, String   end      class Response < Type::Base     attribute :sample, Type::Sample   end end
  15. 15. IDL レスポンスの例 sample = Type::Sample.new(id: 1, name: 'foo') response = Sample::Create::Response.new(sample: sample) respond_to do |format|   format.msgpack(body: response.to_msgpack) end 生成された型を使ってMessagePackでシリアライズ・デシリアラ イズをする Contractからコードを自動生成するメリット 各言語のテンプレートを用意することで、異なる言語間での型 の違いなどを吸収しやすい 開発効率の上昇 インターフェースのドキュメント化
  16. 16. 開発環境 rakeタスク マスターデータのインポート 大量のデータを扱うゲーム開発ではExcelなどで設定を行うこ とが多い データベースにExcelからデータをインポートするなど コードジェネレータの実行など 定形作業を自動化する クライアント、リアルタイムサーバ、WebAPIサーバと異なる 開発環境で複数の定形作業が発生することが多々ある Jenkinsなどでのバッチ処理 CIや簡単なスクリプトなどをRubyスクリプトで記述して実行
  17. 17. 共通基盤開発 各プロジェクトでの車輪の再発明を防ぐための基盤開発 ゲーム開発・運用に必須の機能をシステムとして提供する
  18. 18. 共通基盤開発 認証・課金基盤システム 複数のプロジェクトをまたいで利用できる認証、課金用の基盤シス テム RailsでWebAPI+管理用ツールを実装 簡易的なOauth Providerとして振る舞う SNS連携や端末の引き継ぎなどもサポートされている
  19. 19. 共通基盤開発 会計ツール 毎月の売上を自動で計上する基盤システム ゲーム内の仮想通貨を売上に換算する プロジェクトによって仮想通貨の単価が異なる 各プロジェクトでの収入を単価に応じてレポートにする 日本国外の通貨にも対応 海外展開が増えてきたため、正確な収入を出す必要があった
  20. 20. 共通基盤開発 KPI分析ツール KPI分析に必要な指標を日時で表示するためのツール AU ARPPU 課金率 継続率 FQ5など SQLクエリを登録するとグラフにして出力するのが主な機能 OSSのRe:Dashと似た機能を持つ CSV出力などにも対応している
  21. 21. インフラ 主にデプロイ、バッチ処理などにRubyを利用 ミドルウェアのPluginなども必要に応じて内製ツールを作成
  22. 22. インフラ Deploy / Provisioning WebAPIでは定番のCapistranoを主に利用している WebAPIだけならメンテナンスを挟まずにアップデートやバグ修正 が可能 gitが利用しづらいシーンではcapistrano‑scm‑copyも使っている 海外展開などで諸事情によりソースコード履歴をサーバに置き たくないとき 特定のディレクトリだけをコピーしてデプロイしたいとき ProvisioningにChefを使っているところもある メインはansible
  23. 23. インフラ バッチ処理 Aimingではログデータ保存先にgoogleのbigqueryを利用している 各種ゲームサーバの出力したログをバッチ処理でアップロード ログがアップロードされているかのチェックなども シェルスクリプトよりもRubyの方が柔軟で、リトライ処理な ども記述しやすい
  24. 24. インフラ ミドルウェアPlugin fluentdやembulkなど、RubyでPluginが書けるものでは内製Plugin を作成することも fluentd: 特殊なログのデータ加工 embulk:マスターデータのインポート時のデータ加工
  25. 25. 運用 お問い合わせ対応 インゲーム告知 お詫びのアイテム配布 など、多くの作業を非エンジニアさんが作業する必要がある
  26. 26. 運用 管理ツール プロジェクトで運用業務をするために必要な機能を持つWebアプリ ケーション 主な機能 キャラクターや所持アイテム、課金履歴などのゲーム内検索 アイテム操作履歴やクエスト受託履歴などのログ検索 対象キャラクターへのギフト配布 DBからのデータ検索だけでなく、bigqueryからのデータ取得・閲 覧にも対応 プランナー向け機能として、デバッグ環境でのデータ変更なども
  27. 27. まとめ 様々な技術領域が求められるゲーム開発では、Rubyにはたくさんの 利用シーンがある なぜRubyを使うのか? すばやく価値を届けられる スピード感の求められるゲーム開発では重要 柔軟に書けて活用できる領域が広い Rubyエンジニアの文化も社内に良い影響を与えていると感じる 名前重要 テストコード ツール、自動化 Happy Hacking!

×