SSE再接続を止める
SSEが「つながるのに負荷が増える」ときは、接続成功を正常終了と混同している可能性がある。 ストリームを開いた直後に閉じると、クライアントは一時的な障害として再接続を続ける。
切り分ける順番
3つの観測を分ける
- 切断元: サーバが閉じたのか、クライアントが中止したのかをログで分ける
- 再試行: 間隔と回数を見て、失敗を回復可能として扱っていないかを確認する
- 対応可否: そのHTTPメソッドと経路で、継続する応答を返す仕様があるかを確認する
この3つを混ぜると、接続、実装、クライアントの挙動を同時に直して原因が消える。先に観測を分ける。
未対応を速く終える
未対応の要求は、接続を開いてから黙って切らない。405のように扱えないことを返し、クライアントが再試行しても成功しない条件を取り除く。
拒否する経路を増やすときは、正しい接続を壊していないかを必ず別に確認する。拒否だけのテストは、利用できる経路まで消していても通ってしまう。
実際に踏んだ経緯
今回、未対応のGETがSSE接続を開いたあとすぐ閉じ、クライアントが2秒ごとに再接続していた。GETを405で明示的に拒否し、拒否経路の応答を短くした。
経緯と検証の分け方は、切れたSSEをすぐ止めたに書いた。 公開状態を確かめるときは、公開されたか確かめるを使う。