SlideShare a Scribd company logo
1 of 73
Download to read offline
Copyright Drecom Co., Ltd. All Rights Reserved.
2014/07/12 @sue445
関西ソーシャルゲーム勉強会・2014夏
Copyright Drecom Co., Ltd. All Rights Reserved.
自己紹介
sue445
● ドリコム サービス基盤部
○ 主に社内ツール、社内ライブラリ系
○ ガルロワ、フルボッコ、ジョジョSS、トレクルなど、最近のネ
イティブアプリの課金決済系ライブラリ作ってます
○ たまにインフラ
● Ruby歴2年のルビーチョットデキルエンジニア
● 当時ドリコム入社1年半にして今回初めてガチャを作った(重
要)
● 好きな言語はJava(重要)
● 自称:TDDマニアなキュアエンジニア
Copyright Drecom Co., Ltd. All Rights Reserved.
趣味で作ってるもの
● rubicure
○ https://github.com/sue445/rubicure
○ プリキュアのRuby実装
● Gitpeach
○ https://github.com/sue445/gitpeach
○ issueをカンバン風に管理
○ Gitlab用のwaffle.ioクローン
● Chrome Gitlab Notifier
○ https://github.com/sue445/chrome-gitlab-notifier
○ Gitlabの通知をChromeで受け取る拡張
● and more !
Copyright Drecom Co., Ltd. All Rights Reserved.
【CM】ワタシハ テスト チョットデキルTシャツ
エンジニアならチェックしておきたい技術系Tシャツまと
め - くりにっき
Copyright Drecom Co., Ltd. All Rights Reserved.
【CM】フルボッコヒーローズ
http://official.fullbokko.drecom.jp/
Copyright Drecom Co., Ltd. All Rights Reserved.
Copyright Drecom Co., Ltd. All Rights Reserved.
今期の嫁: キュアハニー
Copyright Drecom Co., Ltd. All Rights Reserved.
本妻: キュアピース
【最近のお気に入り】枕嫁
チラリズムよい
【CM】プリキュアハッカソン2 開催!@弊社
http://connpass.com/event/7181/
Copyright Drecom Co., Ltd. All Rights Reserved.
アジェンダ
● リセマラ is 何
● 開発体制
● 実績
● アプリの構成
● 工夫したこと
● Twitter APIの闇
● よくある質問
● エピローグ
Copyright Drecom Co., Ltd. All Rights Reserved.
リセマラ is 何
● 「リセットマラソン」の略
● パズドラとかでゲーム開始直後にもらえるカードがランダムな
ので、強いユニットが貰えるまでインストールとアンインストー
ルを繰り返すこと
● 中の人的にはインストールユーザと実際のユーザの剥離が
出るのでつらい。。。
Copyright Drecom Co., Ltd. All Rights Reserved.
ゲームリリース前に公式でリセマラできるようにしたw
当時のドメインも resemara.fullbokko.drecom.jp
Copyright Drecom Co., Ltd. All Rights Reserved.
Attention!!
● ここに掲載してる技術情報は2014年3月時点のものなので
若干古いです
○ 事前登録期間が2013年12月~2014年2月のため
Copyright Drecom Co., Ltd. All Rights Reserved.
解決策
実演
Copyright Drecom Co., Ltd. All Rights Reserved.
Twitterで認証してつぶやけば何回でもガチャ回せる
Copyright Drecom Co., Ltd. All Rights Reserved.
詳しいこと
● フライングゲットガチャ セミナー資料
○ http://www.slideshare.net/drecom/drecom-20140225-
seminar-31882381
● 【ドリコムセミナーレポート】『フライングゲットガチャ』はなぜ成
功したのか? マーケティング担当者がその秘訣を語る。 |
Social Game Info
○ http://gamebiz.jp/?p=127470
Copyright Drecom Co., Ltd. All Rights Reserved.
メンバー
● 開発 x 1
○ sue445(サーバ周り全部)
○ ガチャ演出周りで助っ人(2週間くらい)
● デザイン x 1
○ 絵とコーディング回り
● 企画 x 1
● 開発計1ヶ月弱くらい
○ 途中で仕様変更が何回もあったので実開発は2週間くら
い
Copyright Drecom Co., Ltd. All Rights Reserved.
実績
● Twitter/Facebook認証数
○ 約10万人
● 事前登録数:48万人
○ 業界最多?(たぶん)
● ガチャ総回転数
○ 996万回
○ 瞬間最大風速0:00~0:10でガチャ13500回転くらい
Copyright Drecom Co., Ltd. All Rights Reserved.
本番環境の構成
● web x 2
○ redisあいのり(redis 2.6.16)
○ それぞれにredis入れてVIPでアクセス(後述)
● db x 2 (fioではなく普通のHDD)
○ MySQL Percona server
● cache x 2
○ 最初はwebにmemcache同居だったけどメモリ的に厳し
かったので途中で追加してもらった
● いずれもCentOS 6
● 負荷が読めないのでとりあえずミニマムスタートしてみたが
割となんとかなった
Copyright Drecom Co., Ltd. All Rights Reserved.
よくあるKVS構成
web-xx web-xx job-xx job-xx
redis-01
(Master)
redis-02
(Slave)
VIP
Copyright Drecom Co., Ltd. All Rights Reserved.
フラゲガチャのKVS構成(サーバ節約)
web-02
VIP
web-01
redis(M) redis(S)
自分自身にVIPをつけるこ
とで最低限の台数でHA構
成を構築
Copyright Drecom Co., Ltd. All Rights Reserved.
ステージング環境の構成
● Debian Wheezy
● OpenStackの自分用Railsアプリ頻出ミドル全部入りスナップ
ショットからインスタンス立てて環境構築
○ nginx, mysql, redis, memcached, git, tmux, 自分の
dotfilesなど
● 詳しくは弊社外道父のブログ参照
○ OpenStackでつくる開発環境と外道塾 発表資料 | 外道
父の匠
Copyright Drecom Co., Ltd. All Rights Reserved.
アプリ周り
● Ruby 2.0.0-p353 + Rails 4.0.2
○ リリース当時(2013/12/16)では最新
○ 途中で2.1.0出たけど数ヶ月でお役御免だったのでス
ルー
● capistrano 3
○ v2 -> v3で全部変わってたのでtaskを全部書き直した
○ webサーバ2台なのにクラスタリスタート作ったw
○ 開発期間短いながらも自分のアプリで人柱になって、有
志の手により社内gem化された
Copyright Drecom Co., Ltd. All Rights Reserved.
機能
作った
● 事前登録
● リセマラガチャ
● シリアル生成
● DM送信
作ってない
● レポート系(工数削減のため)
○ GoogleAnalytics
○ fluentd (事前登録とガチャ)
● メンテナンス画面
○ 忘れてたw
Copyright Drecom Co., Ltd. All Rights Reserved.
工夫したこと
● 事前登録
● リセマラガチャ
● TwitterのDM大量送信
Copyright Drecom Co., Ltd. All Rights Reserved.
事前登録
Copyright Drecom Co., Ltd. All Rights Reserved.
事前登録
仕様
● 認証不要
● 「事前登録する」のPOSTの度に一意なシリアルコードを作る
● シリアルコードがiOSかAndroidかアプリ側で識別したい
問題点
● 表示したシリアルを全部DBに突っ込んでたら死ぬ(容量的に
も負荷的にも)
● 認証かかってないため、GoogleのクローラとかがPOSTする
と事前登録数が水増しされてしまう
Copyright Drecom Co., Ltd. All Rights Reserved.
表示したシリアルを全部DBに突っ込んでたら死ぬ問題
解:シリアルコードの暗号・復号化社内ライブラリ使った
● 別アプリで作ってたのを流用
● 見た目は12文字の数字だけど、39ビット分の情報を持たせ、
報酬IDや連番も含ませたり整合性チェックもできるようにした
● 連番をredis counterで持たせた
○ iOSとAndroid各1つずつ
○ 本当なら発行したシリアルを全部DBにINSERTするとこ
ろだが、redis counterを2つだけ使うだけで万事解決
Copyright Drecom Co., Ltd. All Rights Reserved.
クローラによる水増し問題
● bodyにformタグを全て含めないことで、スクレイピングしただ
けではボタンを押せないようにした
● Ajax使えばクローラはだいたいごまかせる(気がする)
● 後発の他社の事前登録ガチャはこの対策してないように見
えた
Copyright Drecom Co., Ltd. All Rights Reserved.
クローラによる水増し問題
HTML上はformタグ
のactionが空
onclickでsubmit直前
に設定する
Copyright Drecom Co., Ltd. All Rights Reserved.
リセマラガチャ
Copyright Drecom Co., Ltd. All Rights Reserved.
リセマラガチャ
仕様が複雑
Copyright Drecom Co., Ltd. All Rights Reserved.
リセマラガチャ
問題点
● 6時間ごとにworkerで全ユーザのガチャ回数リセットすると
ユーザ増えた時に処理に時間がかかって死ぬ
● ガチャ回す度にヒストリレコードINSERT&ガチャ総回転数
UPDATEしたらDBが負荷で死ぬ
● Twitterの性質上バズると局所的にアクセスが来るため負荷
が読めない
● そもそもの仕様が複雑 (;´Д`)
Copyright Drecom Co., Ltd. All Rights Reserved.
解決策
全部redisでよくね?
Copyright Drecom Co., Ltd. All Rights Reserved.
リセマラガチャ
Copyright Drecom Co., Ltd. All Rights Reserved.
画面表示でSELECTすらしてないwww
redis counter
redis counter
redis counter
redis counter
(with expire)
Copyright Drecom Co., Ltd. All Rights Reserved.
ガチャ回す時は3種類のカウンタを同時に増やす
全員の総回
転数++
自分の回転数++
1ターム内のガチャ回数++
Copyright Drecom Co., Ltd. All Rights Reserved.
MySQL使ってるのはたったこれだけ
● ユーザ認証
○ 認証後にtwitterのaccess tokenをユーザマスタに入れる
● POSTする時にcurrent userでロック(SELECT ~ FOR
UPDATE)
○ パワーアタック系のチート対策
○ 1ユーザで複数同時に処理を走らせない
● ユニット確定時に報酬レコードをINSERTする
Copyright Drecom Co., Ltd. All Rights Reserved.
よくあるガチャのテーブル構成(適当)
users
user_car
ds
gacha_car
ds
1 n
n   1
cards
gachas
gacha_his
tories
1 n
n
1
n 1
1
n
n 1
Copyright Drecom Co., Ltd. All Rights Reserved.
リセマラガチャのテーブル構成
users
user_rewa
rds
rewards
1   n n   1
● rewards = cards + gachas
○ 今回はガチャ1つしかやらないので分ける必要もなかった
○ rewardsをガチャの度に全件取得するコストが心配だった
が、ガチャで使う最低限のカラムしかないため余裕だった
● ガチャ履歴もログに出してfluentdで送るようにしたのでガ
チャのhistoryテーブルも不要
Copyright Drecom Co., Ltd. All Rights Reserved.
redis内訳
users (各ユーザに対してカウンタが設定)
● ガチャ合計回転数
● 1ターム内のガチャ回転数
○ 0, 6, 12, 18時にexpire
● 1ターム内のリセット回数
○ 0, 6, 12, 18時にexpire
ユーザに紐付かない系
● シリアルコード内の連番(iOS, Androidそれぞれ)
○ 事前登録する度にインクリメント
○ 事前登録数はこれの合計
● 全ユーザ合計のガチャ回転数
● ★5(一番レアリティの高いユニット)の放出数
Copyright Drecom Co., Ltd. All Rights Reserved.
redisの値に有効期限をつける方法
EXPIRE key sec or EXPIREAT key unixtime
● リセマラでは後者を利用
● redis-objectsのドキュメントには一切書いてなかったがソー
ス見たら実装されてた
○ ただしunixtimeなので Time#to_i して渡す
● ガチャ回す時にINCRとEXPIREATを同時に使う
● 現在時間を元に次の6時, 12時 … を算出するのが一番大変
だったw
○ 時間のテストはdelorean最強
○ https://github.com/bebanjo/delorean
Copyright Drecom Co., Ltd. All Rights Reserved.
expireつけた結果
ガチャリセットのかかる0時, 6時, 12時, 18時きっかりに山ができ
てるw
Copyright Drecom Co., Ltd. All Rights Reserved.
cacti @db ピーク時でもCPU使用
率0.14% www
Copyright Drecom Co., Ltd. All Rights Reserved.
cacti @web
LAもピーク時で1〜2くらい
Copyright Drecom Co., Ltd. All Rights Reserved.
Twitter APIの闇
1. 凍結済ユーザの判別が困難な問題
2. DM送信コストが結構高い件について
3. アプリのパーミッションが大雑把な問題
Copyright Drecom Co., Ltd. All Rights Reserved.
1. 凍結済ユーザの判別が困難な問題
他ユーザから凍結済ユーザを見ようとすると403(エラー
(Forbidden)になるが、凍結済ユーザ自身は普通に見れ
る
Copyright Drecom Co., Ltd. All Rights Reserved.
@sue445_sst5 が凍結済ユーザ
Copyright Drecom Co., Ltd. All Rights Reserved.
何が問題か?
● 凍結済でもTwitterで認証してログインできる
● ガチャ回せる
● つぶやく時に初めてエラーになる
○ 調べたら凍結済ユーザでもGET系は全部大丈夫
で、POST系が全部失敗。。。
● 事前登録終了後にDMでシリアルコードを送れない
○ CSのコストup
Copyright Drecom Co., Ltd. All Rights Reserved.
結局どうした?
諦めた(キリッ
● 公式アカウント(@fullbokkoheroes)経由でチェックす
るにしてもRateLimitがあるので限界がある
● 15分間で180回までなので焼け石に水
Copyright Drecom Co., Ltd. All Rights Reserved.
2. DM送信コストが結構高い件について
● ユニットを確定してたら事前登録終了後にDMでシリアルを送
る
● 年末にDMを送ったら1時間半で7000通しか送れなかった
○ 秒速1.3通
○ Twitter API叩くコストが意外に高い
● 発行したシリアルは50000枚
○ ガチャ35000枚, お年玉15000枚
○ このままだと全部DM送るのに65000秒(=18時間)かかる
ことにw
○ ヤバイ
Copyright Drecom Co., Ltd. All Rights Reserved.
【解決方法】並列送信
● redisは使ってたけどSidekiqやResque(Rubyの並列処理の
ライブラリ)は入れていなかったので昔ながらのThreadを使っ
た
○ 数回しか使わないスクリプトのためだけにセットアップす
るのが抵抗あった
● 普通にやるとThreadが一度に全実行されるため同時実行す
るスレッド数を制限する必要ある
○ サーバの負荷とAPI実行時の帯域がやばい
Copyright Drecom Co., Ltd. All Rights Reserved.
【解決方法】並列送信
● ruby-threadのThread pool使った
○ 20スレッドでDM45000通送るのに約40分
○ 秒速18通
● jobサーバがないのでDM送信の度に本番のwebを1台切り
離して即席jobサーバにしてた(つらい)
○ ピーク時避ければweb1台でも耐えられた
● rubyのプロセスだけでCPU 50〜60%くらい使った
● SidekiqやResqueでqueueの数制限するのが大正解
Copyright Drecom Co., Ltd. All Rights Reserved.
3. アプリのパーミッションが大雑把な問題
Twitterアプリのパーミッションは大きく分けて3種類
● Read only
○ GETは出来るがPOSTはダメ
○ 例)Twilog
● Read and write
○ GETとPOSTはOK
○ DMは送信出来るが受信は出来ない
○ 例)ボット
● Read, Write and Access direct messages
○ ↑ + DM送受信OK
○ 例)普通のTwitterクライアント
Copyright Drecom Co., Ltd. All Rights Reserved.
適切なパーミッションって?
アプリの仕様上つぶやきとDM送
信できればいいのでRead and
writeが適切(重要)
Copyright Drecom Co., Ltd. All Rights Reserved.
アプリに適切なパーミッションが大事
● 不要なパーミッションはつけない
○ 何も考えずに適当に「Read, Write and Access direct
messages」にするのはセキュリティ的によろしくない
○ twitterでアプリ連携する=自分の家の合鍵を他人に預ける
のと同じ
● パーミッションが広いと意識の高いユーザが不安に思
う
○ 懐中電灯アプリで電話帳やGPSにパーミッションがあるの
と同じような感じ
● 下手すると事案に発展する可能性がある
Copyright Drecom Co., Ltd. All Rights Reserved.
ここで他社事例を見てみ
ましょう
Copyright Drecom Co., Ltd. All Rights Reserved.
セーフw
Copyright Drecom Co., Ltd. All Rights Reserved.
アウトおおおおおおおおおおおお
Copyright Drecom Co., Ltd. All Rights Reserved.
アウトおおおおおおおおおおお
Copyright Drecom Co., Ltd. All Rights Reserved.
もし間違えて認証しちゃったら
● https://twitter.com/settings/applications で認証を取り消せ
ばok
Copyright Drecom Co., Ltd. All Rights Reserved.
【重要事項】
● アプリのパーミッションは一応変更出来る
○ 変更するとユーザから取得したaccess tokenは全部無効
になる
○ 認証を事前に取得しておいて後から使うような使い方だ
と、途中でパーミッションを変えると死ぬ
● それ以外の情報(アプリ名やアイコンなど)は途中で変えても
問題なし
Copyright Drecom Co., Ltd. All Rights Reserved.
よくある質問
● Q. 失敗談
○ A. 1回だけ間違えて本番落としたw
○ その時点ではまだデプロイしてはいけないものを間違え
て本番に上げた
○ cap deploy:rollback は神
○ 【教訓】何かあってから命綱を作るのは手遅れ。命綱は常
に整備しておくべき
● Q. 最初からRedisメインにしようと思った?
○ 「一定時間で回数リセット」って仕様聞いた時にKVS使っ
た方がいいような予感はしてた
○ 既存アプリだとDBがボトルネックで詰まるのをよく見てた
ので、極力DBを使わない構成にしたかった
Copyright Drecom Co., Ltd. All Rights Reserved.
【結論】
Copyright Drecom Co., Ltd. All Rights Reserved.
用途を絞ればKVS最強
Copyright Drecom Co., Ltd. All Rights Reserved.
エピローグ
Copyright Drecom Co., Ltd. All Rights Reserved.
フラゲガチャが正式に事業化された
https://flyinggacha.com/
Copyright Drecom Co., Ltd. All Rights Reserved.
● 他部署が運用してるので僕はノータッチ
● ベースは全く一緒だけどフルボッコでまずかった部分を改良
してくれてる(感謝)
● 2~3ヶ月で切り捨てる想定で設計したシステムを引き継がせ
てしまって心が痛む('A`)
○ 後からちゃんと改修してくれた
● Twitterを使った事前登録したい場合には是非弊社にお声が
けを!
○ https://www.drecom.co.jp/contact/form/
Copyright Drecom Co., Ltd. All Rights Reserved.
あわせて読みたい
ドリコムを支えるインフラ
● drecomにおけるwinning the metrics battle
○ http://www.slideshare.
net/KenichiMitsuki/ss-35379098
● ドリコムのInfrastructure as code
○ http://www.slideshare.
net/y05_net/infrastructure-as-code-
35373108
会社概要
社名:
証券コード:
本社:
電話番号:
社員数:
設立年月日:
資本金:
事業内容:
株式会社ドリコム
3793 東証マザーズ
〒153-0064
東京都目黒区下目黒1丁目8-1 アルコタワー17F
TEL:03-6682-5700 FAX:03-6682-5711
239名 (正社員・契約社員のみ)
2001年11月13日
1,124百万円
(2014年3月末現在)
ソーシャルゲーム事業
ソーシャルラーニング事業
アドソリューション事業
Copyright Drecom Co., Ltd. All Rights Reserved.
Copyright Drecom Co., Ltd. All Rights Reserved.
ご静聴ありがとうございました!

