gpt4 book ai didi

redis - StackExchange.Redis API : ListLeftPopAsync is taking infinite time or timing out

转载 作者:可可西里 更新时间:2023-11-01 11:32:00 26 4
gpt4 key购买 nike

我们正在使用 Redis 列表来维护要由我们的 C# 应用程序处理的项目队列。该应用程序使用 StackExchange.Redis 1.0.488(又名 SER)连接到 Redis 并通过调用 ListRightPushAsync 和 ListLeftPopAsync SER API 使用列表。

我们主要验证一​​个场景,即当 Redis 服务器不可用时我们的应用程序将如何运行。

在应用程序忙于处理队列时重新启动 Redis 服务器后,我们发现了一个问题。在我们看到一个问题之后,应用程序恢复处理一定数量的项目,其中 ListLeftPopAsync 花费无限时间并且应用程序挂起,没有任何异常。请注意,正在处理的负载应用程序数量很高,比如 100000 个项目。下面是代码片段。

消费者层:

    public async Task<byte[]> DiscardProcessedItem()
{
var result = await ListLeftPopAsync(2, "2:l:queue1");
return result;
}

SER API 包装器:

    public Task<byte[]> ListLeftPopAsync(int redisDb, string key)
{
var task = conn.GetDatabase(redisDb).ListLeftPopAsync(key);
return Task.FromResult<byte[]>(task.Result);
}

注意 syncTimeout 是 5000。

然后我们尝试通过如下修改包装函数来使用同步 SER API

    public byte[] ListLeftPopAsync(int redisDb, string key)
{
return conn.GetDatabase(redisDb).ListLeftPop(key);
}

此更改后,应用程序不会挂起,并且会处理整个队列。但是 StackExchange.Redis 在对少数项目执行 ListLeftPop 时抛出超时异常。异常粘贴在下面。

Timeout performing LPOP 2:l:queue1, inst: 1, mgr: ProcessReadQueue, err: never, queue: 6, qu: 0, qs: 6, qc: 0, wr: 0, wq: 0, in: 260, ar: 1, IOCP: (Busy=0,Free=1000,Min=4,Max=1000), WORKER: (Busy=0,Free=2047,Min=4,Max=2047), clientName: MYPC

任何线索将不胜感激。

最佳答案

增加同步超时或使用堆栈交换库提供的一些异步机制。

 ConfigurationOptions co = new ConfigurationOptions()
{
SyncTimeout = 500000,
EndPoints =
{
{url,portNumber }
},
AbortOnConnectFail = false // this prevents that error
};

seClient = ConnectionMultiplexer.Connect(co);

这也可能发生在您使用旧版本的客户端

关于redis - StackExchange.Redis API : ListLeftPopAsync is taking infinite time or timing out,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39387637/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com