## サービス概要
医師向けのプラットフォームサイトのうち、製薬企業が医師向けに開催する、薬剤に関する講演会を支援するサービスです。講演会開催に関する情報配信・申込管理・運営支援などを提供しており、主に製薬企業からの開催費用を収益源としています。
## チーム体制
組織構造の再編が何度かあり、時期によってサーバーサイドエンジニア3〜7名程のチーム体制で開発をしていました。
## サービスの特徴と技術的な難しさ
長年運用されており、仕様やデータ構造が複雑化している部分が多く、改修時の影響調査に工数を要する傾向がありました。
また、講演会が一斉に始まる時間帯にはアクセスが集中し、ピーク時の負荷対策が重要な課題となっていました。
## 役割・担当業務
サーバーサイドエンジニアとして、以下の業務を担当しました
- 既存機能の改修・保守
- 不具合調査およびインシデント対応
- アクセス集中時のパフォーマンス改善施策の設計・実施
- Datadogなどを活用した監視基盤の整備
- 負荷試験基盤の構築
## 経験した仕事:パフォーマンス改善(2025年2月〜4月)
### 背景・概要
製薬企業が医師向けに開催する講演会の管理サービスにおいて、講演会の開催時刻にアクセスが集中する特性がありました。
年々講演会の開催規模は増加していたのですが、特に規模の大きい講演会を開催した場合、システムにかかる負荷がかなり限界に近いことが分かったため、パフォーマンス改善の取り組みを行いました。
### 1. 各API個別のパフォーマンス改善
【課題】
システム全体のレイテンシがピーク時に大きく上昇し、特に一部の重いAPIがボトルネックとなっていました。
また、レイテンシ改善のためにはどのAPIから優先的に手を入れるべきか、明確な基準がない状態でした。
【対応】
まず、DatadogのAPMやログを活用して以下の観点からボトルネックとなるAPIを可視化しました:
- p50, p95パーセンタイルのレイテンシ
- リクエスト回数
特に影響の大きいものから優先順位をつけ、以下のような対応を行いました
- DBインデックスの最適化:クエリ実行計画を分析し、必要なインデックスを追加
- キャッシュの導入:RedisやHTTPキャッシュを活用し、APIのレイテンシやアクセス回数を低減
- 仕様変更による削減:APIが提供する情報の特性に応じて、ビジネス観点で許容できる範囲内で時間単位のキャッシュを導入
【成果】
- 一部のAPIのレスポンスタイムを50ms以上の改善
- 一部のAPIのリクエスト数を数分の1未満まで削減
リリース後はその効果検証まで行い、実際にたしかにパフォーマンスが改善されたことまで確認をしていました。
### 2. リリース後の性能劣化を防ぐ監視体制の整備
【課題】
別チームのエンジニアを含む同一リポジトリを触る他のメンバーによる改修で、リリース後に思わぬAPIのパフォーマンス悪化が起きていたとき、それに気づくことなくアクセスピーク時刻を迎えてしまうリスクがあり、仕組みとして改善したいという課題がありました。
【対応】
DatadogのMonitor機能を使い、リリース後2時間のAPIレイテンシを先週の同時間帯と比較して監視し、大幅に悪化していた場合はアラートを出す監視を構築しました。
【成果】
性能劣化の早期検知が可能になり、改修によるパフォーマンス悪化をいち早く察知・対処できる体制を整備しました。
## 経験した仕事:負荷試験基盤の構築(2025年6月〜2025年9月)
### 背景・概要
先述のパフォーマンス改善により、現状のシステムにおいて負荷の限界が迫ることを予防することはできました。
ですが他の課題として、そもそもシステムに負荷の上限が設けられていることにより、同時間帯に開催できる講演会数を制限しなければならないというビジネス上の課題もありました。
根拠をもって上限を引き上げるために、システムの負荷の上限を精度高く計測するための仕組みとして、負荷試験基盤を構築することになりました。
### 1. 負荷試験基盤のリード
負荷試験基盤を構築するにあたって、そのプロジェクトのリードを務めました。
下記のチーム構成で進め、アーキテクチャの策定から、構築完了後の完了報告までを完了させました。
- プロジェクト管理・設計・メインの実装:私
- 一部の実装:チーム内の別のエンジニア1名
- 設計等のアドバイス・コードレビュー:SREや技術顧問を含む数名のエンジニア
また、リードを務めるにあたっては、はじめに下記の開発の指針を定め、プロジェクト進行中に判断に迷ったときの指針とするようにしました。
- 誰でも安全に負荷試験をできる環境が用意されていること
- 計測したい負荷 (講演会の同時開催時の大量アクセス) を正しくかけることができ、その負荷を計測できるようになっていること
- まずは最低限動く状態を目指して作ること
マネジメントについての詳細は「マネージメント能力」欄の2個目の欄に記載しています。
### 2. 負荷試験基盤の設計
負荷試験基盤を作るにあたって、まずは他社のテックブログ等をよく読み、負荷試験の事例を集めました。
続いて、本プロジェクトの目的や現状のシステム構成等を鑑みて、負荷試験基盤の大方針である「既存の Staging 環境を、負荷試験実施時のみ本番相当の性能に上げ、その Staging 環境宛に負荷試験ツール (k6) から負荷をかける」をまずは定めました。
それをもとに、「負荷がかかる環境 (Staging環境)」「負荷をかける方法とその環境」「負荷試験のワークフロー」ごとに、その設計や実装のタスクに切り出し、それぞれ進めていきました。
### 2. 負荷試験基盤の実装
主に下記の実装を行いました。
- Staging環境の terraform ファイルの修正
- terraform変数を用いて、Staging環境の性能を簡単に変更できるように修正
- 負荷試験ツール (k6) を動かすため環境の構築
- k6が入ったDockerコンテナを動かす ECS 環境の構築
- シナリオファイルの実装
- 予め調べていたリクエストパターンを模したリクエストが送られるようにシナリオ定義を作成
- 試験のワークフローの実装
- GitHub Actions によりインフラ性能の変更や負荷試験が自動で行われるワークフローを作成
- モニタリング手段の用意
- Datadog のダッシュボードを作成
## 成果
結果としては、プロジェクトの目的に対して必要十分な成果物を作成できたと自負しています。
負荷試験基盤を活用した具体的な成果としても、下記の成果を上げています。
- 受け入れ可能な負荷上限の引き上げ
- 実際に負荷試験を実施することで、以前は安全側に倒して設定していた受け入れ上限を根拠を持って引き上げることができました
- インフラ性能の調整によるコスト削減
- 負荷試験の結果、データベースのCPU使用率には十分な余裕があることが判明し、データベースのスケールダウンを行う計画が立案されました
## その他
また負荷試験基盤の構築後、テックブログを執筆しました。
上記取り組みの詳細を書いており、ぜひ読んでいただけますと幸いです。
[MedPeer で負荷試験基盤を構築しました - 定量的な計測のための精度の担保と自動化のコツ - メドピア開発者ブログ](https://tech.medpeer.co.jp/entry/2025/10/01/175835)
またその後、上記の記事をきっかけに Findy Tools 様の方からお声がかかり、Findy Tools のサイトに k6 のツールレビューの記事を寄稿しました。
[Grafana k6 を利用した負荷試験基盤の構築](https://findy-tools.io/products/grafana-k6/359/813)