【问题标题】:SignalR not working when client behind a high latency connection当客户端落后于高延迟连接时 SignalR 不工作
【发布时间】:2014-10-24 12:46:05
【问题描述】:

我正在编写一个严重依赖 SignalR 的应用程序。最近,我不得不与卫星 ISP 提供商合作。这带来了一个大问题,卫星的 700 毫秒延迟似乎给 SignalR 带来了困难。我可以使用延迟约为 50 毫秒的 4G 网络进行测试,并且在那里一切正常。我打开了客户端跟踪,问题出在它尝试加入集线器时。

这是服务器上 Join 方法的代码:

public Task Join(string groupName) { var hub = GlobalHost.ConnectionManager.GetHubContext("myHub"); var results = hub.Groups.Add(Context.ConnectionId, groupName); return results; }

在日志中,我看到:

[23:41:14 GMT-0400 (Eastern Daylight Time)] SignalR: Client subscribed to hub 'myHub'. jquery.signalR-2.1.1.min.js:8
[23:41:14 GMT-0400 (Eastern Daylight Time)] SignalR: Negotiating with '/signalr/negotiate?clientProtocol=1.4&connectionData=%5B%7B%22name%22%3A%22myHub%22%7D%5D'. jquery.signalR-2.1.1.min.js:8
[23:41:15 GMT-0400 (Eastern Daylight Time)] SignalR: Connecting to websocket endpoint 'ws://myurl/signalr/connect?transport=webSockets&clientProtocol=1.4&connectionToken=myToken&connectionData=%5B%7B%22name%22%3A%22myHub%22%7D%5D&tid=10'. jquery.signalR-2.1.1.min.js:8
[23:41:30 GMT-0400 (Eastern Daylight Time)] SignalR: Websocket opened. jquery.signalR-2.1.1.min.js:8
[23:41:30 GMT-0400 (Eastern Daylight Time)] SignalR: webSockets transport selected. Initiating start request. jquery.signalR-2.1.1.min.js:8
[23:41:31 GMT-0400 (Eastern Daylight Time)] SignalR: The start request succeeded. Transitioning to the connected state. jquery.signalR-2.1.1.min.js:8
[23:41:31 GMT-0400 (Eastern Daylight Time)] SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332 and a connection lost timeout of 20000. jquery.signalR-2.1.1.min.js:8
[23:41:31 GMT-0400 (Eastern Daylight Time)] SignalR: Invoking myHub.Join jquery.signalR-2.1.1.min.js:8
[23:41:31 GMT-0400 (Eastern Daylight Time)] SignalR: Invoking myHub.Join

它停在那里。当我尝试使用 4G 连接(即低延迟)时,我得到回调日志:

[23:41:31 GMT-0400 (Eastern Daylight Time)] SignalR: Invoked myHub.Join jquery.signalR-2.1.1.min.js:8
[23:41:31 GMT-0400 (Eastern Daylight Time)] SignalR: Invoked.myHub.Join

我正在利用 Azure 服务总线来处理消息传递部分。

有人知道吗?尝试使用 Signalr 配置设置,但没有成功。

它对我不起作用这一事实并不是什么大问题,我对 VPN 也有同样的问题,但我有一种感觉,如果我找不到解决方法,我会让很多用户失望。 .. 就像来自印度的用户,那里的延迟更高..

【问题讨论】:

  • 您的两个日志显示相同的最后两行。卫星 abd 4G 连接有什么区别?日志没有显示任何错误。
  • 4G 上额外的 2 行显示调用与调用.. 回调正在记录它们。我没有收到任何错误...当客户端在高延迟连接(卫星)上加入集线器时,回调没有启动,这就是为什么我在日志中看不到“调用”消息的原因。与 4g 的区别在于它具有 50 毫秒的低延迟,而卫星则为 700 毫秒。这只是为了证明信号器在低延迟连接后面工作,但它似乎不适用于高延迟连接。因为客户端无法加入集线器,所以它没有收到任何信号器消息。

标签: azure websocket signalr latency


【解决方案1】:

在进行了更多挖掘之后,我发现问题出在 websockets 传输上。我启发了自己这个post 并提出以下建议:

var latency = ping();
console.log('latency: ' + latency);

if (latency > 500) {
   $.connection.hub.start({ transport: ['foreverFrame', 'serverSentEvents', 'longPolling'] }).done(StartHub);
} else {
    $.connection.hub.start().done(StartHub);
}

这是 ping 的代码,灵感来自 post

function ping() {
var data;
var startTime;
$.ajax({
    url: 'ping.html?v=' + Math.random(), //ping.html is a dummy html page
    async: false,
    beforeSend: function () {
        startTime = new Date();
    },
    complete: function (jqXHR, textStatus) {
        data = (new Date()) - startTime;
    }
});
return data;

}

这允许触发回调,即我现在在日志中看到“调用”。但是,我时不时会超时。

将 Signalr 设置更改为:

GlobalHost.Configuration.TransportConnectTimeout = TimeSpan.FromMinutes(5);
GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromMinutes(5);
GlobalHost.Configuration.KeepAlive = null;

我会对上面的内容进行微调,但现在已经成功了。

我还需要做更多的测试,但看起来很有希望。当我使用 4G 连接时,它使用 websockets,当我使用卫星连接时,它使用其他 3 个。

不确定这是否是最佳解决方案,但它肯定适合我的需求。我想知道当 SignalR 代码决定使用哪种传输方式时,是否应该将类似的内容放入其中。可能有更好的方法来找到延迟,但这个概念就在那里。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多