
実現したいこと
Node.js+expressで構築したAPIサーバーで同時リクエストを並列処理したい。
(例)
リクエストを受け付けてからレスポンスを返すまでに3秒かかる処理があるとする。
3台のクライアントが同時に該当のURIにリクエストを送信した際に、下記のような順番で処理をしてほしい。
- ① クライアント1のリクエストを受け付け・処理を開始
- ② クライアント2のリクエストを受け付け・処理を開始
- ③ クライアント3のリクエストを受け付け・処理を開始
- (3秒の処理)
- ④ ①の処理が完了・レスポンスを返す
- ⑤ ②の処理が完了・レスポンスを返す
- ⑥ ③の処理が完了・レスポンスを返す
前提
Node.js+expressでAPIサーバーを構築しています。
同時リクエストに対して、並列で処理を行いレスポンスを返却したいのですが、上手く実装できず、ご質問させていただきます。
該当のソースコード
JavaScript
1const express = require('express'); 2const app = express(); 3const port = process.env.PORT || 3000; 4 5app.listen(port, () => console.log(`Listening on port ${port}...`)); 6 7app.get('/', (req, res) => { 8 console.log("accept request"); 9 10 let resMsg = ''; 11 12 setTimeout(() => { 13 // 3秒後にレスポンスメッセージが決まり、レスポンスが送信可能 14 resMsg = 'THIS IS RESPONSE MESSAGE'; 15 console.log("send response"); 16 res.send(resMsg); 17 }, 3000); 18})
試したこと
上記コードで起動したサーバーの該当URIとportに同時に3回リクエストを送った際、
3つの処理が同期的に処理され、コンソールログは下記のようになってしまいます。(acceptとsendのログの間に3秒間の間があり、全体で9秒かかっている)
Listening on port 3000... accept request send response accept request send response accept request send response
実現させたい動きは、1番目のレスポンスを送信する前に2番目のリクエストを受け付けるようにすることです。
その場合コンソールログは、下記のようになることを想定しております。(ほぼ同時にacceptログが3回出て3秒後にsendログが3回出力され、全体の処理も3秒程度で完了する)
Listening on port 3000... accept request accept request accept request send response send response send response
Node.jsではノンブロッキングI/O処理によって、大量リクエストの並列処理が可能という情報があり、上記コードで実現できると思っていたのですが上手くいかず、、
そもそもレスポンスを返す前に、同じURIのリクエストを受け付けることが可能なのでしょうか。。
実現方法をご教示いただけますと幸いです。
補足情報(バージョン)
Module | Ver. |
---|---|
Node.js | v14.18.1 |
express | 4.18.2 |




回答2件
あなたの回答
tips
プレビュー