処理中のPOSTリクエストを別のサーバで引き継ぐPartial POST Replayについて

なんらかの理由でWebサーバを停止する場合に、処理中のPOSTリクエストをそのまま別のサーバで引き継げるようにする「HTTP Partial POST Replay」という仕様がFacebookAlan Frindell氏から提出されています (HTTP Workshopの資料はこちら)。

スポットインスタンスを利用していたり、サーバの設定を変えて再起動したい場合、新しいリクエストは受け付けないようにし、すでに来ているリクエストのみ処理をするのは一般的です。それでも大きなファイルをアップロードしているPOSTリクエストは処理が終わるまで時間がかかってしまう場合がありあります。

やむをえずPOSTリクエストの処理を中断してしまうと、ユーザは再度大きなファイルをアップロードしなおす必要があり、とてもストレスがかかります。

HTTP Partial POST Replay」では、ユーザの接続を切ることなく別のサーバでPOSTリクエストを引き継ぐことができます。

Partial POST Replay

ひとことで「HTTP Partial POST Replay」の説明をすると、POSTリクエストを処理しているWebサーバがリバースプロキシまで処理中のリクエストを差し戻し、別のサーバで改めて続きを処理します。そのため、構成としてはPartial POST Replayに対応したリバースプロキシがいる前提となります。

クライアントとProxy間の接続は切断することなく、処理を引き継ぐことができます。

流れ

f:id:ASnoKaze:20190630185717p:plain
処理の引継ぎを行うWebサーバはPOSTリクエストに対して「3xx Partial POST Replay」(ステータスコードは未定)を返します。このHTTPレスポンスには、Webサーバが引き継ごうとしているHTTPリクエスト情報が格納されています。リクエストヘッダと疑似ヘッダは、echo-というプレフィクスをつけてレスポンスヘッダに格納されます。POSTしていたデータはレスポンスボディに格納されています。

このレスポンスを受け取ることで、Proxyは元のリクエストと現時点でPOSTされているデータを復元することができます。

f:id:ASnoKaze:20190630191627p:plain
Proxyは復元できたPOSTリクエストを別のWebサーバに割り振りなおします。このときクライアントとのコネクションは切断することなく、送信されてくるデータはProxyがバッファリングし続けています。

また、再度同じWebサーバに割り振られるのを防ぐために、partial-post-replayリクエストヘッダをつけることで、Partial POST Replayであることを明示します。