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

10周年を迎えるモンストサーバコードの Ruby及びgemのアップデートにまつわるお話【MIX...

10周年を迎えるモンストサーバコードの Ruby及びgemのアップデートにまつわるお話【MIXI TECH CONFERENCE 2023】

MIXI TECH CONFERENCE 2023
にてお話した岡住の資料です。

動画:https://youtu.be/LN28kB3eXXo
セッション詳細:https://techcon.mixi.co.jp/2023/d3-1

MIXI ENGINEERS

March 03, 2023
Tweet

Video

More Decks by MIXI ENGINEERS

Other Decks in Technology

Transcript

  1. ©MIXI はじめに 前半 - モンスターストライク (モンスト) について - サーバチームとサーバコード -

    APIサーバの構成とデプロイ体制 後半 - Ruby, gem のアップデートにまつわる話 - 様々な問題と工夫 - まとめ 4
  2. ©MIXI サーバチームとサーバコード 開発体制 - 開発・運用の両方を行う - 開発を支援する管理ツールなどの開発も行う - 10~15名程度 -

    オンコール対応 (2名、1週間ローテーション) - サーバコード本体 + 管理ツール etc… のモノレポ (GitHub) - 運用に関するツール類などは、別のモノレポで管理 7
  3. ©MIXI サーバチームとサーバコード 次期バージョンへ向けた機能開発 ※ PR (GitHub Pull Request) 9 リリース頻度

    - 1〜1.5ヶ月 - 次期バージョンに関係しないものは逐 次リリース リリースタイミング バージョンアップメンテナンス 1バージョンあたりの機能開発 PR数 50~100程度 ひと月にマージされる PR量 100~200程度
  4. ©MIXI サーバチームとサーバコード コードカバレッジ - リポジトリ全体 約90% - 本体 95%以上 (94%のファイルがカバレッジ90%以上)

    - 計測しているが常に見ているわけではない - 普段から高めていこう!といった活動はしていない 10
  5. ©MIXI APIサーバの構成とデプロイ体制 APIサーバの構成 - Unicorn + Padrino + ActiveRecord -

    OSSをforkしたDB 垂直、水平分散ライブラリ - 数百台のオンプレマシン - App, DB, Memcached, Redis, Resque Worker, … - 様々なキャッシュ - Appサーバ(ローカルファイル、オンメモリ) - Memcached ※ 詳しくは https://mixil.mixi.co.jp/culture/16027#monsterstrike 13
  6. ©MIXI APIサーバの構成とデプロイ体制 APIサーバの構成 14 App 数百台 Unicorn Worker 数万 DB

    数百台 数万connection Memcached 100台弱 キャッシュ量 1TB 以上 ※ msgpackでシリアライズ済 App DB Redis (Queue) Memcached (Cache) Resque worker
  7. ©MIXI Ruby, gem アップデートにまつわる話 基本方針 ※ 緊急で対応が必要なものは担当者を決めることもある (先に誰かが動いてることの方が多い ) 18

    担当者 明確には決まっていない (率先してやりたい人が担当 ) リリース前 (必ず) 開発環境で動作確認 (日々、多くの人が利用している ) リリース前 (必ずではない) Appサーバ1台〜数台 (全体の数%) にデプロイして動作確認 - 意図しないエラーが出ないか - リソースの変化を監視 etc… リリースタイミング - 日々のデプロイ - モンストのバージョンアップメンテナンス時
  8. ©MIXI 大きなgemのアップデート 大小様々な問題が起こる - 互換性のない記法 - 大量のエラーが発生する - 大量の警告 (warning)

    が発生する - 依存ライブラリが対応していない - そもそも、テストが実行できない etc… 大量のコード修正が必要になることも (100PR以上の修正・・・) 22
  9. ©MIXI 大量のコード修正 CIでテストを通過しないとPRはマージ出来ない - 実行するテストの範囲を指定する a. 実行範囲を絞る (例: Modelのみ) b.

    落ちるテストの一覧を定義して、除外する c. 修正したら、除外リストから消してテストが実行されるようにする d. 修正PRを出す e. 修正が完了したら、実行範囲を広げていく 25 チームメンバーが修正PRを作りやすい状況を作る
  10. ©MIXI まとめ - テストの有無でアップデート難易度が大きく変わる - アップデートによって絶対に変わってはいけない挙動を把握しておく - アップデート前後の互換性を意識する - キャッシュキーが変更されていないか

    - etc… - 継続的にアップデートしていくための仕組みをつくる - チームメンバーが手伝いやすい状況をつくる - 消せるコードを消す - 起こった出来事を記録しておく - 次回のアップデートで参考になる 33