Upgrade to Pro — share decks privately, control downloads, hide ads and more …

内製課金基盤QuaPayの機能とその変遷【CAGC2024】

CyberAgent
March 08, 2024
160

 内製課金基盤QuaPayの機能とその変遷【CAGC2024】

『IDOLY PRIDE』などで利用されているQualiArts内製課金基盤のQuaPayについてご紹介します。
過去のCEDECや弊社テックブログでも紹介したことがあるQuaPayですが、実装されてから数年が経過して開発体制や組織体制が変わってきたこともあり、メンテナンスやその実装について課題が見つかってきました。
今回はQuaPay自体の紹介に加え、社内共通基盤の継続的なメンテナンス方法と運用中に見つかった課題の解決方法について解説します。

https://cagc.cyberagent.co.jp/2024/session/index.html?id=p3QNq9LD

Copyright © CyberAgent, Inc.

CyberAgent

March 08, 2024
Tweet

More Decks by CyberAgent

Transcript

  1. QuaPayの機能 7 ゲーム専用の課金基盤として必要な機能を実装 • ゲーム内で利用するユーザーの有償・無償通貨を管理 ◦ 付与:無償通貨の配布、アプリ内課金を通じた有償通貨の購入 ◦ 補填:無償・有償通貨の付与で問題があった際の補填 ◦

    消費:保有している通貨の使用 ◦ 失効:アカウントBANなど ◦ 返金:アプリ内課金を払い戻した際の有償通貨の回収 • ゲーム運営で利用する機能 ◦ ユーザーの注文や残高履歴の取得 ◦ サマリの出力
  2. 購入毎の管理の分離 17 • 購入毎に各情報を分離して保存している ◦ 有償通貨か無償通貨か ◦ 通貨を何個購入したか ◦ 何円で購入したか

    • 残っているゲーム内通貨のうち、一番古いものから使用する ◦ 返金APIでは特定の購入だけを失効させることも可能 • 厳密な売上処理を経理で行う際は必要 • 海外からの購入をどう扱うのか、といった部分の課題はある
  3. 完全なログと過去の状態遡及 20 スマホ向けゲームにおけるゲーム内通貨は法律・経理の関係上、 正確に記録・管理する必要がある • 通常はログをデータベース以外に置くことが主流だが、このパターンの場合は 欠損の可能性を完全になくすことは極めて困難 ◦ 万が一ログに欠損が生じると、残高の不整合となり対応が難しい QuaPayでは、更新系APIのログは同一トランザクションでデータベースに保存し、

    ログの欠損を防ぐような実装になっている • ストレージ費用はかかるが、課金の重要性を考えると必要経費だと判断 • ログを完全に残すことで、任意時点の過去の状態を訴求できるように ◦ ユーザーの口座履歴が完全なのでトラブル対応で威力を発揮 • ゲーム全体の口座残高を計算する際も、過去の任意時点において 再集計できるなど副次的なメリットは大きい
  4. 見えてきたQuaPayの課題 24 『IDOLY PRIDE』のリリースから2年以上が経過し、開発・組織体制に変更があった • 前任者の異動により専任エンジニアが離脱 → 鈴木が引き継いだが、他業務との兼任の状態 • QuaPayのメンテナー不足

    → 課金基盤開発に対する知見が薄れ始めていた マイクロサービスにも課題があった • 冪等性はあるが、プロジェクト側とトランザクションやコードが違うという課題 ◦ Spannerのリトライが走るとQuaPay関連の処理が複雑になる ◦ エラー時の原因特定が少し面倒…… ◦ プロジェクト側と少し書き方が違うので認知負荷がある • 管理するものを可能な限り減らしたい
  5. QuaPayのメンテナンス 26 各種バージョンアップや依存関係の更新は気がついた人がやる • Go、Linterなど • プロジェクト側のアップデート時についでにやったり なにか感じたらリファクタリング • その時々に社内(主に新規プロジェクト)で流行っている実装手法がある

    ◦ 基本的に過去を鑑みた実装なため良いコードなことが多い • 古い実装はメンテナンス時に実装工数や心理的負荷という形で 影響してくるため、何か感じたらその部分をリファクタリングする ◦ E2Eテストが実装担保にかなり役立っている!
  6. ミューテーションでの更新からDMLでの更新に 31 今までミューテーションで行っていた更新を、 DML(INSERT, UPDATE, DELETE文)による更新に変更 • 同一トランザクション内で複数回QuaPayの操作を行った時、 ミューテーションだとSpannerへ反映されず、2回目以降の操作時に 古いデータを参照してしまうため

    • プロジェクト側ではトランザクションごとにクエリキャッシュを 実装しているが、共通ライブラリで専任もいない中、実装が難解な クエリキャッシュをメンテナンスしていくのは困難と判断し、 パフォーマンス劣化を許容してDMLに変更
  7. まとめ 35 • QuaPayは『IDOLY PRIDE』開発時に実装された内製課金システム ◦ ゲーム専用に開発され、マイクロサービス型を採用していた • 2年以上を経て出てきた課題とその解決 ◦

    知見・メンテナー不足 ▪ 各プロジェクトのメンバーによって機能が必要な度に実装してもらう ◦ 積極的なリファクタリング ▪ コードが古くなっていくことを避けることで 誰でも触りやすい環境を維持する ◦ ライブラリ化 ▪ プロジェクトと別トランザクションになるという課題を解決 継続的なメンテナンスが大切!