我可以将循环缓冲区减少到&qot;1(&q;)吗?这是个好主意吗? [英] Can I reduce the Circular Buffer to "1"? Is that a good idea?
本文介绍了我可以将循环缓冲区减少到&qot;1(&q;)吗?这是个好主意吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
默认情况下,服务器的环形缓冲区中默认存储1,000条消息。
我向滞后的客户端发送1000个更新是没有意义的,而只发送最新的更新。在WCF中,我可以通过使用易失性数据来做到这一点。
我想我可以通过将缓冲区减少到"1"来模拟易失性方法,但是不确定这是否可以在每个集线器的基础上进行配置,或者理想情况下是在每个方法的基础上进行配置。
对此使用集线器还是持久连接重要吗?
推荐答案
即使将DefaultMessageBufferSize设置为1,SignalR也可确保每个缓冲区至少容纳32条消息。
此最小缓冲区大小的主要目的是确保SignalR的长轮询传输在某种程度上可靠地工作。如果缓冲区大小实际为1,则通过长轮询连接的客户端很可能在轮询之间丢失消息。我知道在某些应用程序中,只有最后一条消息很重要。不幸的是,到目前为止,SignalR还没有"Volitile"消息传递配置。将缓冲区大小设置为32差不多就是最好的结果。至少客户端不应该落后那么小的缓冲区大小太多。
您假设有多个缓冲区是正确的,但是不能单独配置缓冲区大小。SignalR为每个"信号"创建一个环形缓冲区。"信号"可以是连接ID、组名、用户名、PersistentConnection名称(在调用Connection.Broadcast时)和集线器名称(在调用Clients.All
时)。如果在单个集线器的多个方法中使用Clients.All
,则所有这些调用都将在单个缓冲区中结束。
编辑: 如果要在同一应用程序中使用不同设置配置另一个SignalR端点,可以执行以下操作:
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Configuration;
using Owin;
// ...
public void Configuration(IAppBuilder app)
{
// The following will setup a SignalR endpoint at "/signalr"
// using settings from GlobalHost
app.MapSignalR();
var resolver = new DefaultDependencyResolver();
var configuration = resolver.Resolve<IConfigurationManager>();
configuration.DefaultMessageBufferSize = 32;
// By specifying or own dependency resolver, we tell the
// "/volatile" endpoint not to use settings from GlobalHost
app.MapSignalR("/volatile", new HubConfiguration
{
Resolver = resolver
});
}
// ...
这篇关于我可以将循环缓冲区减少到&qot;1(&q;)吗?这是个好主意吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文