我可以将循环缓冲区减少到“1”吗?这是一个好主意吗?

时间:2014-08-12 11:31:55

标签: signalr signalr-hub signalr.client

默认情况下,服务器上的环形缓冲区中默认存储1,000条消息。

向我发送落后的客户端1,000次更新,而不仅仅是最近的更新,这对我来说没有意义。在WCF中,我可以通过使用volatile数据来完成此操作。

我想我可以通过将缓冲区减少到" 1"来模拟易失性方法,但不确定是否可以基于每个集线器配置,或者理想情况下,基于每个方法。

如果我使用集线器或持久连接是否重要?

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
    });
}

// ...