More Related Content

What's hot

ソーシャルアプリを分析してみた
ソーシャルアプリを分析してみたソーシャルアプリを分析してみた
ソーシャルアプリを分析してみたDrecom Co., Ltd.
 
位置情報を常に取得するのはつらいよ
位置情報を常に取得するのはつらいよ位置情報を常に取得するのはつらいよ
位置情報を常に取得するのはつらいよDrecom Co., Ltd.
 
Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話Tokoroten Nakayama
 
Kotlinではじめる Webアプリケーション入門
Kotlinではじめる Webアプリケーション入門Kotlinではじめる Webアプリケーション入門
Kotlinではじめる Webアプリケーション入門虎の穴 開発室
 
Webアプリケーションは難しい
Webアプリケーションは難しいWebアプリケーションは難しい
Webアプリケーションは難しいTakafumi ONAKA
 
CEDEC 2015 Cocos2d-x と社内基盤の付き合い方 〜アップストリームファーストを目指して〜
CEDEC 2015 Cocos2d-x と社内基盤の付き合い方 〜アップストリームファーストを目指して〜CEDEC 2015 Cocos2d-x と社内基盤の付き合い方 〜アップストリームファーストを目指して〜
CEDEC 2015 Cocos2d-x と社内基盤の付き合い方 〜アップストリームファーストを目指して〜Drecom Co., Ltd.
 
