フィルタ チェーンの非常に優れた点は、各フィルタが前のフィルタの終了を待たないことです。Unix パイプラインのように、前のフィルターの出力を生成時に処理できます。(ここから)
上記は、各フィルターの最後にあるそのようなコードについて話していると思います。
if (!chain_contains_last_buffer)
return ngx_http_next_body_filter(r, in);
つまり、nginx はフィルターを 1 つずつチェーンします。ただし、各フィルターの最後にあるため、現在のフィルターが完了するまで待機する必要があります。nginx がどうやってeach filter doesn't wait for the previous filter to finish
.
したがって、上記はnginxフィルターの同時実行性についてであり、次はnginxリクエスト処理の同時実行性についてです:
私たちが知っているように、nginxはepoll
リクエストを処理するために使用します:
events = epoll_wait(ep, event_list, (int) nevents, timer);
for (i = 0; i < events; i++) {
...
rev->handler(rev);
}
上記のようなコードでは、nginx が 2 つのリクエストを同時に処理できるとは思えません。1 つずつしか処理できません (それぞれhandler
が十分な速さでジョブを終了するため、次のリクエストはすぐに処理されます)。
または、私が見逃している落とし穴はありますか?