2016-04-02 11 views
4

私はexpress.jsとsocket.ioをリアルタイムプッシュ通知システムに一緒に使用しています。私はサーバー側で使用しているいくつかのコード行を共有します。express.jsとsocket.ioを使用してプッシュ通知システムを構築する最善の方法

var app = express(); 
var server = require('http').Server(app); 
var io = require('socket.io')(server); 
server.listen(appconfig.webPort, function() { 
    console.log('server runing at ' + appconfig.webPort); 
}); 

io.on('connection', function(socket) { 
    var id = setInterval(function() { 
    some database logic here to get data from database 
     socket.emit(data); 
    }, 5000); 
}); 

私の質問はこのコードはサーバー上の負荷を増やしますか?私は数秒ごとにデータベースからデータを取得します。 それが有害である場合、同じことをする最善の方法は何ですか。

答えて

1

このコードはサーバーの負荷を上げますか?私は数秒ごとにデータベースから のデータを取得します。それが有害であれば、同じことをする最善の方法は です。

もちろん、負荷が増加します。サーバーに行われたすべてのsocket.io接続に対して、別の5秒間隔タイマーを開始し、タイマーが起動するたびに1つ以上のデータベース照会を実行してから、その結果をそのクライアントに送信しています。

クライアントが50台接続されている場合、これらのクエリは100ms(5000/50)ごとに実行されます。クライアントが1000台接続されている場合、平均間隔は5msごとです。あなたのデータベースをかなり忙しく保つだけでなく、あなたのサーバーもかなり忙しいでしょう。何千ものクライアントが接続していた場合、スケーリングは急速に悪化します。

すべてのクライアントで同じデータを取得している場合は、これを行う方法を変更する必要があります。 5秒ごとに1つのクエリをデータベースに作成し、すべてのクライアントに同じ結果を送信します。それははるかに優れています。

データベースをポーリングするのを避けて、何らかの種類のイベントトリガーを使用して変更を検出することができれば、通常はさらに効果的です。

+0

ありがとうございますが、データはすべてのユーザーまたはクライアントで異なります。 \ – Meesam

+1

@Meesam - 重要な点は、サーバー上に通知システムを作成して、特定のユーザーに関連するイベントが発生したときだけであることです。そのユーザーに送信され、何もデータベースを定期的にポーリングしません。どのようにするかは、アプリケーション、データストレージ構造、特定の適時性要件、およびその他のアーキテクチャ上の事項に大きく依存します。場合によっては、ポーリングなしで適切な種類の通知をサポートするようにバックエンドストレージを設計する必要があります。時間の99%がスケーラビリティを奪うものが見つからない場合、定期的にポーリングを行っています。 – jfriend00

+0

:もし私が間違っていないならば、あなたは2種類のポリシングを作成するように頼んでいます.1つは通知専用で、もう1つはアプリケーションのfucationalityです。 – Meesam

関連する問題