nginx の優れたパフォーマンスの理由が非同期で非ブロッキングの基盤にあることは誰もが知っています。そのため、ネットワーク リクエストを処理する nginx プラグインを開発するときは、時間のかかる特定の操作をブロック方式で実行することを忘れないでください。そうしないと、nginx のパフォーマンスに深刻な影響を及ぼします...
次の質問が発生します: プラグインで時間のかかる操作を実行したい場合はどうすればよいですか?たとえば、データベースにクエリを実行します (データベースは http プロトコルをサポートしていません。特別なプロトコルがあります)。
ps: スレッド プールを開いて、これらのブロック操作をプールにスローすることはできますが、nginx フレームワークのイベント キューへの現在のリクエスト処理を一時停止する方法はありますか?ステータスの変更がブロッキング操作のコールバック関数で送信されるとき、nginx は前のリクエストの処理を続行しますか?
ありがとう
迷茫2017-05-16 17:14:26
データベースクエリは本質的にネットワーク通信であり、ソケットの読み取りと書き込みがブロックされていない限り、問題はありません。これは言うは易く行うは難しです。 nginx 自体には、http 上でさまざまな非ブロッキング操作を実装するための再利用可能なメカニズムがいくつかあります。ただし、tcp などの通信はすぐに利用できない場合があります。自分で書かなければなりませんが、それはより複雑だと思いますし、nginx に統合する必要もあります。