3

サーバーは次のようなメッセージをブロードキャストします。

protected override Task OnReceived(IRequest request, string connectionId, string data)
{
    if (_messagesToSent == 0)
    {
        int.TryParse(data, out _messagesToSent);
    }
    else
        return Task.Delay(0);

    // Broadcast data to all clients
    return new TaskFactory().StartNew(() =>
        {
            _log.InfoFormat("Starting broadcasting of {0} messages.", _messagesToSent);
            int sentMessages = 0;

            if (_messagesToSent > 0)
                Connection.Broadcast(GetInfoMessage());

            while (_messagesToSent > 0)
            {
                Connection.Broadcast(GetDataMessage(sentMessages));
                _messagesToSent--;
                sentMessages++;
                if (sentMessages % 1000 == 0)
                    _log.InfoFormat("{0} messages of total {1} messages sent.", sentMessages,
                                    sentMessages + _messagesToSent);
            }
            _log.InfoFormat("{0} messages were sent.", sentMessages);
        });
}

基本的な考え方は、最初はサーバーがクライアントから送信するメッセージの数を含むメッセージを受信することです。次に、whileループで、この量のメッセージをブロードキャストし、ログを記録します。クライアントもシンプルで、受信したメッセージの数を数え、入力データをログに記録します。

private void ConnectionOnReceived(string s)
{
    ReceivedMessagesCount++;
    _log.Info(s);
}

私はいくつかのテストを行いました:

  • 最大1000のメッセージのブロードキャストは正常に機能し、クライアントはすべてのメッセージを受信します
  • 2000メッセージをブロードキャストし、クライアントは約1500メッセージのみを受信します
  • 10Kメッセージのブロードキャスト、受信した1500〜1600メッセージについての同じこと

サーバーがクラウドサービスでホストされている場合、テストはローカルでAzureを使用して実行されました。

だから、私は何が間違っているのですか?構成やその他の何かを見逃しましたか?

4

1 に答える 1

3

クライアントがメッセージを受信できるよりも速くメッセージを送信しているため、クライアントはメッセージを見逃しています。

1000メッセージ以下がブロードキャストされると、SignalRのDefaultMessageBufferSizeが1000であるため、クライアントはすべてのメッセージを受信します。これは、SignalRを介して変更できますIConfigurationManager。例:

GlobalHost.Configuration.DefaultMessageBufferSize = 2000;

ただし、DefaultMessageBufferSizeクライアントがメッセージを受信できるよりも速くメッセージを継続的に送信すると、任意のサイズのバッファがオーバーランするため、を変更することは単なるバンドエイドです。

実際の解決策は、メッセージを送信する速度を調整することです。PersistentConnectionこのスロットルは、クライアントが受信したメッセージの数を示すACKを定期的に送信することで実現できます。

于 2013-03-17T12:13:20.830 に答える