我可以将循环缓冲区减少到&qot;1(&q;)吗?这是个好主意吗? [英] Can I reduce the Circular Buffer to "1"? Is that a good idea?

查看:19
本文介绍了我可以将循环缓冲区减少到&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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