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

[スタディサプリ] Railsアプリケーションのモジュールとして存在していた Darklaunch (Feature Toggles) を Goアプリケーションとしてフルスクラッチでマイクロサービス化した話

[スタディサプリ] Railsアプリケーションのモジュールとして存在していた Darklaunch (Feature Toggles) を Goアプリケーションとしてフルスクラッチでマイクロサービス化した話

●Darklaunch(FeatureToggles)コンポーネントの社内公開 API 化
●Web API として作った2つの理由:
  ・web frontend から直接利用可能
  ・共有 db のデータを消し、データは Darklaunch サービス内で完結 (独立してaurora serverless postgres)
●6 週間で初期 API を公開した開発プロセス
●アプリケーションの性能要件
  ・はじめにやったことと、やっていないこと
●Go の開発
●なぜ Go を選んだか
●Rails 使いが Go の開発する上で開発速度向上に貢献したもの

Kazushige Tominaga

June 23, 2023
Tweet

More Decks by Kazushige Tominaga

Other Decks in Programming

Transcript

  1. #awsdevday [スタディサプリ]Railsアプリケーションのモジュールとして存在していた Darklaunch(FeatureToggles)をGoアプリケーションとしてフルスクラッチでマイクロサービス化した話 #studysapuri Agenda | 01 02 03 04

    05 Darklaunchとスタディサプリの歴史 WebAPIとして作り直した2つの理由 Go言語でのアプリケーション開発 6週間で初期APIを公開した開発プロセス アプリケーションの性能要件
  2. #awsdevday [スタディサプリ]Railsアプリケーションのモジュールとして存在していた Darklaunch(FeatureToggles)をGoアプリケーションとしてフルスクラッチでマイクロサービス化した話 #studysapuri Feature toggles • 環境変数やDBの値などに基づき、ソースコード内の単なる条件分岐で、 新機能のリリースを制御する設計パターン •

    スタディサプリでは、 Rubyで "Darklaunch" というモジュールで表現 ◦ 環境変数ではなくDBの値に基づく ◦ 全ユーザに一括公開や、社内などの特定ユーザに限定公開や、団体などの粒度 ◦ 権限としては活用しない。あくまで新機能のリリースの単位 ◦ バグ修正やパフォーマンス改善など内部的な修正でとくに愛用
  3. #awsdevday [スタディサプリ]Railsアプリケーションのモジュールとして存在していた Darklaunch(FeatureToggles)をGoアプリケーションとしてフルスクラッチでマイクロサービス化した話 #studysapuri Darklaunch v1 • スタディサプリのRuby on Railsの分断されたモノリス

    (後述)の1モジュール • リリースする機能の単位に名前をつけたものを keyとよぶ ◦ "enable-foo-bar" みたいな文字列で表現 • データは共用MongoDBのうちの1 collection • Web backendのRailsアプリから 直接使うことを想定 • 共有の管理画面に、 Darklaunchのkeyと その公開範囲の設定画面を提供
  4. #awsdevday [スタディサプリ]Railsアプリケーションのモジュールとして存在していた Darklaunch(FeatureToggles)をGoアプリケーションとしてフルスクラッチでマイクロサービス化した話 #studysapuri 背景: Darklaunch v1でスコープアウトしていたこと • Web frontendからの利用

    • モノリス以外のweb backendからの利用 (Ruby, Go, Elixir) • 複雑な条件 (本トークの範囲外) 最初からすべてのケースを想定して汎用的に設計するのではなく、意図的に小さく始めた 5年ほど運用して、社内でのユースケースがどんどん明確になっていった
  5. #awsdevday [スタディサプリ]Railsアプリケーションのモジュールとして存在していた Darklaunch(FeatureToggles)をGoアプリケーションとしてフルスクラッチでマイクロサービス化した話 #studysapuri WebAPIとして作り直した2つの理由 • web frontendから直接利用可能 ◦ 認証についてはいろんなユースケースを考慮した結果認証なしとした

    ◦ このサービスは個人情報を一切所持しない • 共有dbのデータを消し、データは Darklaunchサービス内で完結 ◦ 全社的な課題として、肥大化しつづける MongoDBからの独立性の高いデータの分離が あった ◦ ここは独立してAmazon Aurora Serverless
  6. #awsdevday [スタディサプリ]Railsアプリケーションのモジュールとして存在していた Darklaunch(FeatureToggles)をGoアプリケーションとしてフルスクラッチでマイクロサービス化した話 #studysapuri Rails使いがGoの開発をする上で開発速度向上に貢献したもの ➔ Composite Design Patternでの実装経験 ◆

    データモデルとロジックを別々に管理することを意識できる ➔ Table Driven Testingのお勉強 ◆ rspecに慣れきった脳にテストの書き方の指針を教えてくれる ➔ Sqlboilerなどのコードジェネレーター各種 ◆ ドメインロジックに集中できるのはやはり重要
  7. #awsdevday [スタディサプリ]Railsアプリケーションのモジュールとして存在していた Darklaunch(FeatureToggles)をGoアプリケーションとしてフルスクラッチでマイクロサービス化した話 #studysapuri スタディサプリインフラ基盤の簡単なご紹介 ➔ Amazon EKS + argoCD

    + GitHub Actions によるデプロイ ◆ サービス用のyamlファイル一式を用意するだけで環境構築可能 ➔ Terraform によるリソース管理・デプロイ ◆ 主要リソースはほぼ全てIaC化が済んでいる
  8. #awsdevday [スタディサプリ]Railsアプリケーションのモジュールとして存在していた Darklaunch(FeatureToggles)をGoアプリケーションとしてフルスクラッチでマイクロサービス化した話 #studysapuri スタディサプリインフラ基盤の簡単なご紹介 ➔ Amazon EKS + argoCD

    + GitHub Actions によるデプロイ ◆ サービス用のyamlファイル一式を用意するだけで環境構築可能 ➔ Terraform によるリソース管理・デプロイ ◆ 主要リソースはほぼ全てIaC化が済んでいる めっちゃ便利 (SREチームありがとう)
  9. #awsdevday [スタディサプリ]Railsアプリケーションのモジュールとして存在していた Darklaunch(FeatureToggles)をGoアプリケーションとしてフルスクラッチでマイクロサービス化した話 #studysapuri 開発速度を出すには ➔ What, Why, Howの合意を取ってスタートする ◆

    検証・フィードバックのサイクルを予め回しておく • 開発者が自信を持って開発できる • 開発を始めるときには、もっともコアな部分のデザインはできている プロトタイプ開発
  10. #awsdevday [スタディサプリ]Railsアプリケーションのモジュールとして存在していた Darklaunch(FeatureToggles)をGoアプリケーションとしてフルスクラッチでマイクロサービス化した話 #studysapuri プロトタイプ開発を通して得た知見例 ➔ Darklaunchのデータ構造は意外と複雑で、RDBを使ったほうがよい ➔ 想定していなかった便利ケースが見つかった ◆

    「特定日時になったら以後常に有効」機能が欲しい ◆ 一方「特定日時になったら特定の値に変更」だと過剰 ➔ 必要な属性情報を裏付けとともに確定できた ◆ オーナー情報はkeyの属性として絶対必要 準備を万端にすることが大切
  11. #awsdevday [スタディサプリ]Railsアプリケーションのモジュールとして存在していた Darklaunch(FeatureToggles)をGoアプリケーションとしてフルスクラッチでマイクロサービス化した話 #studysapuri アプリケーションの性能要件の決め方 ➔ darklaunch-v1モジュールの計測結果を元に試算 ◆ 289 req/sec

    (Rubyアプリケーションからのアクセスのみ) ➔ 今後Webフロントエンドからも使われることを考えると、多めに見積もっておく に越したことはない ◆ 10,000 req/sec(約30倍) をベースラインとする
  12. #awsdevday [スタディサプリ]Railsアプリケーションのモジュールとして存在していた Darklaunch(FeatureToggles)をGoアプリケーションとしてフルスクラッチでマイクロサービス化した話 #studysapuri Amazon Aurora Serverless v2 ➔ コスト削減のため部内で導入の機運があった

    ➔ darklaunch-v2 で扱うRDSとして、実験的に採用して負荷試験を行った ➔ 急激なreadの負荷の上昇に耐えられるのか? ◆ 結果としてはv2なら全然余裕 ◆ (但し0% -> 100% ではなく、 10% -> 100% みたいな変化であれば)
  13. #awsdevday [スタディサプリ]Railsアプリケーションのモジュールとして存在していた Darklaunch(FeatureToggles)をGoアプリケーションとしてフルスクラッチでマイクロサービス化した話 #studysapuri まとめ ➔ Darklaunch(FeatureToggles)コンポーネントの社内公開API化 ◆ 数年の運用で見えた課題の解決 ➔

    Web APIとして作った2つの理由: ◆ web frontendから直接利用可能 ◆ 共有dbのデータを消し、データは Darklaunchサービス内で完結 (独立してAmazon Aurora Serverless) ➔ Goの開発 ◆ なぜGoを選んだか ◆ Rails使いがGoの開発する上で開発速度向上に貢献したもの ➔ 6週間で初期APIを公開した開発プロセス ◆ プロトタイプ開発 ➔ アプリケーションの性能要件 ◆ 性能要件の決め方 ◆ 負荷試験