gpt4 book ai didi

c# - 客户端在短时间内发送太多消息时丢失消息

转载 作者:行者123 更新时间:2023-11-30 16:19:06 25 4
gpt4 key购买 nike

服务器广播如下消息:

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 执行的。

那么,我做错了什么?我是否遗漏了配置中的某些内容或其他内容?

最佳答案

您发送消息的速度比您的客户接收消息的速度快,导致您的客户错过消息。

当广播的消息不超过 1000 条时,您的客户端会收到所有消息,因为 SignalR 的 DefaultMessageBufferSize 为 1000。这可以通过 SignalR 的 IConfigurationManager 进行更改,例如:

GlobalHost.Configuration.DefaultMessageBufferSize = 2000;

但是,更改 DefaultMessageBufferSize 只是一个创可贴,因为如果您连续发送消息的速度超过客户端接收消息的速度,您将超出任何大小的缓冲区。

真正的解决方案是限制您发送消息的速度。这种节流可以通过让您的客户端定期将 ACK 发送回您的 PersistentConnection 来实现,指示它已收到多少消息。

关于c# - 客户端在短时间内发送太多消息时丢失消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15460303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com