【20211202_toranoana.deno#3】denoでFFI
【20211202_toranoana.deno#3】denoでFFI【20211202_toranoana.deno#3】denoでFFI
【20211202_toranoana.deno#3】denoでFFI虎の穴 開発室
 
【20220120 toranoana.deno#4】denoでffiの続き
【20220120 toranoana.deno#4】denoでffiの続き【20220120 toranoana.deno#4】denoでffiの続き
【20220120 toranoana.deno#4】denoでffiの続き虎の穴 開発室
 
Introduce Groovy 2.3 trait
Introduce Groovy 2.3 trait Introduce Groovy 2.3 trait
Introduce Groovy 2.3 trait Uehara Junji
 
Markup Template Engine introduced Groovy 2.3
Markup Template Engine introduced Groovy 2.3Markup Template Engine introduced Groovy 2.3
Markup Template Engine introduced Groovy 2.3Uehara Junji
 
Shadow Server on Fluentd at Fluentd Casual Talks #3
Shadow Server on Fluentd at Fluentd Casual Talks #3Shadow Server on Fluentd at Fluentd Casual Talks #3
Shadow Server on Fluentd at Fluentd Casual Talks #3Naotoshi Seo
 
RUNNING Smalltalk - 実践Smalltalk
RUNNING Smalltalk - 実践SmalltalkRUNNING Smalltalk - 実践Smalltalk
RUNNING Smalltalk - 実践SmalltalkSho Yoshida
 
