aobako.net
Responder + gunicorn 構成でハマったところメモ
March 16, 2020
2度とつらみを味わわないために.
KeepAlive
デフォルトで2秒になっている.これが前段のロードバランサーのアイドルタイムより短いと時たま 502 BAD_GATEWAY が発生していた.
AWS ALB とかだと 60 秒キープするので,それより長い値をセットする必要がある.
Blocking i/o
ASGIアプリであることの意味をちゃんと理解しておく.
どうやら Responder は async を付けるとイベントループで,付けないとスレッドで動くようだ(このへん -> https://github.com/taoufik07/responder/blob/df89d1d58ba962f232c425dbcba50c25128752cb/responder/routes.py#L131-L138).
イベントループの場合は全てのリクエストが同スレッドで動くので,ブロッキング i/o が発生するとそこで他のリクエストの処理がとまる.
別に async じゃなくてええんや.と思っても POST ボディを読み込もうとするとこいつの戻りが awaitableなので,async が必要.外部 API を呼んだりする必要があるのであれば,aiohttp 等ノンブロッキングなクライアントを使用する必要がある.