2

我使用ServiceStack和RedisServerEvents插件来通知连接的客户端数据更改。我有两台运行Apache/mod_mono/ServiceStack的Linux虚拟机,一个Redis实例和一台HAProxy机器。ServiceStack RedisServerEvents创建数千个密钥

我注意到的一点是,尽管目前每天测试软件时至少有6个活跃用户(至少是使用SSE的部分),但我的Redis实例有数千个以“sse:id”开头的密钥...“。他们都有TTL为-1。我可以清除Redis实例中的所有密钥,随着时间的推移,密钥的数量将慢慢恢复。

我想弄清楚的是:这是预期的行为?有没有需要采取ServiceStack或我的客户采取一些行动?

回答

1

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

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

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

container.Resolve<IServerEvents>().Reset(); 

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

此更改从v4.5.7开始支持,现在是available on MyGet

+0

假设任何认为自己拥有有效订阅的服务器事件客户端在调用Reset()后都会遇到异常,这是否合理? – SeanH

+0

@SeanH当调用Reset()时(它只是静默地移除状态)时,不会发生SSE客户端在尝试发送心跳时收到异常。 – mythz

+0

听起来不错...足够容易赶上前和重新订阅/创建一个新的SSE根据需要,在工作时间使更新无痛苦;-) – SeanH