戦国アスカZERO 3周年記念なでなでカウンタ実装の裏話

お久しぶりになってしまいました、Vueはいいぞサーバーエンジニアのリンです。

ところで戦国アスカZERO 3周年イベントという特設サイトがあるのですが、
イベント期間中ご覧になった方はどれぐらいいらっしゃるでしょうか。
戦国アスカZERO 3周年イベントl株式会社ORATTTA


特設サイトでは、イベント期間中のなでなで(アプリ内でキャラクターをなでなでするとインセンティブがもらえる機能です)回数をリアルタイムにカウントし、
総なでなで回数に応じてプレゼントが当たる!といったキャンペーンを実施していました。

この特設サイトの一番の売りである、リアルタイムなでなでカウンターですが、ゲーム内のキャラクターになでなでされた回数をリアルタイムで常に表示し続けていました。(現在は統計終了)

FirebaseのRealtime Databaseを使っているので、カウントアップがリアルタイムで反映されていきます。
Firebase Realtime Database | Firebase Realtime Database | Firebase

実際に動かすにあたって、ゲーム内の全ユーザーの操作状況の数字がリアルタイムに増加していくのを眺めるのはなかなか感慨深いものがありましたね!しまった、gif動画撮っとけばよかった。

やっていることは単純で、

  • ゲーム内でなでなでしたことをサーバーで受け取って処理をしているので、そこに割り込んでなでなで回数をDBに記録する
  • cronでFirebase Functions経由でRealtime Databaseに送る(1秒毎→事情により3秒毎)
  • Realtime Databaseの値が変化したらホームページ上のカウンタも回る

    という割とシンプルな構成で作成しました。

一番最初は、10分に一回くらいの頻度でゲームサーバーのDBからホームページサーバーのDBにデータを流し込んで、最後にページを読み込んだ時点の数字にしようとかっていう企画だったのですが、
「んー、Firebaseとかつかったらカウンタをリアルタイムで動かすとかもできそうですねぇ…」
と漏らしたところ
「どうせならリアルタイムのほうがカッコイイじゃん!」
の一言でリアルタイム表示案が通ってしまいました。

同時に
「その辺全部リンちゃんに任せた」
されてしまったのでなんやかんやありましたけど。
ぐりってやってえいってやったらできちゃった。(語彙力

初期実装はユーザーがゲーム内でなでなでするたびにfunctionsを叩いて
Realtime Databaseに都度保存しようと思ったのですが、
リクエスト数が多すぎて破産しかねないということで今の形に変更。

さらに、1秒毎の実行をRundeckで行っていたら
実行ログが溜まりすぎてストレージ溢れそうということで慌ててcronに引っ越しました。

ちなみに気になる1ヶ月間のFirebaseへの課金額ですが、どうも0円で収まってしまったらしいです。
従量課金プランでいくらになるか見積もりとったりしてもらったけどごめんよわたなべさん

 

ちなみに、カウンタの数値についてなのですが、
イベント期間開始前からカウント自体は開始していて、11月1日のだいたい0時にカウンタをリセットしたので、
一日あたりどれぐらいカウンタが回るのかは予想がついていました。

計算したら1ヶ月でちょうど1億くらいかなー、もしかしたら桁が足りなくなるんじゃないかなーと思って
カウンタの桁を8桁から9桁に増やしてもらったんですが、ドンピシャリでしたね。


ということでこのカウンタの数字はリアル数字です!!!