レビューで保守性のためにした コメントをふりかえってみた
レビューで保守性のためにした コメントをふりかえってみたレビューで保守性のためにした コメントをふりかえってみた
レビューで保守性のためにした コメントをふりかえってみたTakhisa Hirokawa
 
mbedではじめる組み込みHaskellプログラミング
mbedではじめる組み込みHaskellプログラミングmbedではじめる組み込みHaskellプログラミング
mbedではじめる組み込みHaskellプログラミングKiwamu Okabe
 
東京Node学園 今できる通信高速化にトライしてみた
東京Node学園 今できる通信高速化にトライしてみた東京Node学園 今できる通信高速化にトライしてみた
東京Node学園 今できる通信高速化にトライしてみたYoshiki Shibukawa
 
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechconYosaku Toyama
 

What's hot (20)

技術書へのいざない
技術書へのいざない技術書へのいざない
技術書へのいざない
 
RSpec Performance Turning
RSpec Performance TurningRSpec Performance Turning
RSpec Performance Turning
 
ソーシャルアプリを分析してみた
ソーシャルアプリを分析してみたソーシャルアプリを分析してみた
ソーシャルアプリを分析してみた
 
GitHub APIとfreshで遊ぼう
GitHub APIとfreshで遊ぼうGitHub APIとfreshで遊ぼう
GitHub APIとfreshで遊ぼう
 
位置情報を常に取得するのはつらいよ
位置情報を常に取得するのはつらいよ位置情報を常に取得するのはつらいよ
位置情報を常に取得するのはつらいよ
 
Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話Rubyの会社でPythonistaが3ヶ月生き延びた話
Rubyの会社でPythonistaが3ヶ月生き延びた話
 
Kotlinではじめる Webアプリケーション入門
Kotlinではじめる Webアプリケーション入門Kotlinではじめる Webアプリケーション入門
Kotlinではじめる Webアプリケーション入門
 
Webアプリケーションは難しい
Webアプリケーションは難しいWebアプリケーションは難しい
Webアプリケーションは難しい
 
CEDEC 2015 Cocos2d-x と社内基盤の付き合い方 〜アップストリームファーストを目指して〜
CEDEC 2015 Cocos2d-x と社内基盤の付き合い方 〜アップストリームファーストを目指して〜CEDEC 2015 Cocos2d-x と社内基盤の付き合い方 〜アップストリームファーストを目指して〜
CEDEC 2015 Cocos2d-x と社内基盤の付き合い方 〜アップストリームファーストを目指して〜
 
【20211202_toranoana.deno#3】denoでFFI
【20211202_toranoana.deno#3】denoでFFI【20211202_toranoana.deno#3】denoでFFI
【20211202_toranoana.deno#3】denoでFFI
 
【20220120 toranoana.deno#4】denoでffiの続き
【20220120 toranoana.deno#4】denoでffiの続き【20220120 toranoana.deno#4】denoでffiの続き
【20220120 toranoana.deno#4】denoでffiの続き
 
Introduce Groovy 2.3 trait
Introduce Groovy 2.3 trait Introduce Groovy 2.3 trait
Introduce Groovy 2.3 trait
 
Markup Template Engine introduced Groovy 2.3
Markup Template Engine introduced Groovy 2.3Markup Template Engine introduced Groovy 2.3
Markup Template Engine introduced Groovy 2.3
 
Shadow Server on Fluentd at Fluentd Casual Talks #3
Shadow Server on Fluentd at Fluentd Casual Talks #3Shadow Server on Fluentd at Fluentd Casual Talks #3
Shadow Server on Fluentd at Fluentd Casual Talks #3
 
RUNNING Smalltalk - 実践Smalltalk
RUNNING Smalltalk - 実践SmalltalkRUNNING Smalltalk - 実践Smalltalk
RUNNING Smalltalk - 実践Smalltalk
 
レビューで保守性のためにした コメントをふりかえってみた
レビューで保守性のためにした コメントをふりかえってみたレビューで保守性のためにした コメントをふりかえってみた
レビューで保守性のためにした コメントをふりかえってみた
 
mbedではじめる組み込みHaskellプログラミング
mbedではじめる組み込みHaskellプログラミングmbedではじめる組み込みHaskellプログラミング
mbedではじめる組み込みHaskellプログラミング
 
東京Node学園 今できる通信高速化にトライしてみた
東京Node学園 今できる通信高速化にトライしてみた東京Node学園 今できる通信高速化にトライしてみた
東京Node学園 今できる通信高速化にトライしてみた
 
Git Boot Camp for Designer
Git Boot Camp for DesignerGit Boot Camp for Designer
Git Boot Camp for Designer
 
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon
爆速でAndroidアプリを ビルドするための仕組み DeNA TechCon #denatechcon
 

Similar to Resemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコム

こんな辛いテストはいやだ
こんな辛いテストはいやだ こんな辛いテストはいやだ
こんな辛いテストはいやだ Takuya Mikami
 
20131019 OSC@Tokyo CloudStackユーザー会
20131019 OSC@Tokyo CloudStackユーザー会20131019 OSC@Tokyo CloudStackユーザー会
20131019 OSC@Tokyo CloudStackユーザー会samemoon
 
RubyKaigi Lightning Talks TwYM episode2
RubyKaigi Lightning Talks TwYM episode2RubyKaigi Lightning Talks TwYM episode2
RubyKaigi Lightning Talks TwYM episode2Kuniaki Igarashi
 
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜	【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜 虎の穴 開発室
 
Tokyo ruby kaigi 10 (sogabe)
Tokyo ruby kaigi 10 (sogabe)Tokyo ruby kaigi 10 (sogabe)
Tokyo ruby kaigi 10 (sogabe)Takashi Sogabe
 
DLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミングDLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミングterurou
 
DeNAのゲーム開発を支える Game Backend as a Service
DeNAのゲーム開発を支える Game Backend as a ServiceDeNAのゲーム開発を支える Game Backend as a Service
DeNAのゲーム開発を支える Game Backend as a ServiceMakoto Haruyama
 
ニコニコを支える Erlang / Elixir
ニコニコを支える Erlang / Elixirニコニコを支える Erlang / Elixir
ニコニコを支える Erlang / Elixirkojingharang
 
プライベートクラウド作ってみました
プライベートクラウド作ってみましたプライベートクラウド作ってみました
プライベートクラウド作ってみましたKoji Hasebe
 
サーバーレスで ガチ本番運用までやってるお話し
サーバーレスで ガチ本番運用までやってるお話しサーバーレスで ガチ本番運用までやってるお話し
サーバーレスで ガチ本番運用までやってるお話しAkira Nagata
 
Building Static Website With Github And Jekyll
Building Static Website With Github And JekyllBuilding Static Website With Github And Jekyll
Building Static Website With Github And JekyllYoji Shidara
 
DPDKによる高速コンテナネットワーキング
DPDKによる高速コンテナネットワーキングDPDKによる高速コンテナネットワーキング
DPDKによる高速コンテナネットワーキングTomoya Hibi
 
Djangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込むDjangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込む2bo 2bo
 
ドリコムのInfrastructure as code
ドリコムのInfrastructure as codeドリコムのInfrastructure as code
ドリコムのInfrastructure as codeYosuke Hiraishi
 
