我有一个分布式服务,需要10秒到10分钟才能处理消息。该服务从用户(==浏览器)请求开始,该请求通过API接收。由于各种限制,服务的结果必须在初始请求之外返回(超时,丢弃客户端连接......)因此,我将SessionId返回给请求用户,该用户可以使用它来检索结果,直到它到期为止。
现在,当会话仍处于锁定状态时,用户会对结果发出多个连续请求。例如,以下代码在60秒内被相同的SessionId命中:
var session = await responseQueue.AcceptMessageSessionAsync(sessionId);
var response = await session.ReceiveAsync(TimeSpan.FromSeconds(60));
if (response == null)
{
session.Abort();
return null;
}
await response.AbandonAsync();
我需要的是一个没有锁定的设置,能够多次读取消息,直到它过期,再加上等待但不存在的消息的能力。
哪种ServiceBus解决方案符合该法案?
更新
这是一个肮脏的解决方案,仍在寻找更好的方法:
MessageSession session = null;
try
{
session = await responseQueue.AcceptMessageSessionAsync(sessionId);
}
catch
{
// ... and client has to try again until the 60 sec lock from other requests is released
}
var response = await session.ReceiveAsync(TimeSpan.FromSeconds(60));
// ...