默认情况下,服务器上的环形缓冲区中默认存储有1,000条消息。
对于我来说,发送滞后的客户端1,000个更新对我来说没有任何意义,而只是发送最近的更新。在WCF中,我可以通过使用易失性数据来做到这一点。
我想我可以通过将缓冲区减小为“ 1”来模拟可变方法,但是不确定是否可以基于每个集线器或理想情况下基于每个方法进行配置。
如果我使用集线器或持久连接,这有关系吗?
即使将DefaultMessageBufferSize设置为1,SignalR也会确保每个缓冲区至少容纳32条消息。
最小缓冲区大小的主要目的是确保SignalR的长轮询传输在某种程度上可靠地工作。如果缓冲区大小实际上为1,则通过长轮询连接的客户端很可能会丢失两次轮询之间的消息。
我了解在某些应用程序中,只有最后一条消息很重要。不幸的是,到目前为止,SignalR还没有“易变”的消息传递配置。将缓冲区大小设置为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
});
}
// ...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句