我們希望在我們的應用程序和服務之間共享ASP.NET會話狀態。我們選擇了Elasticache/redis來實現這一點。它進展順利,但我們遇到了一個僵局。RedisSessionStateProvider Elasticache死鎖
這裏的僵局序列:
- 用戶導航到
- 應用1使用
RedisSessionStateProvider
病死豬1提供的頁面,成功地獲取在幾毫秒內會話 - 應用程序1,使一個
HttpWebRequest
到App 2 ,連接了ASP.NET_SessionId cookie - 應用2還使用
RedisSessionStateProvider
,它嘗試從相同的redis實例中獲取Session並在〜2分鐘後超時
推測應用程序1的RedisSessionStateProvider
在包含會話的緩存項目上持有(寫入?)鎖定。正如你從我的說法,你可以告訴我,我不是redis大師...
AFAICT Elasticache讓你沒有看到像這樣的情況,只是表現y圖。而且RedisSessionStateProvider
是封閉的,所以我不能在那裏捅。
我也試着讓RedisSessionStateProvider
登錄(通過loggingClassName
參數),但沒有任何應用程序1或應用程序2寫入(我的Log()
方法被稱爲雖然)。
爲了證明它是RedisSessionStateProvider
死鎖(而不是我們自己的代碼死鎖),我將App 1切換回使用InProc會話,並且一切運行良好。
有沒有人有任何建議?順便說一句,我們的Session數據是所有意圖和目的都是不變的,所以實際上並不需要它被鎖定。
非常感謝, 皮特
編輯:根據要求將sessionState配置。請注意,大的operationTimeoutInMilliseconds
值是爲了在調試應用程序時不會出現異常。這將在生產中更改爲約5000。
<sessionState mode="Custom" customProvider="RedisSessionProvider">
<providers>
<add name="RedisSessionProvider"
type="Microsoft.Web.Redis.RedisSessionStateProvider"
host = "ec2-184-73-3-249.compute-1.amazonaws.com"
port = "6379"
ssl = "false"
throwOnError = "true"
retryTimeoutInMilliseconds = "2000"
applicationName = "PE"
connectionTimeoutInMilliseconds = "2000"
operationTimeoutInMilliseconds = "1800000"
</providers>
</sessionState>
剛剛嘗試https://github.com/welegan/RedisSessionProvider,它沒有把/任何東西放到redis上。任何人看到這個? – sming
你能否提供app1和app2的web.config設置? –
@SiddharthChatrola他們太久無法發佈。你只想要部分? –
sming