【问题标题】:ServiceStack RedisServerEvents creating thousands of keysServiceStack RedisServerEvents 创建数千个键
【发布时间】:2017-03-08 15:01:36
【问题描述】:

我正在使用带有 RedisServerEvents 插件的 ServiceStack 来通知连接的客户端数据的变化。我有两个运行 Apache/mod_mono/ServiceStack 的 Linux 虚拟机、一个 Redis 实例和一个 HAProxy 机器。

我注意到的是,尽管目前只有大约 6 个活跃用户在日常测试软件(至少是使用 SSE 的部分),但我的 Redis 实例有数千个以“sse:id. ……”。它们的 TTL 均为 -1。我可以清除 Redis 实例中的所有键,并且键的数量会随着时间的推移慢慢回升。

我想弄清楚的是:这是预期的行为吗?我需要对 ServiceStack 或我的客户采取什么行动吗?

【问题讨论】:

    标签: c# redis servicestack server-sent-events servicestack.redis


    【解决方案1】:

    删除订阅时应该是removing the users subscription info。但是当 AppDomain/Web 应用程序关闭时,它不会清理现有的订阅。我刚刚添加了一个commit,它将在 AppDomain 关闭时尝试清理任何剩余的活动订阅,但如果它没有完全关闭,可能会有剩余的订阅。

    在这种情况下,您可以在启动时调用 Reset() 以清除任何以前的订阅,例如

    container.Register<IServerEvents>(c => 
        new RedisServerEvents(c.Resolve<IRedisClientsManager>()));
    
    container.Resolve<IServerEvents>().Reset();
    

    注意:这需要在任何服务器上存在任何活动订阅之前运行,否则它也会删除它们。

    此更改从 v4.5.7 开始可用,现在为 available on MyGet

    【讨论】:

    • 如果任何服务器事件客户端认为他们有有效的订阅,一旦调用 Reset() 就会遇到异常,这是否合理?
    • @SeanH 不是在调用Reset() 时(它只是默默地删除状态),SSE 客户端在尝试发送心跳时会收到异常。
    • 听起来不错...很容易抓住前任并根据需要重新订阅/创建新的 SSE,在工作时间轻松更新 ;-)
    猜你喜欢
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 2012-10-03
    • 2020-07-08
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多