OpenStackでつくる開発環境と外道塾
OpenStackでつくる開発環境と外道塾OpenStackでつくる開発環境と外道塾
OpenStackでつくる開発環境と外道塾外道 父
 
Opa - Cloud Language
Opa - Cloud LanguageOpa - Cloud Language
Opa - Cloud LanguageTozo Tanaka
 
OpenStack Networkingとネットワーク仮想化ソフトMidoNet最新動向
OpenStack Networkingとネットワーク仮想化ソフトMidoNet最新動向OpenStack Networkingとネットワーク仮想化ソフトMidoNet最新動向
OpenStack Networkingとネットワーク仮想化ソフトMidoNet最新動向Midokura
 

Similar to Resemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコム (20)

ドリコムJenkins勉強会資料
ドリコムJenkins勉強会資料ドリコムJenkins勉強会資料
ドリコムJenkins勉強会資料
 
こんな辛いテストはいやだ
こんな辛いテストはいやだ こんな辛いテストはいやだ
こんな辛いテストはいやだ
 
20131019 OSC@Tokyo CloudStackユーザー会
20131019 OSC@Tokyo CloudStackユーザー会20131019 OSC@Tokyo CloudStackユーザー会
20131019 OSC@Tokyo CloudStackユーザー会
 
RubyKaigi Lightning Talks TwYM episode2
RubyKaigi Lightning Talks TwYM episode2RubyKaigi Lightning Talks TwYM episode2
RubyKaigi Lightning Talks TwYM episode2
 
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜	【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
【とらのあなラボ Tech Day #3】新規システムにおける技術選定〜GoとgRPCを採用した話〜
 
Tokyo ruby kaigi 10 (sogabe)
Tokyo ruby kaigi 10 (sogabe)Tokyo ruby kaigi 10 (sogabe)
Tokyo ruby kaigi 10 (sogabe)
 
DLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミングDLR言語によるSilverlightプログラミング
DLR言語によるSilverlightプログラミング
 
DeNAのゲーム開発を支える Game Backend as a Service
DeNAのゲーム開発を支える Game Backend as a ServiceDeNAのゲーム開発を支える Game Backend as a Service
DeNAのゲーム開発を支える Game Backend as a Service
 
ニコニコを支える Erlang / Elixir
ニコニコを支える Erlang / Elixirニコニコを支える Erlang / Elixir
ニコニコを支える Erlang / Elixir
 
プライベートクラウド作ってみました
プライベートクラウド作ってみましたプライベートクラウド作ってみました
プライベートクラウド作ってみました
 
サーバーレスで ガチ本番運用までやってるお話し
サーバーレスで ガチ本番運用までやってるお話しサーバーレスで ガチ本番運用までやってるお話し
サーバーレスで ガチ本番運用までやってるお話し
 
Building Static Website With Github And Jekyll
Building Static Website With Github And JekyllBuilding Static Website With Github And Jekyll
Building Static Website With Github And Jekyll
 
DPDKによる高速コンテナネットワーキング
DPDKによる高速コンテナネットワーキングDPDKによる高速コンテナネットワーキング
DPDKによる高速コンテナネットワーキング
 
Djangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込むDjangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込む
 
ドリコムのInfrastructure as code
ドリコムのInfrastructure as codeドリコムのInfrastructure as code
ドリコムのInfrastructure as code
 
Runtime c++editing
Runtime c++editingRuntime c++editing
Runtime c++editing
 
OpenStackでつくる開発環境と外道塾
OpenStackでつくる開発環境と外道塾OpenStackでつくる開発環境と外道塾
OpenStackでつくる開発環境と外道塾
 
Opa - Cloud Language
Opa - Cloud LanguageOpa - Cloud Language
Opa - Cloud Language
 
OpenStack Networkingとネットワーク仮想化ソフトMidoNet最新動向
OpenStack Networkingとネットワーク仮想化ソフトMidoNet最新動向OpenStack Networkingとネットワーク仮想化ソフトMidoNet最新動向
OpenStack Networkingとネットワーク仮想化ソフトMidoNet最新動向
 
activerecord-turntable
activerecord-turntableactiverecord-turntable
activerecord-turntable
 

More from Go Sueyoshi (a.k.a sue445)

gemの複数バージョンカジュアルテスト #shibuyarb
gemの複数バージョンカジュアルテスト #shibuyarbgemの複数バージョンカジュアルテスト #shibuyarb
gemの複数バージョンカジュアルテスト #shibuyarbGo Sueyoshi (a.k.a sue445)
 
プリキュアのRuby実装の紹介 (2015 ver) #MeguroStartup
プリキュアのRuby実装の紹介 (2015 ver)  #MeguroStartupプリキュアのRuby実装の紹介 (2015 ver)  #MeguroStartup
プリキュアのRuby実装の紹介 (2015 ver) #MeguroStartupGo Sueyoshi (a.k.a sue445)
 
itamae + Serverspecで テスト駆動インフラやってみた #shibuyarb
itamae + Serverspecで テスト駆動インフラやってみた #shibuyarbitamae + Serverspecで テスト駆動インフラやってみた #shibuyarb
itamae + Serverspecで テスト駆動インフラやってみた #shibuyarbGo Sueyoshi (a.k.a sue445)
 
サザエ実況を支える技術 #sst_history
サザエ実況を支える技術 #sst_historyサザエ実況を支える技術 #sst_history
サザエ実況を支える技術 #sst_historyGo Sueyoshi (a.k.a sue445)
 
Paraductをエクストリームリリースします #428rk01
Paraductをエクストリームリリースします #428rk01Paraductをエクストリームリリースします #428rk01
Paraductをエクストリームリリースします #428rk01Go Sueyoshi (a.k.a sue445)
 
GemoireというYARDホスティングアプリを作った #shibuyarb
GemoireというYARDホスティングアプリを作った #shibuyarbGemoireというYARDホスティングアプリを作った #shibuyarb
GemoireというYARDホスティングアプリを作った #shibuyarbGo Sueyoshi (a.k.a sue445)
 
Githubエコシステムを活用したイマドキの趣味開発
Githubエコシステムを活用したイマドキの趣味開発Githubエコシステムを活用したイマドキの趣味開発
Githubエコシステムを活用したイマドキの趣味開発Go Sueyoshi (a.k.a sue445)
 
プリキュアハッカソン2 参加者アンケート集計結果 #cure_hack
プリキュアハッカソン2 参加者アンケート集計結果 #cure_hackプリキュアハッカソン2 参加者アンケート集計結果 #cure_hack
プリキュアハッカソン2 参加者アンケート集計結果 #cure_hackGo Sueyoshi (a.k.a sue445)
 

More from Go Sueyoshi (a.k.a sue445) (15)

gemの複数バージョンカジュアルテスト #shibuyarb
gemの複数バージョンカジュアルテスト #shibuyarbgemの複数バージョンカジュアルテスト #shibuyarb
gemの複数バージョンカジュアルテスト #shibuyarb
 
プリキュアのRuby実装の紹介 (2015 ver) #MeguroStartup
プリキュアのRuby実装の紹介 (2015 ver)  #MeguroStartupプリキュアのRuby実装の紹介 (2015 ver)  #MeguroStartup
プリキュアのRuby実装の紹介 (2015 ver) #MeguroStartup
 
itamae + Serverspecで テスト駆動インフラやってみた #shibuyarb
itamae + Serverspecで テスト駆動インフラやってみた #shibuyarbitamae + Serverspecで テスト駆動インフラやってみた #shibuyarb
itamae + Serverspecで テスト駆動インフラやってみた #shibuyarb
 
