291 Views
November 06, 24
スライド概要
2024/9/18 PHPカンファレンス沖縄2024 の発表資料です
https://fortee.jp/phpcon-okinawa-2024/proposal/744d8ab9-05ba-4143-9467-d9e9d0144f4d
森脇大智 / サイボウズ株式会社 Garoon開発チーム
サイボウズ株式会社の主に開発本部の資料を公開するアカウントです。
中堅・大規模組織向けグループウェアGaroon におけるジョブキュー切り替えの挑戦 発表内容はブログにまとめています 以下のQRコードから飛べます 2024年9月28日(土) サイボウズ株式会社 森脇 大智 1
Q. 皆さんはジョブキューを 利用されていますか? 利用されたことがありますか? Copyright © Cybozu 22
一旦, 認識合わせ ここでいう, ジョブキューとは… 通知の送信やデータ処理などのジョブを FIFOの順序で非同期に処理するための仕組み ジョブ ジョブキュー Copyright © Cybozu 3
Garoonにおけるジョブキューの利用 中堅・大規模組織向けグループウェアGaroonでも 通知処理などにジョブキューを利用している 画像引用元: https://jp.cybozu.help/g/ja/user/application/notification/confirm.html Copyright © Cybozu 4
今回話すことの概要 ジョブキューを Garoon(Webサービス)を停止させないまま, 新しいものに切り替えた際に直面した3つの課題と解決策, および, 実際の切り替えの手順 をお話しします! Copyright © Cybozu 5
今回のお話しのゴール 皆さんが扱っているWebサービスで ジョブキューを切り替える機会があったときに, この発表を思い出して, 参考にしてもらえる Copyright © Cybozu 6
目次 1. ジョブキュー切り替えの背景と目的 2. 切り替えで直面した3つの課題と解決策 3. 実際の切り替え・切り戻し手順の紹介 4. やってみた感想 5. まとめ Copyright © Cybozu 77
目次 1. ジョブキュー切り替えの背景と目的 2. 切り替えで直面した3つの課題と解決策 3. 実際の切り替え・切り戻し手順の紹介 4. やってみた感想 5. まとめ Copyright © Cybozu 88
背景 弊社ではインフラ基盤の変更を行っている ↓ Garoonのジョブキューを新しいものに 切り替える必要が出てきた Copyright © Cybozu 9
新しいジョブキューに切り替えるに伴い 停止リリースをすると数ヶ月に1度しかリリースできない これが一筋縄では行かなかった!! 作業効率を上げるため ジョブキュー1つだと, FIFOの順序でジョブを実行してくれるけど, それを無停止で切り替えるとなると色々ケアすることがある… Garoonでは, 無停止での切り替えに挑戦した Copyright © Cybozu 10
目次 1. ジョブキュー切り替えの背景と目的 2. 切り替えで直面した3つの課題と解決策 3. 実際の切り替え・切り戻し手順の紹介 4. やってみた感想 5. まとめ Copyright © Cybozu 11 11 11
課題1:切り戻しへの対応 新規ジョブキューに無停止で切り替えるに当たり, 最初に検討したこと… 切り戻しへの対応 Copyright © Cybozu 12
課題1:切り戻しへの対応 新規のジョブキューに切り替えると… 処理速度の低下やリソース使用量の増加などの問題が 発生する可能性あった この問題は実際に動かしてみないと, わからない… 安定した動作が保証されている既存のジョブキューへ 即座に切り戻しができるように準備しておく必要があった Copyright © Cybozu 13
課題1:切り戻しへの対応 切り戻しができるとは…? 例) 新規のジョブキューで Job 4の処理中に問題が発生した場合 Job4が実行できなかったとしても, 既存のジョブキューでJob4が実行できる状態のこと 切り戻し用にバックアップのジョブを 保持しておく必要がある Copyright © Cybozu 14
課題1:切り戻しへの対応 にあたり 前提:ジョブキュー自体を改修することはできない. Garoon 側を改修することで対応することにした. • ジョブを登録する側(Ap) • 非同期処理の内容が書かれている側(Batch Ap) • エンドポイントも別途, 新しく作る. Copyright © Cybozu 15
課題1:切り戻しへの対応 の解決策 解決策 新規ジョブキューと既存ジョブキューの両方にジョブを登録する ここを改修する Copyright © Cybozu 16
課題1:切り戻しへの対応 の解決策 具体的には… 新規のジョブキュー • 非同期処理を実行する用 既存のジョブキュー • バックアップ用 という感じで役割分担する. Copyright © Cybozu 17
課題1:切り戻しへの対応 の解決策 両方のジョブキューに登録するジョブには 目印をつけた 既存のジョブキュー用のエンドポイントは 目印の有無で バックアップ用のジョブであるかどうかを 判断できる (Batch Apの制御方法に関しては後述) Copyright © Cybozu 18
切り替えで直面した3つの課題と解決策 切り戻しへの対応 • 両方のジョブキューにジョブを登録する しかし… これにより以下の2つの問題が発生 1.ジョブの実行順序が乱れる問題 2.ジョブが重複実行される問題 Copyright © Cybozu 19
切り替えで直面した3つの課題と解決策 1.ジョブの実行順序が乱れる問題 2.ジョブが重複実行される問題 Copyright © Cybozu 20
課題2:ジョブの実行順序が乱れる問題 新旧の両方のジョブキューにジョブを登録するようになったことで… ジョブの実行順序が乱れる可能性があった 例) 先に処理すべきジョブが既存のジョブキューに残っている場合… 新規のジョブキューで後に登録されたジョブが先に実行されてしまう ジョブの実行順序をBatch Apで 制御する必要がある! Copyright © Cybozu 21
課題2:ジョブの実行順序の保証 の解決策 解決策 新規ジョブキュー用のエンドポイントでジョブの処理順序を制御する ここを改修する Copyright © Cybozu 22
課題2:ジョブの実行順序の保証と解決策 新規のジョブキュー用のエンドポイントで 既存のジョブキューの中に 先に実行するべきジョブが存在するかどうか を確認するようにした Copyright © Cybozu 23
課題2:ジョブの実行順序の保証 • 存在する • まだ実行すべきではないため, リトライ. • 存在しない • もう実行して良いため, 実行する. Copyright © Cybozu 24
課題2:ジョブの実行順序の保証 • 存在する • まだ実行すべきではないため, リトライ. • 存在しない • もう実行して良いため, 実行する. Copyright © Cybozu 25
切り替えで直面した3つの課題と解決策 1. 切り戻しへの対応 • 両方のジョブキューにジョブを登録する 2. ジョブの実行順序が乱れる問題 • 新規ジョブキュー用のエンドポイントでジョブの処理順序を制御する 3. ジョブが重複実行される問題 Copyright © Cybozu 26
切り替えで直面した3つの課題と解決策 1. 切り戻しへの対応 • 両方のジョブキューにジョブを登録する 2. ジョブの実行順序が乱れる問題 • 新規ジョブキュー用のエンドポイントでジョブの処理順序を制御する 3. ジョブが重複実行される問題 Copyright © Cybozu 27
課題3:ジョブの重複実行の防止 新旧の両方のジョブキューにジョブを登録するようになったことで… ジョブが重複実行される問題があった 特に、冪等性が保証されていないジョブにおいて、 重複実行が発生するとお客様に影響を与える可能性があった Copyright © Cybozu 28
課題3:ジョブの重複実行の防止 の解決策 解決策 既存のジョブキュー用のエンドポイントでジョブの処理順序を制御する ここを改修する Copyright © Cybozu 29
課題3:ジョブの重複実行の防止 の解決策 具体的には, 以下の2つの条件で処理方法を分岐した 処理するジョブが 目印ありのジョブか? 目印なしのジョブか? 目印なしのジョブ 目印ありのジョブ 新規のジョブキューに同一 のジョブが存在するか? 存在しない 存在する リトライする スキップする Copyright © Cybozu 処理する 30
課題3:ジョブの重複実行の防止 の解決策 具体的には, 以下の2つの条件で処理方法を分岐した 処理するジョブが 目印ありのジョブか? 目印なしのジョブか? 目印なしのジョブ 目印ありのジョブ 新規のジョブキューに同一 のジョブが存在するか? 存在しない 存在する リトライする スキップする Copyright © Cybozu 処理する 31
課題3:ジョブの重複実行の防止 の解決策 処理するジョブが 目印ありのジョブか?目印なしのジョブか? • 目印なしのジョブ • バックアップ用のジョブではないため, そのままジョブを実行する. • 目印ありのジョブ • バックアップ用のジョブであるため, 2つ目の条件を確認する. Copyright © Cybozu 32
課題3:ジョブの重複実行の防止 の解決策 処理するジョブが 目印ありのジョブか?目印なしのジョブか? • 目印なしのジョブ • バックアップ用のジョブではないため, そのままジョブを処理する. • 目印ありのジョブ • バックアップ用のジョブであるため, 2つ目の条件を確認する. Copyright © Cybozu 33
課題3:ジョブの重複実行の防止 の解決策 具体的には, 以下の2つの条件で処理方法を分岐した 処理するジョブが 目印ありのジョブか? 目印なしのジョブか? 目印なしのジョブ 目印ありのジョブ 新規のジョブキューに同一 のジョブが存在するか? 存在しない 存在する リトライする スキップする Copyright © Cybozu 処理する 34
課題3:ジョブの重複実行の防止 の解決策 新規のジョブキューに同一のジョブが存在するか? • 存在しない • すでにジョブは実行されているため, 実行をスキップする (バックアップのジョブを消す) • 存在する • ジョブはまだ実行されていないため, バックアップ用のジョブを止めておく. Copyright © Cybozu 35
課題3:ジョブの重複実行の防止 の解決策 新規のジョブキューに同一のジョブが存在するか? • 存在しない • すでにジョブは実行されているため, 処理をスキップする (バックアップのジョブを消す) • 存在する • ジョブはまだ実行されていないため, バックアップ用のジョブを止めておく. Copyright © Cybozu 36
移行で直面した3つの課題と解決策 1. 切り戻しへの対応 • 両方のジョブキューにジョブを登録する 2. ジョブの実行順序が乱れる問題 • 新規ジョブキュー用のエンドポイントでジョブの処理順序を制御する 3. ジョブが重複実行される問題 • 新規ジョブキュー用のエンドポイントでジョブの処理順序を制御する Copyright © Cybozu 37
切り替えで直面した3つの課題と解決策: 小まとめ 1. 切り戻しへの対応 • 両方のジョブキューにジョブを登録する 2. ジョブの実行順序が乱れる問題 • 新規ジョブキュー用のエンドポイントでジョブの処理順序を制御する 3. ジョブが重複実行される問題 • 新規ジョブキュー用のエンドポイントでジョブの処理順序を制御する Copyright © Cybozu 38
目次 1. ジョブキュー切り替えの背景と目的 2. 切り替えで直面した3つの課題と解決策 3. 実際の切り替え・切り戻し手順の紹介 4. やってみた感想 5. まとめ Copyright © Cybozu 39 39 39
実際の切り替え・切り戻し手順 まずは切り替え手順から紹介! Copyright © Cybozu 40
実際の切り替え手順 切り替え前の状態 • • 既存のジョブキューだけに, ジョブが登録されている 既存のジョブキューのジョブだけを, 実行している. Copyright © Cybozu 41
実際の切り替え手順 Batch Apの改修内容をリリース 挙動としては変化なし. 切り替え前の状態と同じで, 既存のジョブキューのジョブだけが実行される. なぜ, Batch Apのみを最初に適用するの? ローリングアップデートで目印あり・なしのジョブが 入り乱れる状態に対応するため. 今回は時間の都合上, 詳しくはお話ししません Copyright © Cybozu 42
実際の切り替え手順 Apの改修内容をリリース • 両方のジョブキューにジョブを登録する リリースした直後は, 既存のジョブキューの 目印なしのジョブを実行する Copyright © Cybozu 43
実際の切り替え手順 Apの改修内容をリリース • 両方のジョブキューにジョブを登録する リリースしてしばらく経過すると, 目印なしのジョブは全て消え, 新規のジョブキューでのみジョブが実行される. 既存のジョブキューをバックアップとして 利用できるようになる!! Copyright © Cybozu 44
実際の切り替え手順 新規のジョブキューで安定して 動作することが確認できたら, 既存のジョブキューを撤去する 切り替え完了! Copyright © Cybozu 45
実際の切り替え・切り戻し手順 次に切り戻し手順を紹介! Copyright © Cybozu 46
実際の切り戻し手順 新規のジョブキュー用のエンドポイントで 問題が発生した場合 Copyright © Cybozu 47
実際の切り戻し手順 ApとBatch Apの改修内容を 元の状態に戻す. 既存のジョブキューにジョブが 保持されているため, ジョブが損失なく実行できる. Copyright © Cybozu 48
目次 1. ジョブキュー切り替えの背景と目的 2. 切り替えで直面した3つの課題と解決策 3. 実際の切り替え・切り戻し手順の紹介 4. やってみた感想 5. まとめ Copyright © Cybozu 49 49 49
やってみた感想 一時的なロジックとはいえ, ユニットテストはしっかり書いたほうがよかった 切り替えが完了すると不必要になるロジックであったため, しっかりとユニットテストは 書いていなかった. しかし, ロジック自体は複雑になってしまっていたため, きちんと書いておくと安心だった ジョブの処理に冪等性を持たせるともっと簡単にできた 冪等性があったらもう少し簡単化できたと思う. けど, 後から冪等性を持たせることは容易ではないので, Webサービス側だけの改修で切 り替えができることを示せたのは意味のあることだったと思う. Copyright © Cybozu 50
目次 1. ジョブキュー切り替えの背景と目的 2. 切り替えで直面した3つの課題と解決策 3. 実際の切り替え・切り戻し手順の紹介 4. やってみた感想 5. まとめ Copyright © Cybozu 51 51 51
まとめ 弊社のサービス Garoonを停止させないまま, ジョブキューを切り替えた 切り替えでは, 3つの課題に直面したが, それぞれ解決策を施した • • • 切り戻しへの対応 • 両方のジョブキューにジョブを登録する ジョブの実行順序が乱れる問題 • 新規ジョブキュー用のエンドポイントでジョブの処理順序を制御する ジョブが重複実行される問題 • 新規ジョブキュー用のエンドポイントでジョブの処理順序を制御する 解決策を元に切り替えの手順を示した Copyright © Cybozu 52