接收 SignalR 回调的奇怪延迟

bin*_*nks 5 c# signalr signalr-hub signalr.client .net-core

我遇到一个奇怪的问题,其中使用 SignalR 发送到多个客户端的回调对于某些客户端来说会延迟。

在此输入图像描述

正如您所看到的,客户端 A 接收回调和客户端 B 接收回调之间有整整 7 秒的延迟。

有一个“主”客户端在计时器结束时执行调用:

                    vm.bettingconnection
                    .invoke("MoveToNextRound", gameId)
                    .catch(function (err) {
                        return console.error(err.toString());
                    });
Run Code Online (Sandbox Code Playgroud)

“vm”是一个 VueJS 对象

var vm = new Vue({
el: '#gamesquares',

data: function () {
    return {
        rawgamedata: [],
        connection: "",
        bettingconnection: "",
        scorepredictShow: true,
        boardShow: false,
        timerShow: false,
        expectationShow: false,
        restseconds: 0,
        roundseconds: 0,
        restsecondsleft: 0,
        roundsecondsleft: 0,
        roundsleft: 0,
        currentround: 0,
        gamemode: 0,
        estimatedpoints: 0,
        scoreindex: 0,
        currentscore: 0,
        targetscore: 0
    };
},
Run Code Online (Sandbox Code Playgroud)

被调用的端点的逻辑非常简单:

        public async Task MoveToNextRound(Guid gameId)
    {
        int roundNumber = _gameAdministration.NextRound(gameId);
        //need a try catch      //game not found

        await Clients.Groups(gameId.ToString()).MovedToNextRound(roundNumber);
    }
Run Code Online (Sandbox Code Playgroud)

NextRound里面就是这个(也很简单)

        public int NextRound(Guid gameId)
    {
        int roundNumber = _cache.Get<int>(gameId.ToString() + "-roundnumber");
        roundNumber++;
        _cache.Set(gameId.ToString() + "-roundnumber", roundNumber);
        return roundNumber;
    }
Run Code Online (Sandbox Code Playgroud)

所以这就是我认为问题所在的地方:

await Clients.Groups(gameId.ToString()).MovedToNextRound(roundNumber);
Run Code Online (Sandbox Code Playgroud)

为什么回调需要一段时间才能到达某些客户端?

Yun*_*iza 0

调用回调的代码似乎没有任何问题。回调结果将被返回,然后将结果发送给指定组内的客户端。

如果所有客户端都在同一台计算机上,则延迟可能是由于资源争用造成的。

如果客户端位于不同的计算机上/属于不同类型的客户端,您可能需要检查每个客户端用于接收消息的协议。

无论如何,您应该使用 SignalR 诊断日志记录来收集有关此处到底出了什么问题的更多信息。有关如何执行此操作的详细信息,请访问:https://learn.microsoft.com/en-us/aspnet/core/signalr/diagnostics ?view=aspnetcore-7.0