社内テストファースト勉強会
社内テストファースト勉強会社内テストファースト勉強会
社内テストファースト勉強会
 
サザエ実況を支える技術 #sst_history
サザエ実況を支える技術 #sst_historyサザエ実況を支える技術 #sst_history
サザエ実況を支える技術 #sst_history
 
Paraductをエクストリームリリースします #428rk01
Paraductをエクストリームリリースします #428rk01Paraductをエクストリームリリースします #428rk01
Paraductをエクストリームリリースします #428rk01
 
GemoireというYARDホスティングアプリを作った #shibuyarb
GemoireというYARDホスティングアプリを作った #shibuyarbGemoireというYARDホスティングアプリを作った #shibuyarb
GemoireというYARDホスティングアプリを作った #shibuyarb
 
Githubエコシステムを活用したイマドキの趣味開発
Githubエコシステムを活用したイマドキの趣味開発Githubエコシステムを活用したイマドキの趣味開発
Githubエコシステムを活用したイマドキの趣味開発
 
プリキュアハッカソン2 参加者アンケート集計結果 #cure_hack
プリキュアハッカソン2 参加者アンケート集計結果 #cure_hackプリキュアハッカソン2 参加者アンケート集計結果 #cure_hack
プリキュアハッカソン2 参加者アンケート集計結果 #cure_hack
 
JavaScript TDD紹介 #agilesamurai
JavaScript TDD紹介 #agilesamuraiJavaScript TDD紹介 #agilesamurai
JavaScript TDD紹介 #agilesamurai
 
勉強会を始めるまで #java_ja
勉強会を始めるまで #java_ja勉強会を始めるまで #java_ja
勉強会を始めるまで #java_ja
 
アニメ実況実践入門
アニメ実況実践入門アニメ実況実践入門
アニメ実況実践入門
 
Sue445 Style TDD #atest_hack
Sue445 Style TDD #atest_hackSue445 Style TDD #atest_hack
Sue445 Style TDD #atest_hack
 
AZusaar!でのappengine活用事例 #ajn19
AZusaar!でのappengine活用事例 #ajn19AZusaar!でのappengine活用事例 #ajn19
AZusaar!でのappengine活用事例 #ajn19
 
appengine活用事例資料@TDDBC札幌2.1
appengine活用事例資料@TDDBC札幌2.1appengine活用事例資料@TDDBC札幌2.1
appengine活用事例資料@TDDBC札幌2.1
 

