我们使用Redis列表来维护要由我们的C#应用程序处理的项目队列。应用程序使用StackExchange.Redis 1.0.488 (也称为SER)连接到Redis,并通过调用ListRightPushAsync和ListLeftPopAsync SER来处理列表。
我们主要是在验证一个场景,即当redis服务器不可用时,我们的应用程序将如何运行。
在应用程序忙于处理队列时重新启动Redis服务器后,我们注意到了一个问题。应用程序恢复处理一定数量的项目之后,我们看到一个问题,在这个问题上,ListLeftPopAsync花费无限的时间,应用程序挂起,没有任何例外。请注意,加载应用程序处理的数量很高,比如100000 items.Below是代码片段。
消费者层:
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,如下所示
public byte[] ListLeftPopAsync(int redisDb, string key)
{
return conn.GetDatabase(redisDb).ListLeftPop(key);
}在进行此更改后,应用程序不会挂起,整个队列将被处理。但是,StackExchange.Redis在对少数项目执行ListLeftPop时抛出超时异常。异常粘贴在下面。
执行LPOP 2:l:队列1,inst: 1,ar: ProcessReadQueue,错误:从不,队列: 6,qs: 0,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: qc
任何线索都会很感激的。
发布于 2016-11-06 20:19:38
增加同步超时或使用堆栈交换库提供的某种异步机制。
ConfigurationOptions co = new ConfigurationOptions()
{
SyncTimeout = 500000,
EndPoints =
{
{url,portNumber }
},
AbortOnConnectFail = false // this prevents that error
};
seClient = ConnectionMultiplexer.Connect(co);当您使用旧版本的客户端时,这种情况也可能发生
https://stackoverflow.com/questions/39387637
复制相似问题