【问题标题】:Can I reduce the Circular Buffer to "1"? Is that a good idea?我可以将循环缓冲区减少到“1”吗?这是一个好主意吗?
【发布时间】:2014-08-12 11:31:54
【问题描述】:

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

向滞后的客户端发送 1,000 次更新对我来说没有意义,而只是发送最近的更新。在 WCF 中,我可以通过使用易失性数据来做到这一点。

我想我可以通过将缓冲区减少到“1”来模拟一种不稳定的方法,但不确定这是否可以基于每个集线器进行配置,或者理想情况下,可以基于每个方法进行配置。

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

【问题讨论】:

    标签: signalr signalr-hub signalr.client


    【解决方案1】:

    即使您将 DefaultMessageBufferSize 设置为 1,SignalR 也能确保每个缓冲区至少容纳 32 条消息。

    此最小缓冲区大小的主要目的是确保 SignalR 的长轮询传输在某种程度上可靠地工作。如果缓冲区大小实际上为 1,则通过长轮询连接的客户端很可能会在轮询之间丢失消息。

    我知道有些应用程序只有最后一条消息很重要。不幸的是,到目前为止,SignalR 没有“易变”的消息传递配置。将缓冲区大小设置为 32 差不多就可以了。至少客户端不应该在这么小的缓冲区中落后太多。

    假设有多个缓冲区是正确的,但缓冲区大小不能单独配置。 SignalR 为每个“信号”创建一个环形缓冲区。 “信号”可以是连接 ID、组名、用户名、PersistentConnection 名称(当您调用 Connection.Broadcast 时)和 Hub 名称(当您调用 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
        });
    }
    
    // ...
    

    【讨论】:

    • 如何根据每个信号进行配置?
    • 您不能为每个信号配置缓冲区大小。充其量,您可以使用不同的DefaultMessageBufferSizes 映射两个 SignalR 端点,但这需要每个客户端额外的并发连接。
    • 好的,我将尝试配置两个端点。我假设我可以在同一台机器上做到这一点。 GlobalHost.Configuration.DefaultMessageBufferSize 是单身人士吗?如何在同一台机器上配置其他端点?
    • GlobalHost.Configuration 实现为return GlobalHost.DependencyResolver.Resolve&lt;IConfigurationManager&gt;()。如果您通过 HubConfiguration 传入自己的解析器,则不会使用 GlobalHost。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多