Nic*_*aef 4 c# redis stackexchange.redis azure-redis-cache .net-core
我们在 .NET Core 3.1 与 Azure Redis 缓存的集成中遇到了问题。抛出的异常是
执行请求时发生未处理的异常。","@l":"错误","@x":"StackExchange.Redis.RedisTimeoutException: 等待响应超时(出站 = 1403KiB,入站 = 5657KiB,已过去 15000 毫秒,超时为15000ms),command=EVAL,下一个:EVAL,inst:0,qu:0,qs:709,aw:True,rs:ReadAsync,ws:写入,in:0,serverEndpoint:redis-scr-mns-dev.redis .cache.windows.net:6380,mc:1/1/0,mgr:10 个可用,共 10 个可用,clientName:xxxxxxxxxxxx,IOCP:(忙碌 = 0,空闲 = 1000,最小 = 4,最大 = 1000),工作人员: (Busy=7,Free=32760,Min=4,Max=32767), v: 2.1.58.34321(请查看这篇文章,了解一些可能导致超时的常见客户端问题: https://stackexchange.github .io/StackExchange.Redis/超时)
是的,我已经阅读了这篇文章,我们正在使用 StackExchange.Redis NuGet 包,最新版本可用。我们已经采取的步骤是
你问的设置是什么?
一个批处理进程正在运行并处理几个 10000 个 API 调用(多个 API),其中上述调用因超时异常而导致 Redis 缓存崩溃。其他 api 运行正确并且没有超时,但当前正在连接到不同的 Redis 缓存(只是为了隔离此 api 的行为)所有 api 和/或批处理程序都使用具有缓存实现的自定义 NuGet 包,因此我们确保这不是 1 个 api(所有共享代码)中的实现问题。
我们如何使用缓存呢?好吧,通过依赖注入,我们注入 ISharedCacheStore,这只是我们自己的接口,我们放在 IDistributedCache 之上,以确保只有异步调用可用,以及 RedisCache,这是使用 Redis 的实现(ISharedCacheStore 供将来使用其他缓存机制)我们使用Microsoft.Extensions.Caching.StackExchangeRedis,版本 3.1.5,启动时的注册是
services.Configure<CacheConfiguration>(options => configuration?.GetSection("CacheConfiguration").Bind(options))
.AddStackExchangeRedisCache(s =>
{
s.Configuration = connectionString;
})
.AddTransient<IRedisCache, RedisCache>()
.AddTransient<ISharedCacheStore, SharedCacheStore>();
Run Code Online (Sandbox Code Playgroud)
老实说,我们没有想法。我们没有发现 Azure 中的 Redis 缓存实例存在问题,因为当我们遇到超时时,该实例甚至还没有接近顶部。较低定价计划的服务器负载达到约 80%,而较高定价计划的服务器负载甚至未达到当前计划的 10%。
根据 Insights 的说法,我们运行时每分钟有 4000 次缓存命中,导致大约 10% 的服务器负载。
更新:值得一提的是,批处理和 API 目前在本地环境中运行,而不是在云中。计划在未来几个月内迁移到云。这也适用于其他 api 连接到 Redis 缓存并且不会出现问题
比较
这里有几种可能的情况:
EVAL
是做什么的;可能是正在执行的 Lua 导致了阻塞;唯一确定的方法是查看SLOWLOG
,但我不知道这是否在 Azure redis 上公开我不认为这里有一个简单的“添加这一行,一切都变得很棒”的答案。这些都是重要的大规模远程场景,需要进行大量调查。简单地说:Azure 人员不会为我们的时间付费。
归档时间: |
|
查看次数: |
3246 次 |
最近记录: |