## サービス概要
医師向けのプラットフォームサイトのうち、製薬企業が医師向けに開催する、薬剤に関する講演会を支援するサービスです。講演会開催に関する情報配信・申込管理・運営支援などを提供しており、主に製薬企業からの開催費用を収益源としています。
## チーム体制
当初はサーバーサイドエンジニア7名ほどの体制でしたが、プロジェクトの拡大に伴い分化され、最終的にはサーバーサイド4名、PdM3名程度の小規模なプロダクトチームとして機能していました。
## サービスの特徴と技術的な難しさ
長年運用されており、仕様やデータ構造が複雑化している部分が多く、改修時の影響調査に工数を要する傾向がありました。
講演会が一斉に始まる時間帯にはアクセスが集中し、ピーク時の負荷対策が重要な課題となっていました。
## 役割・担当業務
サーバーサイドエンジニアとして、以下の業務を担当しました
- 複雑な既存機能の改修・保守
- 不具合調査およびインシデント対応
- アクセス集中時のパフォーマンス改善施策の設計・実施
- Datadogなどを活用した監視基盤の整備
## 経験した仕事:パフォーマンス改善(2025年2月〜)
### 背景・概要
製薬企業が医師向けに開催する講演会の管理サービスにおいて、講演会の開催時刻にアクセスが集中する特性がありました。そのため、システムが捌ける講演会数に制限を設けて運用されていました。
本業務では、この制限を緩和することを目的とし、パフォーマンス改善に取り組みました。
### 1. アクセスピーク時の負荷に応じたしきい値算出ロジックの構築
【課題】
従来は、ピーク時の負荷に基づいて一日に受注できる講演会数の上限をエンジニアの経験則で設定しており、根拠が曖昧な状態でした。
「なぜこの上限値か」という説明ができず、ビジネス側との調整やリスク判断に課題がありました。
【工夫】
そこで、ピーク時のAPIごとの呼び出し数とサーバ負荷(CPU使用率など)の関係をもとに、各APIの「1リクエストあたりの負荷寄与度」を数値で見積もる手法を考案・確立しました。
- Dadadog等の監視ツールなどからピーク時のログデータを収集し、「API Aの呼び出し数 × 係数A + API Bの呼び出し数 × 係数B + ... = 負荷」のようなモデルを構築
- APIごとの係数(負荷寄与度)は最小二乗法を用いて統計的に算出
このアプローチにより、負荷の見積もりを感覚や過去の記憶に頼らず、過去データに基づいた計算で導き出せるようになりました。
【成果】
受注上限を算出する基準を定式化し、その後に控えている負荷改善を行う際の、改善結果の定量的な測定方法の確立に貢献しました。
また、サーバーのCPU・サーバーのメモリ・DBのCPU使用率のうち、どの要素がどの程度ボトルネックになっているのかを明確に数値として算出しました。
### 2. 各API個別のパフォーマンス改善
【課題】
システム全体のレイテンシがピーク時に大きく上昇し、特に一部の重いAPIがボトルネックとなっていました。
また、レイテンシ改善のためにはどのAPIから優先的に手を入れるべきか、明確な基準がない状態でした。
【工夫】
まず、DatadogのAPMやログを活用して以下の観点からボトルネックとなるAPIを可視化しました:
- p50, p95パーセンタイルのレイテンシ
- リクエスト回数
特に影響の大きいものから優先順位をつけ、以下のような対応を行いました
- DBインデックスの最適化:クエリ実行計画を分析し、必要なインデックスを追加
- キャッシュの導入:RedisやHTTPキャッシュを活用し、APIのレイテンシやアクセス回数を低減
- 仕様変更による削減:APIが提供する情報の特性に応じて、ビジネス観点で許容できる範囲内で時間単位のキャッシュを導入
【成果】
- 一部のAPIのレスポンスタイムを50ms以上の改善
- 一部のAPIのリクエスト数を数分の1未満まで削減
リリース後はその効果検証まで行い、実際にたしかにパフォーマンスが改善されたことまで確認をしていました。
### 3. リリース後の性能劣化を防ぐ監視体制の整備
【課題】
別チームのエンジニアを含む同一リポジトリを触る他のメンバーによる改修で、リリース後に思わぬAPIのパフォーマンス悪化が起きていたとき、それに気づくことなくアクセスピーク時刻を迎えてしまうリスクがあり、仕組みとして改善したいという課題がありました。
【工夫】
DatadogのMonitor機能を使い、リリース後2時間のAPIレイテンシを先週の同時間帯と比較して監視し、大幅に悪化していた場合はアラートを出す監視を構築しました。
【成果】
性能劣化の早期検知が可能になり、改修によるパフォーマンス悪化をいち早く察知・対処できる体制を整備しました。