4

フィルタ チェーンの非常に優れた点は、各フィルタが前のフィルタの終了を待たないことです。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が十分な速さでジョブを終了するため、次のリクエストはすぐに処理されます)。

または、私が見逃している落とし穴はありますか?

4

1 に答える 1

1

これをテストする方法があります。スリープするフィルターを作成し、フィルター チェーンで使用します。次に、前のリクエストがスリープしている間に nginx がリクエストを処理できるかどうかをテストします。

次に、テストを再度実行しますが、今回はフィルターをスリープさせず、次のようにタイムアウトを選択して待機させます。

/* wait 1.5 secs */
struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 500000;
select(0, NULL, NULL, NULL, &tv);
于 2011-07-22T19:00:40.743 に答える