Architecture🛠️ 開発体験(DX)💸 コスト削減

Segment (Twilio Segment)

Segment、140以上のマイクロサービスを1つのモノリスに統合

マイクロサービス(宛先ごとの個別サービス)モノリス(単一サービス)

月3件ペースで増える連携先ごとにマイクロサービスを作った結果、共有ライブラリのバージョンばらつきと運用負荷が限界に達し、単一サービスへ回帰した。

課題

宛先ごとに140以上のマイクロサービスを乱立させ、依存関係管理と運用負荷が限界に達した

アプローチ

Centrifugeで配信を一元化し、Traffic Recorderでテストを高速化、共有ライブラリを単一バージョンに統一

効果

テストが最大1時間からミリ秒単位に短縮、共有ライブラリの改善数も年46件に増加

背景

Segmentは顧客データを様々な宛先(Destinations)に転送するサービスで、秒間数十万件のイベントを処理していた。当初は単一のキューで処理していたが、あるデスティネーションの障害が全体の遅延を招く「ヘッドオブラインブロッキング」が発生したため、140以上のデスティネーションそれぞれに専用のサービスとキューを持たせるマイクロサービス構成へと切り替えた。しかしこの構成は各リポジトリで120個の依存関係を異なるバージョンで運用する状態を生み、共有ライブラリの修正が全サービスに反映されるまで数日から1週間かかるようになった。負荷パターンもサービスごとに異なるため手作業でのスケーリングが必要になり、システム維持だけに3名のフルタイムエンジニアが専従する状態となっていた。

移行のプロセス

Segmentのエンジニアは140以上のマイクロサービスを1つのモノリスサービスへ統合する決断をし、複数の施策を並行して実施した。

  • 個別キューに代わって「Centrifuge」という仕組みを構築し、単一サービスへのイベント配信を一元的に担わせた
  • テスト環境の再現には既存OSSのyakbakをベースにした「Traffic Recorder」を開発し、HTTP通信を記録・再生することでテスト実行をミリ秒単位まで高速化した
  • 宛先ごとにバラバラだった共有ライブラリのバージョンを、全デスティネーション共通の単一バージョンに統一した

結果

統合の結果、複数の指標で改善が見られた。

  • テスト実行時間は最大1時間かかっていたものがミリ秒単位に短縮された
  • 共有ライブラリへの改善件数はマイクロサービス時代の年32件から、モノリス化後の1年間で46件に増加し、開発生産性が向上した
  • デプロイも120以上のサービスへの個別デプロイから単一サービスへのデプロイへと簡素化された

学び

「rock solid testing suite」なしにモノリス化を進めると失敗するとの認識のもと、fault isolation・in-memory caching・依存関係アップデートの柔軟性という3点のトレードオフを受け入れる必要があったと振り返っている。

2018-05-31
他の事例も見る