Slide 1

Slide 1 text

ゲームタイトル開発側と サーバー基盤の連携事例の紹介 薮智仁

Slide 2

Slide 2 text

2 経歴 1. 2019年:新卒入社 2. 運用ゲームタイトル2年 3. 新規ゲームタイトルローンチ + 運用移行 4. 新規ゲームタイトル開発2年 ← Now ! 氏名 : 職種 : 所属 : 薮 智仁 サーバーサイドエンジニア 技術基盤本部 第3バックエンドエンジニア部 マネージャー補佐 自己紹介

Slide 3

Slide 3 text

3 お話しすること ゲームタイトル開発側とサーバー基盤の 過去の相談や連携事例を3つご紹介

Slide 4

Slide 4 text

4 〜 ① Slack 相談編 〜

Slide 5

Slide 5 text

5 ① Slack 相談編 〜とあるゲームタイトルのエンジニア Slack チャンネルにて〜

Slide 6

Slide 6 text

6 ① Slack 相談編 〜とあるゲームタイトルのエンジニア Slack チャンネルにて〜

Slide 7

Slide 7 text

7 ① Slack 相談編 〜とあるゲームタイトルのエンジニア Slack チャンネルにて〜

Slide 8

Slide 8 text

8 Slack ならではの 気軽な流れでサーバー基盤チームに相談できる! ① Slack 相談編

Slide 9

Slide 9 text

9 〜 ②コントリビュート編 〜

Slide 10

Slide 10 text

10 ②コントリビュート編 〜GitLab の issue にて提案してコントリビュート〜

Slide 11

Slide 11 text

11 ②コントリビュート編 〜GitLab の issue にて提案してコントリビュート〜

Slide 12

Slide 12 text

12 ②コントリビュート編 問題:Model::push() の標準実装がループで Model::save() を呼んでおりN+1クエリになっていた $user->push(); // INSERT INTO UserItem (userId, itemId, amount) VALUES ('user1', 1, 2); // INSERT INTO UserItem (userId, itemId, amount) VALUES ('user1', 2, 5); // UPDATE UserItem SET amount = 10 WHERE userId = 'user1' AND itemId = 3; // UPDATE UserItem SET amount = 10 WHERE userId = 'user1' AND itemId = 4;

Slide 13

Slide 13 text

13 ②コントリビュート編 問題:Model::push() の標準実装がループで Model::save() を呼んでおりN+1クエリになっていた $user->push(); // INSERT INTO UserItem (userId, itemId, amount) VALUES ('user1', 1, 2); // INSERT INTO UserItem (userId, itemId, amount) VALUES ('user1', 2, 5); // UPDATE UserItem SET amount = 10 WHERE userId = 'user1' AND itemId = 3; // UPDATE UserItem SET amount = 10 WHERE userId = 'user1' AND itemId = 4; 対応:複数モデルを一括で保存するよう Model::push() の中身をオーバーライド $user->push(); // INSERT INTO UserItem (userId, itemId, amount) VALUES ('user1', 1, 2), ('user1', 2, 5); // UPDATE UserItem SET amount = 10 WHERE userId = 'user1' AND itemId IN (3, 4);

Slide 14

Slide 14 text

14 ②コントリビュート編 問題:Model::push() の標準実装がループで Model::save() を呼んでおりN+1クエリになっていた $user->push(); // INSERT INTO UserItem (userId, itemId, amount) VALUES ('user1', 1, 2); // INSERT INTO UserItem (userId, itemId, amount) VALUES ('user1', 2, 5); // UPDATE UserItem SET amount = 10 WHERE userId = 'user1' AND itemId = 3; // UPDATE UserItem SET amount = 10 WHERE userId = 'user1' AND itemId = 4; 対応:複数モデルを一括で保存するよう Model::push() の中身をオーバーライド $user->push(); // INSERT INTO UserItem (userId, itemId, amount) VALUES ('user1', 1, 2), ('user1', 2, 5); // UPDATE UserItem SET amount = 10 WHERE userId = 'user1' AND itemId IN (3, 4); ゲームタイトルのコードはそのままでDB負荷を軽減! 🥳

Slide 15

Slide 15 text

15 OSSへのコントリビュートより ハードルが低いので練習として最適! ②コントリビュート編

Slide 16

Slide 16 text

16 〜 ③他タイトルとの議論編 〜

Slide 17

Slide 17 text

17 ③他タイトルとの議論編

Slide 18

Slide 18 text

18 ③他タイトルとの議論編 他ゲームタイトルのエンジニアからも意見が!

Slide 19

Slide 19 text

19 ③他タイトルとの議論編 意見も反映した上でマージリクエストを作ってみる テストコードの実装 + メンテがかなり楽に! 🥳

Slide 20

Slide 20 text

20 まとめ ゲームタイトル開発側とサーバー基盤で 連携することにより ゲームの開発効率を向上していっています!