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

リアーキテクチャに伴うサービスの無停止切り替え事例の紹介

 リアーキテクチャに伴うサービスの無停止切り替え事例の紹介

20250307_タイミー共催セミナー_リアーキテクチャに伴うサービスの無停止切り替え事例の紹介
https://timeedev.connpass.com/event/344976/

Avatar for warawara28

warawara28

June 10, 2025
Tweet

Other Decks in Technology

Transcript

  1. 管理画面のリプレース:方針 1. 開発スコープを絞る a. REST APIは変更せず、SPAのみリプレースする。 b. 技術スタックはTypeScript/Reactをそのまま使用。 c. 移行中はUIのレイアウトを変更しない

    2. 半年以上かけた段階的な移行 a. 既存ユーザーに配慮して周知・共有を行いながら、トラブル防止のため段階的な移行を行う 3. 移行中も機能開発は継続 a. 新機能は新管理画面に実装。旧管理画面の追加の機能開発は行わずコードフリーズした 旧管理画面を稼働しながら、新管理画面にリプレースする 決定方針
  2. 管理画面のリプレース:成果 AFTER BEFORE 開発環境 パッケージ数:2366 モジュールハンドラ:webpack ローカル起動時間:30s ホットリロード:20s ビルド時間:53s 開発環境

    パッケージ数:518 -78%! モジュールハンドラ:vite ローカル起動時間:~1s 30倍~! ホットリロード:~1s 20倍~! ビルド時間:17s 3.1倍!
  3. 管理画面のリプレース:構成 バックエンドで処理されたメッセージが配信キューに送信 配信キューから配信サーバーがメッセージを取得してクライアントに配信 (WebSocketによる双方向通信で実現) 処理ワーカー 配信サーバー クライアント roomid: aaa クライアント

    roomid: bbb 配信サーバー 処理ワーカー roomid: aaaに送信するメッセージ roomid: bbbに送信するメッセージ roomid: bbbのメッセージは捨てる roomid: aaaのメッセージは捨てる 配信キュー
  4. 管理画面のリプレース:移行の流れ(2/6) Valkey(Redis)を用意して、ワーカーはキューとValkey(Redis)に同一メッセージをDouble Write roomid: aaaに送信するメッセージ roomid: bbbに送信するメッセージ 処理ワーカー クライアント roomid:

    aaa クライアント roomid: bbb 処理ワーカー roomid: bbbのメッセージは捨てる roomid: aaaのメッセージは捨てる 配信サーバー 配信サーバー Valkey(Redis) subscriberがいない場合捨てられる 配信キュー
  5. 管理画面のリプレース:移行の流れ(3/6) 配信サーバーでValkey(Redis)に対してSubscribeを行い、メッセージを両方受信するようにする ・Valkey(Redis)のメッセージ :受け取って捨てる ・SQSのメッセージ :受け取って利用する or 別のルームのメッセージは捨てる roomid: aaaに送信するメッセージ

    roomid: bbbに送信するメッセージ 処理ワーカー 配信サーバー クライアント roomid: aaa クライアント roomid: bbb 配信キュー 配信サーバー 処理ワーカー roomid: bbbのメッセージは捨てる roomid: aaaのメッセージは捨てる Valkey(Redis) Valkey経由のメッセージも捨てる Valkey経由のメッセージも捨てる
  6. 管理画面のリプレース:移行の流れ(4/6) 配信サーバーでメッセージの受信元を キューからValkey(Redis) に切り替える ・Valkey(Redis)のメッセージ :捨てる ・SQSのメッセージ :利用する or 捨てる

    roomid: aaaに送信するメッセージ roomid: bbbに送信するメッセージ 処理ワーカー 配信サーバー クライアント roomid: aaa クライアント roomid: bbb 配信キュー 配信サーバー 処理ワーカー Valkey(Redis) SQS経由のメッセージは捨てる SQS経由のメッセージは捨てる