Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
リアーキテクチャに伴うサービスの無停止切り替え事例の紹介
Search
warawara28
June 10, 2025
Technology
0
53
リアーキテクチャに伴うサービスの無停止切り替え事例の紹介
20250307_タイミー共催セミナー_リアーキテクチャに伴うサービスの無停止切り替え事例の紹介
https://timeedev.connpass.com/event/344976/
warawara28
June 10, 2025
Tweet
Share
Other Decks in Technology
See All in Technology
CQRS/ESになぜアクターモデルが必要なのか
j5ik2o
0
1.3k
Data Hubグループ 紹介資料
sansan33
PRO
0
2.6k
AI アクセラレータチップ AWS Trainium/Inferentia に 今こそ入門
yoshimi0227
1
300
人はいかにして 確率的な挙動を 受け入れていくのか
vaaaaanquish
0
120
The Engineer with a Three-Year Cycle - 2
e99h2121
0
110
Digitization部 紹介資料
sansan33
PRO
1
6.6k
さくらのクラウドでのシークレット管理を考える/tamachi.sre#2
fujiwara3
1
210
kintone開発のプラットフォームエンジニアの紹介
cybozuinsideout
PRO
0
560
ALB「証明書上限問題」からの脱却
nishiokashinji
0
240
GitHub Copilot CLI 現状確認会議
torumakabe
10
3.3k
VRTと真面目に向き合う
hiragram
1
210
漸進的過負荷の原則
sansantech
PRO
1
170
Featured
See All Featured
Become a Pro
speakerdeck
PRO
31
5.8k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
710
How to Talk to Developers About Accessibility
jct
1
100
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
1
1.3k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
2
300
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
100
Music & Morning Musume
bryan
46
7k
Believing is Seeing
oripsolob
1
33
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
270
[SF Ruby Conf 2025] Rails X
palkan
0
720
Docker and Python
trallard
47
3.7k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
65
36k
Transcript
リアーキテクチャに伴う サービスの無停止切り替え事例の紹介 株式会社ジーニー 小河原優貴
小河原 優貴 Webチャットサービスの開発チームマネージャー 経歴:ジーニー→メルカリ→フリーランス→ジーニー 自己紹介 こ がわら ゆうき @warawara28 kgwryk28
• 事例1: 管理画面のリプレース • 事例2: メッセージ配信基盤のリアーキテクチャ 目次
事例1: 管理画面のリプレース
管理画面のリプレース:構成 変更前の構成 SPA + REST API 構成 Routing SPA (React)
REST API (Python/Django)
管理画面のリプレース:課題 1. ライブラリの全面刷新が必要 2. 技術負債が多く、機能開発の工数が増大 例 ・UIで使用しているテンプレート、シナリオ画面のライブラリを変更したい ・新機能開発をする際に既存機能、ライブラリが流用できない ・脆弱性対応のため、問題のあるライブラリのバージョンアップが必要 ・開発環境で使用するパッケージを変更して開発効率を上げたい
個別で対応した結果をまとめると、最終的には 実質ほぼ作り直し リファクタで対応するか、全てを捨ててリプレースするのか半年悩んだ
管理画面のリプレース:方針 1. 開発スコープを絞る a. REST APIは変更せず、SPAのみリプレースする。 b. 技術スタックはTypeScript/Reactをそのまま使用。 c. 移行中はUIのレイアウトを変更しない
2. 半年以上かけた段階的な移行 a. 既存ユーザーに配慮して周知・共有を行いながら、トラブル防止のため段階的な移行を行う 3. 移行中も機能開発は継続 a. 新機能は新管理画面に実装。旧管理画面の追加の機能開発は行わずコードフリーズした 旧管理画面を稼働しながら、新管理画面にリプレースする 決定方針
管理画面のリプレース:移行の流れ 移行の流れ 1. 新管理画面をリリース バージョニング+パスルーティングで振分 Routing 旧SPA REST API 新SPA
/v2/* /v1/* /v1/api/*
管理画面のリプレース:移行の流れ 移行の流れ 2. 新旧管理画面の遷移リンクを追加 (両方の画面を使えるようにする) その後デフォルトの画面を新SPAに変更 (ログイン後は新SPAが表示される) Routing 旧SPA REST
API 新SPA /v2/* /v1/* /v1/api/* 旧SPAへのリンク 新SPAへのリンク
管理画面のリプレース:移行の流れ 移行の流れ 3. 遷移リンクを削除後、 旧管理画面へのルーティングを削除 (サービスアウト) Routing REST API 新SPA
/v2/* /v1/api/* 旧SPAを削除 リンクを削除
事例紹介(管理画面) AFTER BEFORE
管理画面のリプレース:成果 AFTER BEFORE 開発環境 パッケージ数:2366 モジュールハンドラ:webpack ローカル起動時間:30s ホットリロード:20s ビルド時間:53s 開発環境
パッケージ数:518 -78%! モジュールハンドラ:vite ローカル起動時間:~1s 30倍~! ホットリロード:~1s 20倍~! ビルド時間:17s 3.1倍!
管理画面のリプレース:成果 AFTER BEFORE 機能開発 リードタイム(平均):0.7ヶ月 -46%! チケット消化数(平均):16個 1.6倍! 機能開発 リードタイム(平均):1.3ヶ月
チケット消化数(平均):10個
事例2: メッセージ配信基盤のリアーキテクチャ
変更前のアーキテクチャ
変更後のアーキテクチャ
管理画面のリプレース:構成 バックエンドで処理されたメッセージが配信キューに送信 配信キューから配信サーバーがメッセージを取得してクライアントに配信 (WebSocketによる双方向通信で実現) 処理ワーカー 配信サーバー クライアント roomid: aaa クライアント
roomid: bbb 配信サーバー 処理ワーカー roomid: aaaに送信するメッセージ roomid: bbbに送信するメッセージ roomid: bbbのメッセージは捨てる roomid: aaaのメッセージは捨てる 配信キュー
メッセージ配信基盤:課題 1. 配信サーバーのスケーラビリティが低い問題 a. 全体のメッセージ処理負荷をサーバー毎に分散できない メッセージ処理負荷が増えても、スケーリングしやすい設計にしたい
管理画面のリプレース:方針 配信サーバーがルーム単位でメッセージ取得できるようにする 決定方針 1. 配信キューを Valkey(Redis)を利用した Pub/Subに置き換える a. 配信サーバーはクライアントの接続ルーム単位でチャネルをSubscribeする 他のルームのメッセージを受信しなくて良くなる
2. 送信側でDouble Writeを利用、受信側は両方受信しながら切り替える a. デプロイ後のロールバックを考慮 3. 段階的なリリース
管理画面のリプレース:移行の流れ(1/6) 配信サーバーは配信キュー内の全てのメッセージを受信する。 (クライアントに配信しないメッセージは無視) roomid: aaaに送信するメッセージ roomid: bbbに送信するメッセージ 処理ワーカー 配信サーバー クライアント
roomid: aaa クライアント roomid: bbb 配信サーバー 処理ワーカー roomid: bbbのメッセージは捨てる roomid: aaaのメッセージは捨てる 配信キュー
管理画面のリプレース:移行の流れ(2/6) Valkey(Redis)を用意して、ワーカーはキューとValkey(Redis)に同一メッセージをDouble Write roomid: aaaに送信するメッセージ roomid: bbbに送信するメッセージ 処理ワーカー クライアント roomid:
aaa クライアント roomid: bbb 処理ワーカー roomid: bbbのメッセージは捨てる roomid: aaaのメッセージは捨てる 配信サーバー 配信サーバー Valkey(Redis) subscriberがいない場合捨てられる 配信キュー
管理画面のリプレース:移行の流れ(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経由のメッセージも捨てる
管理画面のリプレース:移行の流れ(4/6) 配信サーバーでメッセージの受信元を キューからValkey(Redis) に切り替える ・Valkey(Redis)のメッセージ :捨てる ・SQSのメッセージ :利用する or 捨てる
roomid: aaaに送信するメッセージ roomid: bbbに送信するメッセージ 処理ワーカー 配信サーバー クライアント roomid: aaa クライアント roomid: bbb 配信キュー 配信サーバー 処理ワーカー Valkey(Redis) SQS経由のメッセージは捨てる SQS経由のメッセージは捨てる
管理画面のリプレース:移行の流れ(5/6) 送信側でSNS/SQSに送信するのを停止する (SQSにメッセージが流れなくなる) roomid: aaaに送信するメッセージ roomid: bbbに送信するメッセージ 処理ワーカー 配信サーバー クライアント
roomid: aaa クライアント roomid: bbb 配信キュー 配信サーバー 処理ワーカー Valkey(Redis)
管理画面のリプレース:移行の流れ(6/6) 配信キューを削除して切り替え完了 roomid: aaaに送信するメッセージ roomid: bbbに送信するメッセージ 処理ワーカー 配信サーバー クライアント roomid:
aaa クライアント roomid: bbb 配信サーバー 処理ワーカー Valkey(Redis)
事例紹介(メッセージ配信サーバーのCPU負荷) AFTER BEFORE
まとめ ・既存仕様を把握、課題を明確化しておく ・対処の選択肢を複数リストアップしてから判断する リファクタリングやコードの修正などで解決できないか? 他の選択肢と投資対効果をしっかり比較する 議論内容、比較軸の検討などはADRとして残しています ・実施する場合、やらないことを決めておく 社内過去事例として、リプレースが全ての問題を解決する魔法のプロジェクトになってしまい 失敗したことがあります
ご清聴ありがとうございました