私はノードjsでアプリケーションを構築しています。このアプリケーションは、ユーザーからリクエストを受け、mongodbを読み込んで特定のユーザーデータを更新してから、この特定のユーザーに対して別の要求を行います。私はこのコードを使用してこの非同期キューを行うことができました:ノードjs非同期キューとマルチスレッド
//Create a queue with concurrency of 1
var tasksQueue = async.queue(function (userInfo, callback) {
User.verifyAndUpdateAccount(userInfo, callback)
}, 1);
router.post('/', function (req, res, next) {
res.setHeader('Content-Type', 'application/json');
//Is required datas present?
if (!req.body.username || !req.body.password) {
return res.send(null);
}
var username = req.body.username;
var password = req.body.password;
//Verify account informations and update them
tasksQueue.push({username: username, password:password}, function (err,
updatedUser) {
if (err == 'NO_MORE_REQUESTS_ALLOW') {
// S'il ne lui reste plus de sms
return res.send({
code: 400,
message: 'NO_MORE_REQUESTS_ALLOW'
})
} else if (err) throw err;
//**********************************************************
// Build the response here and respond to user requests
})
問題は、それは私がモジュールcluster.jsを使用する場合、各スレッドは自分のキューを持っているので、うまく動作しないと気にしないということです他のスレッドについて私のアプリは次のように動作します:
user1が2つのリクエストを行った後、そのuser2が1リクエストをしたとします。私は4つのコアを持っていると仮定し、最初のスレッドがuser1の最初の要求を処理し始め、すべてのスレッドがuser1の最初の要求が処理されてから2番目の要求を処理するまで待ちます。しかし、他のスレッドは、1リクエストがmongodb内の1人のユーザのデータのみを更新し、他のユーザに影響を与えないので、待つ必要はないため、user1の最初のリクエストが処理される前にuser2のリクエストを処理できなければなりません。
。なぜあなたは 'User.find({username、password})'をやっていないのでしょうか?これは単純なもので、本当に大きなシステムではどうやってやっているのでしょうか?それは、**あなたがジャグリングしようとしているいくつかの呼び出しとは対照的に、**ただ一つの呼び出し**なのでです。 –
ああ...あなたは正しいです、ありがとう。私はこのコードを最適化します – Sekki
Hum ...プレゼンテーション用のコードを更新しました。実際には、bcryptを使ってパスワードをハッシュしていますので、(パスワードを比較するために)2度目の呼び出しでデータベースへの呼び出しが行われませんでした。 – Sekki