2017-08-06 27 views
-1

私はノード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のリクエストを処理できなければなりません。

+0

。なぜあなたは 'User.find({username、password})'をやっていないのでしょうか?これは単純なもので、本当に大きなシステムではどうやってやっているのでしょうか?それは、**あなたがジャグリングしようとしているいくつかの呼び出しとは対照的に、**ただ一つの呼び出し**なのでです。 –

+0

ああ...あなたは正しいです、ありがとう。私はこのコードを最適化します – Sekki

+0

Hum ...プレゼンテーション用のコードを更新しました。実際には、bcryptを使ってパスワードをハッシュしていますので、(パスワードを比較するために)2度目の呼び出しでデータベースへの呼び出しが行われませんでした。 – Sekki

答えて

0

多分、コードを洗練して、応答処理を速くすることができます。しかし、重い計算のためにノンブロッキングな方法が必要な場合は、'napajs'を試すことができます。これは、同じプロセスでマルチスレッドJavaScriptシナリオを有効にするためにNode.jsを使用できるMicrosoftによってリリースされたものです。あなたの参照のためのquick introductionはここにあります。

あなたのコードは次のようになります。このコードは意味をなさない

var napa = require('napajs'); 

// One-time setup. 
// You can change number of workers per your requirement. 
var zone = napa.zone.create('response-builders', { workers: 4 }); 

function serveRequest() { 
    var request = null; 

    // Get request from queue. 
    // ... 

    zone.execute(() => { 
     // Build the response here 
     return response; 
    }, [request]).then((result) => { 
     // respond to user 
     console.log(result.value); 
    }); 
} 
+0

回答ありがとうございましたが、特定の条件で増分と更新を行った後にデータを確認するような、多くのトリックで問題を解決することができました。 – Sekki

関連する問題