チャット クライアントとして使用されている SignalR の実装があります。問題は、クライアント側のタイマーがあり、サーバーに ping を実行して他のすべてのクライアントにユーザーのステータスを通知することです。
この例では、ハートビートと最新のアクティビティがあります。ハートビートは約 15 秒ごとにサーバーに到達し、latestactivity はユーザーの対話性を追跡します。これら 2 つの値はサーバーに渡されるため、他のすべてのクライアントは他のすべてのクライアントのステータスを通知できます。つまり、ユーザー A が 1 分以上マウスを動かしていない場合、ハートビートがサーバーに到達すると、SignalR を介して他のすべてのユーザーに、現在「離れている」ことをブロードキャストします。
とにかく、チャット アプリに接続するユーザーの数が増えると、SignalR 接続が指数関数的に増加するように見えるという問題があります。
これは怪しいと思われるクライアント js タイマーのソースですが、その理由はわかりません。
define(['jquery', 'underscore', 'backbone'],
function ($, _, Backbone) {
var Timer = Backbone.Model.extend({
defaults: {
interval: 1 * 10 * 1000,
timeout: null
},
initialize: function (options) {
_.bindAll(this, 'start', 'tick', 'stop', 'tickNow');
if (options.interval) {
this.set('interval', options.interval);
}
},
start: function () {
var timer = setTimeout(this.tick, this.get('interval'));
this.set('timeout', timer);
},
tick: function () {
var self = this;
self.trigger('timerexpired', this);
self.start();
},
tickNow: function () {
var self = this;
self.stop();
self.trigger('timerexpired', this);
self.start();
},
stop: function () {
clearTimeout(this.get('timeout'));
}
});
return Timer;
});