默认情况下,服务器上的环形缓冲区中默认存储1,000条消息。
向我发送落后的客户端1,000次更新,而不仅仅是最近的更新,这对我来说没有意义。在WCF中,我可以通过使用volatile数据来完成此操作。
我想我可以通过将缓冲区减少到" 1"来模拟易失性方法,但不确定是否可以基于每个集线器配置,或者理想情况下,基于每个方法。
如果我使用集线器或持久连接是否重要?
答案 0 :(得分:4)
即使您将DefaultMessageBufferSize设置为1,SignalR也会确保每个缓冲区至少包含32条消息。
此最小缓冲区大小的主要目的是确保SignalR的长轮询传输在某种程度上可靠地工作。如果缓冲区大小实际为1,则通过长轮询连接的客户端很可能会错过轮询之间的消息。
据我所知,有些应用程序仅最后一条消息很重要。不幸的是,截至目前,SignalR没有" volitile"消息配置。将缓冲区大小设置为32几乎与它一样好。至少客户端不应该用那么小的缓冲区大小落后太多。
假设有多个缓冲区是正确的,但无法单独配置缓冲区大小。 SignalR为每个"信号"创建一个环形缓冲区。 A"信号"可以是连接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
});
}
// ...