- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我们想在我们的应用程序和服务之间共享 ASP.NET session 状态。我们选择了 Elasticache/redis 来实现这一点。一切顺利,但我们遇到了僵局。
这是死锁序列:
RedisSessionStateProvider
,在几毫秒内成功获取 SessionHttpWebRequest
,并附加了 ASP.NET_SessionId cookieRedisSessionStateProvider
,它尝试从同一个 Redis 实例中获取 Session,并在约 2 分钟后超时大概 App 1 的 RedisSessionStateProvider
在包含 session 的缓存项上持有(写?)锁。正如您从我的说法中可以看出的那样,我不是 Redis 专家...
AFAICT Elasticache 无法让您了解此类情况,只能提供性能图表。而且 RedisSessionStateProvider
是闭源的,所以我不能在那里闲逛。
我还尝试让 RedisSessionStateProvider
记录(通过 loggingClassName
参数)但是 App 1 或 App 2 没有写入任何内容(我的 Log()
方法被调用了)。
为了证明这是 RedisSessionStateProvider
死锁(而不是我们自己的代码死锁),我将 App 1 切换回使用 InProc session ,一切运行正常。
有人有什么建议吗?顺便说一句,我们的 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>
最佳答案
This is not answer but it is not fitting in comment section.
在页面 asp.net 页面执行生命周期的开始,它调用 GetItemExclusive,它从存储(在本例中为 redis)获取 session 并锁定该 session ,以便其他并行请求无法在此请求工作时修改 session 。此锁定超时等同于您可以使用 web.config 设置的请求超时,如下所示。
<configuration>
<system.web>
<httpRuntime executionTimeout="10"/>
</system.web>
</configuration>
现在,页面执行并根据天气情况在 session 中修改或未修改任何内容,它调用 SetAndReleaseItemExclusive 或 ReleaseItemExclusive 来释放锁定。如果此请求由于某种原因失败,它将根据 retryTimeoutInMilliseconds 值重试。如果 retryTimeoutInMilliseconds 非常小于或等于 operationTimeoutInMilliseconds 那么它可能根本不会重试。如果 SetAndReleaseItemExclusive 或 ReleaseItemExclusive 未成功完成,那么基本上您的 session 将被锁定以完成您在上面设置的“executionTimeout”时间(以秒为单位)。所有其他请求都将被阻止,并且在锁定时将无法访问该 session 。锁到期后会自动释放。
使用 web.config 属性 loggingClassName 和 loggingMethodName 来配置日志记录。当您升级到上述包时,您可以在 web.config 注释中找到更多详细信息。您基本上可以提供一个返回 TextWriter 的公共(public)静态方法。 session 状态提供程序和 StackExchange.Redis.StrongName 都将使用此 TextWriter 对象来记录详细信息。
这将帮助我们获得有关问题的更多详细信息。请注意,启用日志记录会降低性能。
使用日志的例子:
namespace SSPWebAppLatest3
{
public static class Logger
{
public static TextWriter GetLogger()
{
return File.CreateText("C:\\Logger.txt");
}
}
}
网络配置:
<add name="MySessionStateStore" type="Microsoft.Web.Redis.RedisSessionStateProvider" host="127.0.0.1" accessKey="" ssl="false"
loggingClassName="Logger, SSPWebAppLatest3, Version=1.0.0.0, Culture=neutral ……."
loggingMethodName="GetLogger"/>
请给我一个可重现的测试应用程序,我用它来进一步调试它。您也可以这样做,因为 session 状态和输出缓存提供程序代码现在是开源的。 ( https://github.com/Azure/aspnet-redis-providers )
关于asp.net - RedisSessionStateProvider 弹性缓存死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30082609/
我正在开发一个 ASP.NET MVC 应用程序 (targetFramework 4.5),它允许用户使用自定义身份验证以及使用他们的 Twitter 帐户登录站点。以下库已被引用 微软.Owin
我们想在我们的应用程序和服务之间共享 ASP.NET session 状态。我们选择了 Elasticache/redis 来实现这一点。一切顺利,但我们遇到了僵局。 这是死锁序列: 用户导航到 Ap
我正在使用 Microsoft.Web.RedisSessionStateProvider 在 Redis 上存储 session 信息。 配置文件如下 " [String] logg
我正在尝试使用 RedisSessionStateProvider 进行 protobuf 序列化。我已将 redisSerializerType 指定为实现 Microsoft.Web.Redis.
当我在本地运行 Microsoft.Web.Redis.RedisSessionStateProvider 时,出现以下错误: StackExchange.Redis.RedisServerExcep
我想将 Microsoft.Web.RedisSessionStateProvider 用作 asp.net 应用程序的 session 缓存提供程序。我必须在我的应用程序中使用一些混淆的库。添加它们
在我的 Azure ASP.NET MVC 网站中,我想显示有多少客户端连接到 Redis session 状态提供程序以及它们处于事件状态的时间。我使用 Azure Github 上的 aspnet
我正在使用RedisSessionStateProvider使用 asp.net mvc 4.5 进行 session 管理。我正在使用 azure web 应用程序进行托管。在产品部署期间,如何在
我想使用在一台服务器中从另一台服务器创建的 session 。这意味着我需要使用 RedisSessionStateProvider 的 session 状态自定义模式在托管在 2 个不同服务器中的两
问题 未在 Razor View 中检索 session 值并导致逻辑错误。 环境 Redis sentinel 和 web 服务器上的 sentinel 但只有一个 redis master 和一个
我创建一个 MVC 示例应用程序使用 RedisSessionStateProvider作为自定义 session 状态。我将一个变量设置为 session 状态,效果很好。但是我不知道如何同步 se
如果您使用 RedisSessionStateProvider存储你的 session 状态,它什么时候从 Redis 发送/读取信息?来自 this GitHub question ,听起来反序列化
我在我的应用程序中使用 Owin OpenIdConnectAuthentication 模块,并尝试将我的 session 状态移动到 Redis。为此,我正在使用 Microsoft.Web.Re
我是一名优秀的程序员,十分优秀!