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