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

27
Ruby / Rails

Upload: yasutomo-uemori

Post on 25-Jan-2017

237 views

Category:

Engineering


1 download

TRANSCRIPT

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

ゲーム会社でのRuby / Rails活用事例

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

About me

植森康友

twitter: @wakaba260yen

github: yuemori

所属:株式会社AimingWebエンジニア

RailsでのAPIサーバやWebアプリケーション開発

インフラサイドも少し

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

今日のテーマ: 「ゲーム会社でのRuby / Rails活用事例」

「ゲーム会社でRuby / Railsって何に使ってるの?」についてお話します

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

Aimingについて

ソーシャルゲーム・オンラインゲーム開発

企画、開発から運営・プロデュースまで

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

主なエンジニアリング領域

ゲームクライアント開発

ゲームサーバ開発

リアルタイムサーバ

WebAPIサーバ

バッチサーバ

開発環境

基盤開発

インフラ

運用

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

主なエンジニアリング領域

ゲームクライアント開発

ゲームサーバ開発

リアルタイムサーバ

WebAPIサーバ

バッチサーバ

開発環境

基盤開発

インフラ

運用

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

ゲーム開発

RailsによりゲームのAPIサーバを開発

バックグラウンドサーバにも活用

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

ゲーム開発

WebAPI

RailsによるゲームのWebAPIの開発

ゲームクライアント、リアルタイムサーバとやり取りする

データフォーマットはMessagePackを採用

内製のIDLを利用して異なる言語間でのプロトコルを定義Unity(C#),リアルタイムサーバ(C++)などとのやり取りに利用

IDL = Interface Description Language

詳しくは後述

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

ゲーム開発

バッチサーバ

ResqueやSidekiqといったgemによるバッチ処理用サーバ

利用シーンはプロジェクトにより様々

キャラクターへのギフト配布

データベースのお掃除

Push通知の送信

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

開発環境

開発環境の効率化にRubyを活用

シェルスクリプトよりも複雑な作業を自動化する

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

開発環境

IDL

IDL = インターフェース記述言語

RubyのDSLを使って異なる言語間でのメッセージを定義する

専用のパーサを使って定義を読み込んだ後、ERBを使ったテンプレートで各言語のコードを生成する

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

IDL

Contract(インターフェース定義)例

rpc(:create_sample) {  url '/sample/create'  method 'POST'

  request {    param 'id', :int, 'ID'    param 'name', :string, '素敵な名前'  }

  response {    param 'sample', :sample, '作成したさんぷる'  }}

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

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 ‐%>  endend<%‐ end ‐%>

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

生成されるコード例

module Sample::Create  class Request < Type::Base    attribute :id, Integer    attribute :name, String  end    class Response < Type::Base    attribute :sample, Type::Sample  endend

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

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からコードを自動生成するメリット

各言語のテンプレートを用意することで、異なる言語間での型

の違いなどを吸収しやすい

開発効率の上昇

インターフェースのドキュメント化

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

開発環境

rakeタスク

マスターデータのインポート

大量のデータを扱うゲーム開発ではExcelなどで設定を行うことが多い

データベースにExcelからデータをインポートするなど

コードジェネレータの実行など

定形作業を自動化する

クライアント、リアルタイムサーバ、WebAPIサーバと異なる

開発環境で複数の定形作業が発生することが多々ある

Jenkinsなどでのバッチ処理CIや簡単なスクリプトなどをRubyスクリプトで記述して実行

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

共通基盤開発

各プロジェクトでの車輪の再発明を防ぐための基盤開発

ゲーム開発・運用に必須の機能をシステムとして提供する

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

共通基盤開発

認証・課金基盤システム

複数のプロジェクトをまたいで利用できる認証、課金用の基盤シス

テム

RailsでWebAPI+管理用ツールを実装

簡易的なOauth Providerとして振る舞う

SNS連携や端末の引き継ぎなどもサポートされている

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

共通基盤開発

会計ツール

毎月の売上を自動で計上する基盤システム

ゲーム内の仮想通貨を売上に換算する

プロジェクトによって仮想通貨の単価が異なる

各プロジェクトでの収入を単価に応じてレポートにする

日本国外の通貨にも対応

海外展開が増えてきたため、正確な収入を出す必要があった

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

共通基盤開発

KPI分析ツール

KPI分析に必要な指標を日時で表示するためのツール

AU

ARPPU

課金率

継続率

FQ5など

SQLクエリを登録するとグラフにして出力するのが主な機能OSSのRe:Dashと似た機能を持つ

CSV出力などにも対応している

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

インフラ

主にデプロイ、バッチ処理などにRubyを利用

ミドルウェアのPluginなども必要に応じて内製ツールを作成

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

インフラ

Deploy / Provisioning

WebAPIでは定番のCapistranoを主に利用している

WebAPIだけならメンテナンスを挟まずにアップデートやバグ修正

が可能

gitが利用しづらいシーンではcapistrano‑scm‑copyも使っている海外展開などで諸事情によりソースコード履歴をサーバに置き

たくないとき

特定のディレクトリだけをコピーしてデプロイしたいとき

ProvisioningにChefを使っているところもあるメインはansible

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

インフラ

バッチ処理

Aimingではログデータ保存先にgoogleのbigqueryを利用している

各種ゲームサーバの出力したログをバッチ処理でアップロード

ログがアップロードされているかのチェックなども

シェルスクリプトよりもRubyの方が柔軟で、リトライ処理な

ども記述しやすい

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

インフラ

ミドルウェアPlugin

fluentdやembulkなど、RubyでPluginが書けるものでは内製Pluginを作成することも

fluentd: 特殊なログのデータ加工

embulk:マスターデータのインポート時のデータ加工

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

運用

お問い合わせ対応

インゲーム告知

お詫びのアイテム配布

など、多くの作業を非エンジニアさんが作業する必要がある

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

運用

管理ツール

プロジェクトで運用業務をするために必要な機能を持つWebアプリケーション

主な機能

キャラクターや所持アイテム、課金履歴などのゲーム内検索

アイテム操作履歴やクエスト受託履歴などのログ検索

対象キャラクターへのギフト配布

DBからのデータ検索だけでなく、bigqueryからのデータ取得・閲

覧にも対応

プランナー向け機能として、デバッグ環境でのデータ変更なども

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

まとめ

様々な技術領域が求められるゲーム開発では、Rubyにはたくさんの利用シーンがある

なぜRubyを使うのか?

すばやく価値を届けられる

スピード感の求められるゲーム開発では重要

柔軟に書けて活用できる領域が広い

Rubyエンジニアの文化も社内に良い影響を与えていると感じる名前重要

テストコード

ツール、自動化

Happy Hacking!