Resemaraを支えた技術 フライングゲットガチャの舞台裏 #ksgstudy #ドリコム

  • 1. Copyright Drecom Co., Ltd. All Rights Reserved. 2014/07/12 @sue445 関西ソーシャルゲーム勉強会・2014夏
  • 2. Copyright Drecom Co., Ltd. All Rights Reserved. 自己紹介 sue445 ● ドリコム サービス基盤部 ○ 主に社内ツール、社内ライブラリ系 ○ ガルロワ、フルボッコ、ジョジョSS、トレクルなど、最近のネ イティブアプリの課金決済系ライブラリ作ってます ○ たまにインフラ ● Ruby歴2年のルビーチョットデキルエンジニア ● 当時ドリコム入社1年半にして今回初めてガチャを作った(重 要) ● 好きな言語はJava(重要) ● 自称:TDDマニアなキュアエンジニア
  • 3. Copyright Drecom Co., Ltd. All Rights Reserved. 趣味で作ってるもの ● rubicure ○ https://github.com/sue445/rubicure ○ プリキュアのRuby実装 ● Gitpeach ○ https://github.com/sue445/gitpeach ○ issueをカンバン風に管理 ○ Gitlab用のwaffle.ioクローン ● Chrome Gitlab Notifier ○ https://github.com/sue445/chrome-gitlab-notifier ○ Gitlabの通知をChromeで受け取る拡張 ● and more !
  • 4. Copyright Drecom Co., Ltd. All Rights Reserved. 【CM】ワタシハ テスト チョットデキルTシャツ エンジニアならチェックしておきたい技術系Tシャツまと め - くりにっき
  • 5. Copyright Drecom Co., Ltd. All Rights Reserved. 【CM】フルボッコヒーローズ http://official.fullbokko.drecom.jp/
  • 6. Copyright Drecom Co., Ltd. All Rights Reserved.
  • 7. Copyright Drecom Co., Ltd. All Rights Reserved. 今期の嫁: キュアハニー
  • 8. Copyright Drecom Co., Ltd. All Rights Reserved. 本妻: キュアピース
  • 12. Copyright Drecom Co., Ltd. All Rights Reserved. アジェンダ ● リセマラ is 何 ● 開発体制 ● 実績 ● アプリの構成 ● 工夫したこと ● Twitter APIの闇 ● よくある質問 ● エピローグ
  • 13. Copyright Drecom Co., Ltd. All Rights Reserved. リセマラ is 何 ● 「リセットマラソン」の略 ● パズドラとかでゲーム開始直後にもらえるカードがランダムな ので、強いユニットが貰えるまでインストールとアンインストー ルを繰り返すこと ● 中の人的にはインストールユーザと実際のユーザの剥離が 出るのでつらい。。。
  • 14. Copyright Drecom Co., Ltd. All Rights Reserved. ゲームリリース前に公式でリセマラできるようにしたw 当時のドメインも resemara.fullbokko.drecom.jp
  • 15. Copyright Drecom Co., Ltd. All Rights Reserved. Attention!! ● ここに掲載してる技術情報は2014年3月時点のものなので 若干古いです ○ 事前登録期間が2013年12月~2014年2月のため
  • 16. Copyright Drecom Co., Ltd. All Rights Reserved. 解決策 実演
  • 17. Copyright Drecom Co., Ltd. All Rights Reserved. Twitterで認証してつぶやけば何回でもガチャ回せる
  • 18. Copyright Drecom Co., Ltd. All Rights Reserved. 詳しいこと ● フライングゲットガチャ セミナー資料 ○ http://www.slideshare.net/drecom/drecom-20140225- seminar-31882381 ● 【ドリコムセミナーレポート】『フライングゲットガチャ』はなぜ成 功したのか? マーケティング担当者がその秘訣を語る。 | Social Game Info ○ http://gamebiz.jp/?p=127470
  • 19. Copyright Drecom Co., Ltd. All Rights Reserved. メンバー ● 開発 x 1 ○ sue445(サーバ周り全部) ○ ガチャ演出周りで助っ人(2週間くらい) ● デザイン x 1 ○ 絵とコーディング回り ● 企画 x 1 ● 開発計1ヶ月弱くらい ○ 途中で仕様変更が何回もあったので実開発は2週間くら い
  • 20. Copyright Drecom Co., Ltd. All Rights Reserved. 実績 ● Twitter/Facebook認証数 ○ 約10万人 ● 事前登録数:48万人 ○ 業界最多?(たぶん) ● ガチャ総回転数 ○ 996万回 ○ 瞬間最大風速0:00~0:10でガチャ13500回転くらい
  • 21. Copyright Drecom Co., Ltd. All Rights Reserved. 本番環境の構成 ● web x 2 ○ redisあいのり(redis 2.6.16) ○ それぞれにredis入れてVIPでアクセス(後述) ● db x 2 (fioではなく普通のHDD) ○ MySQL Percona server ● cache x 2 ○ 最初はwebにmemcache同居だったけどメモリ的に厳し かったので途中で追加してもらった ● いずれもCentOS 6 ● 負荷が読めないのでとりあえずミニマムスタートしてみたが 割となんとかなった
  • 22. Copyright Drecom Co., Ltd. All Rights Reserved. よくあるKVS構成 web-xx web-xx job-xx job-xx redis-01 (Master) redis-02 (Slave) VIP
  • 23. Copyright Drecom Co., Ltd. All Rights Reserved. フラゲガチャのKVS構成(サーバ節約) web-02 VIP web-01 redis(M) redis(S) 自分自身にVIPをつけるこ とで最低限の台数でHA構 成を構築
  • 24. Copyright Drecom Co., Ltd. All Rights Reserved. ステージング環境の構成 ● Debian Wheezy ● OpenStackの自分用Railsアプリ頻出ミドル全部入りスナップ ショットからインスタンス立てて環境構築 ○ nginx, mysql, redis, memcached, git, tmux, 自分の dotfilesなど ● 詳しくは弊社外道父のブログ参照 ○ OpenStackでつくる開発環境と外道塾 発表資料 | 外道 父の匠
  • 25. Copyright Drecom Co., Ltd. All Rights Reserved. アプリ周り ● Ruby 2.0.0-p353 + Rails 4.0.2 ○ リリース当時(2013/12/16)では最新 ○ 途中で2.1.0出たけど数ヶ月でお役御免だったのでス ルー ● capistrano 3 ○ v2 -> v3で全部変わってたのでtaskを全部書き直した ○ webサーバ2台なのにクラスタリスタート作ったw ○ 開発期間短いながらも自分のアプリで人柱になって、有 志の手により社内gem化された
  • 26. Copyright Drecom Co., Ltd. All Rights Reserved. 機能 作った ● 事前登録 ● リセマラガチャ ● シリアル生成 ● DM送信 作ってない ● レポート系(工数削減のため) ○ GoogleAnalytics ○ fluentd (事前登録とガチャ) ● メンテナンス画面 ○ 忘れてたw
  • 27. Copyright Drecom Co., Ltd. All Rights Reserved. 工夫したこと ● 事前登録 ● リセマラガチャ ● TwitterのDM大量送信
  • 28. Copyright Drecom Co., Ltd. All Rights Reserved. 事前登録
  • 29. Copyright Drecom Co., Ltd. All Rights Reserved. 事前登録 仕様 ● 認証不要 ● 「事前登録する」のPOSTの度に一意なシリアルコードを作る ● シリアルコードがiOSかAndroidかアプリ側で識別したい 問題点 ● 表示したシリアルを全部DBに突っ込んでたら死ぬ(容量的に も負荷的にも) ● 認証かかってないため、GoogleのクローラとかがPOSTする と事前登録数が水増しされてしまう
  • 30. Copyright Drecom Co., Ltd. All Rights Reserved. 表示したシリアルを全部DBに突っ込んでたら死ぬ問題 解:シリアルコードの暗号・復号化社内ライブラリ使った ● 別アプリで作ってたのを流用 ● 見た目は12文字の数字だけど、39ビット分の情報を持たせ、 報酬IDや連番も含ませたり整合性チェックもできるようにした ● 連番をredis counterで持たせた ○ iOSとAndroid各1つずつ ○ 本当なら発行したシリアルを全部DBにINSERTするとこ ろだが、redis counterを2つだけ使うだけで万事解決
  • 31. Copyright Drecom Co., Ltd. All Rights Reserved. クローラによる水増し問題 ● bodyにformタグを全て含めないことで、スクレイピングしただ けではボタンを押せないようにした ● Ajax使えばクローラはだいたいごまかせる(気がする) ● 後発の他社の事前登録ガチャはこの対策してないように見 えた
  • 32. Copyright Drecom Co., Ltd. All Rights Reserved. クローラによる水増し問題 HTML上はformタグ のactionが空 onclickでsubmit直前 に設定する
  • 33. Copyright Drecom Co., Ltd. All Rights Reserved. リセマラガチャ
  • 34. Copyright Drecom Co., Ltd. All Rights Reserved. リセマラガチャ 仕様が複雑
  • 35. Copyright Drecom Co., Ltd. All Rights Reserved. リセマラガチャ 問題点 ● 6時間ごとにworkerで全ユーザのガチャ回数リセットすると ユーザ増えた時に処理に時間がかかって死ぬ ● ガチャ回す度にヒストリレコードINSERT&ガチャ総回転数 UPDATEしたらDBが負荷で死ぬ ● Twitterの性質上バズると局所的にアクセスが来るため負荷 が読めない ● そもそもの仕様が複雑 (;´Д`)
  • 36. Copyright Drecom Co., Ltd. All Rights Reserved. 解決策 全部redisでよくね?
  • 37. Copyright Drecom Co., Ltd. All Rights Reserved. リセマラガチャ
  • 38. Copyright Drecom Co., Ltd. All Rights Reserved. 画面表示でSELECTすらしてないwww redis counter redis counter redis counter redis counter (with expire)
  • 39. Copyright Drecom Co., Ltd. All Rights Reserved. ガチャ回す時は3種類のカウンタを同時に増やす 全員の総回 転数++ 自分の回転数++ 1ターム内のガチャ回数++
  • 40. Copyright Drecom Co., Ltd. All Rights Reserved. MySQL使ってるのはたったこれだけ ● ユーザ認証 ○ 認証後にtwitterのaccess tokenをユーザマスタに入れる ● POSTする時にcurrent userでロック(SELECT ~ FOR UPDATE) ○ パワーアタック系のチート対策 ○ 1ユーザで複数同時に処理を走らせない ● ユニット確定時に報酬レコードをINSERTする
  • 41. Copyright Drecom Co., Ltd. All Rights Reserved. よくあるガチャのテーブル構成(適当) users user_car ds gacha_car ds 1 n n   1 cards gachas gacha_his tories 1 n n 1 n 1 1 n n 1
  • 42. Copyright Drecom Co., Ltd. All Rights Reserved. リセマラガチャのテーブル構成 users user_rewa rds rewards 1   n n   1 ● rewards = cards + gachas ○ 今回はガチャ1つしかやらないので分ける必要もなかった ○ rewardsをガチャの度に全件取得するコストが心配だった が、ガチャで使う最低限のカラムしかないため余裕だった ● ガチャ履歴もログに出してfluentdで送るようにしたのでガ チャのhistoryテーブルも不要
  • 43. Copyright Drecom Co., Ltd. All Rights Reserved. redis内訳 users (各ユーザに対してカウンタが設定) ● ガチャ合計回転数 ● 1ターム内のガチャ回転数 ○ 0, 6, 12, 18時にexpire ● 1ターム内のリセット回数 ○ 0, 6, 12, 18時にexpire ユーザに紐付かない系 ● シリアルコード内の連番(iOS, Androidそれぞれ) ○ 事前登録する度にインクリメント ○ 事前登録数はこれの合計 ● 全ユーザ合計のガチャ回転数 ● ★5(一番レアリティの高いユニット)の放出数
  • 44. Copyright Drecom Co., Ltd. All Rights Reserved. redisの値に有効期限をつける方法 EXPIRE key sec or EXPIREAT key unixtime ● リセマラでは後者を利用 ● redis-objectsのドキュメントには一切書いてなかったがソー ス見たら実装されてた ○ ただしunixtimeなので Time#to_i して渡す ● ガチャ回す時にINCRとEXPIREATを同時に使う ● 現在時間を元に次の6時, 12時 … を算出するのが一番大変 だったw ○ 時間のテストはdelorean最強 ○ https://github.com/bebanjo/delorean
  • 45. Copyright Drecom Co., Ltd. All Rights Reserved. expireつけた結果 ガチャリセットのかかる0時, 6時, 12時, 18時きっかりに山ができ てるw
  • 46. Copyright Drecom Co., Ltd. All Rights Reserved. cacti @db ピーク時でもCPU使用 率0.14% www
  • 47. Copyright Drecom Co., Ltd. All Rights Reserved. cacti @web LAもピーク時で1〜2くらい
  • 48. Copyright Drecom Co., Ltd. All Rights Reserved. Twitter APIの闇 1. 凍結済ユーザの判別が困難な問題 2. DM送信コストが結構高い件について 3. アプリのパーミッションが大雑把な問題
  • 49. Copyright Drecom Co., Ltd. All Rights Reserved. 1. 凍結済ユーザの判別が困難な問題 他ユーザから凍結済ユーザを見ようとすると403(エラー (Forbidden)になるが、凍結済ユーザ自身は普通に見れ る
  • 50. Copyright Drecom Co., Ltd. All Rights Reserved. @sue445_sst5 が凍結済ユーザ
  • 51. Copyright Drecom Co., Ltd. All Rights Reserved. 何が問題か? ● 凍結済でもTwitterで認証してログインできる ● ガチャ回せる ● つぶやく時に初めてエラーになる ○ 調べたら凍結済ユーザでもGET系は全部大丈夫 で、POST系が全部失敗。。。 ● 事前登録終了後にDMでシリアルコードを送れない ○ CSのコストup
  • 52. Copyright Drecom Co., Ltd. All Rights Reserved. 結局どうした? 諦めた(キリッ ● 公式アカウント(@fullbokkoheroes)経由でチェックす るにしてもRateLimitがあるので限界がある ● 15分間で180回までなので焼け石に水
  • 53. Copyright Drecom Co., Ltd. All Rights Reserved. 2. DM送信コストが結構高い件について ● ユニットを確定してたら事前登録終了後にDMでシリアルを送 る ● 年末にDMを送ったら1時間半で7000通しか送れなかった ○ 秒速1.3通 ○ Twitter API叩くコストが意外に高い ● 発行したシリアルは50000枚 ○ ガチャ35000枚, お年玉15000枚 ○ このままだと全部DM送るのに65000秒(=18時間)かかる ことにw ○ ヤバイ
  • 54. Copyright Drecom Co., Ltd. All Rights Reserved. 【解決方法】並列送信 ● redisは使ってたけどSidekiqやResque(Rubyの並列処理の ライブラリ)は入れていなかったので昔ながらのThreadを使っ た ○ 数回しか使わないスクリプトのためだけにセットアップす るのが抵抗あった ● 普通にやるとThreadが一度に全実行されるため同時実行す るスレッド数を制限する必要ある ○ サーバの負荷とAPI実行時の帯域がやばい
  • 55. Copyright Drecom Co., Ltd. All Rights Reserved. 【解決方法】並列送信 ● ruby-threadのThread pool使った ○ 20スレッドでDM45000通送るのに約40分 ○ 秒速18通 ● jobサーバがないのでDM送信の度に本番のwebを1台切り 離して即席jobサーバにしてた(つらい) ○ ピーク時避ければweb1台でも耐えられた ● rubyのプロセスだけでCPU 50〜60%くらい使った ● SidekiqやResqueでqueueの数制限するのが大正解
  • 56. Copyright Drecom Co., Ltd. All Rights Reserved. 3. アプリのパーミッションが大雑把な問題 Twitterアプリのパーミッションは大きく分けて3種類 ● Read only ○ GETは出来るがPOSTはダメ ○ 例)Twilog ● Read and write ○ GETとPOSTはOK ○ DMは送信出来るが受信は出来ない ○ 例)ボット ● Read, Write and Access direct messages ○ ↑ + DM送受信OK ○ 例)普通のTwitterクライアント
  • 57. Copyright Drecom Co., Ltd. All Rights Reserved. 適切なパーミッションって? アプリの仕様上つぶやきとDM送 信できればいいのでRead and writeが適切(重要)
  • 58. Copyright Drecom Co., Ltd. All Rights Reserved. アプリに適切なパーミッションが大事 ● 不要なパーミッションはつけない ○ 何も考えずに適当に「Read, Write and Access direct messages」にするのはセキュリティ的によろしくない ○ twitterでアプリ連携する=自分の家の合鍵を他人に預ける のと同じ ● パーミッションが広いと意識の高いユーザが不安に思 う ○ 懐中電灯アプリで電話帳やGPSにパーミッションがあるの と同じような感じ ● 下手すると事案に発展する可能性がある
  • 59. Copyright Drecom Co., Ltd. All Rights Reserved. ここで他社事例を見てみ ましょう
  • 60. Copyright Drecom Co., Ltd. All Rights Reserved. セーフw
  • 61. Copyright Drecom Co., Ltd. All Rights Reserved. アウトおおおおおおおおおおおお
  • 62. Copyright Drecom Co., Ltd. All Rights Reserved. アウトおおおおおおおおおおお
  • 63. Copyright Drecom Co., Ltd. All Rights Reserved. もし間違えて認証しちゃったら ● https://twitter.com/settings/applications で認証を取り消せ ばok
  • 64. Copyright Drecom Co., Ltd. All Rights Reserved. 【重要事項】 ● アプリのパーミッションは一応変更出来る ○ 変更するとユーザから取得したaccess tokenは全部無効 になる ○ 認証を事前に取得しておいて後から使うような使い方だ と、途中でパーミッションを変えると死ぬ ● それ以外の情報(アプリ名やアイコンなど)は途中で変えても 問題なし
  • 65. Copyright Drecom Co., Ltd. All Rights Reserved. よくある質問 ● Q. 失敗談 ○ A. 1回だけ間違えて本番落としたw ○ その時点ではまだデプロイしてはいけないものを間違え て本番に上げた ○ cap deploy:rollback は神 ○ 【教訓】何かあってから命綱を作るのは手遅れ。命綱は常 に整備しておくべき ● Q. 最初からRedisメインにしようと思った? ○ 「一定時間で回数リセット」って仕様聞いた時にKVS使っ た方がいいような予感はしてた ○ 既存アプリだとDBがボトルネックで詰まるのをよく見てた ので、極力DBを使わない構成にしたかった
  • 66. Copyright Drecom Co., Ltd. All Rights Reserved. 【結論】
  • 67. Copyright Drecom Co., Ltd. All Rights Reserved. 用途を絞ればKVS最強
  • 68. Copyright Drecom Co., Ltd. All Rights Reserved. エピローグ
  • 69. Copyright Drecom Co., Ltd. All Rights Reserved. フラゲガチャが正式に事業化された https://flyinggacha.com/
  • 70. Copyright Drecom Co., Ltd. All Rights Reserved. ● 他部署が運用してるので僕はノータッチ ● ベースは全く一緒だけどフルボッコでまずかった部分を改良 してくれてる(感謝) ● 2~3ヶ月で切り捨てる想定で設計したシステムを引き継がせ てしまって心が痛む('A`) ○ 後からちゃんと改修してくれた ● Twitterを使った事前登録したい場合には是非弊社にお声が けを! ○ https://www.drecom.co.jp/contact/form/
  • 71. Copyright Drecom Co., Ltd. All Rights Reserved. あわせて読みたい ドリコムを支えるインフラ ● drecomにおけるwinning the metrics battle ○ http://www.slideshare. net/KenichiMitsuki/ss-35379098 ● ドリコムのInfrastructure as code ○ http://www.slideshare. net/y05_net/infrastructure-as-code- 35373108
  • 73. Copyright Drecom Co., Ltd. All Rights Reserved. ご静聴ありがとうございました!