我们在 Service Fabric 中有一个有状态服务,其中包含 RunAsync 方法和几个服务调用。
一个服务调用允许将某些内容放入 ReliableQueue 中
using(ITransaction tx = StateManager.CreateTransaction())
{
await queue.EnqueueAsync(tx, message);
queueLength = await queue.GetCountAsync(tx);
await tx.CommitAsync();
}
另一方面,RunAsync 尝试将事物出队:
using(ITransaction tx = StateManager.CreateTransaction())
{
await queue.TryDequeueAsync(tx);
queueLength = await queue.GetCountAsync(tx);
await tx.CommitAsync();
}
GetCountAsync 似乎会导致死锁,因为两个事务相互阻塞。如果我们交换顺序会有帮助吗:先计数,然后出队/入队?
最佳答案
这可能是因为如今的 ReliableQueue 是严格的 FIFO,并且一次只允许一个读取器或写入器。您可能没有看到死锁,而是看到超时(如果情况并非如此,请纠正我)。除了以下之外,没有真正的方法可以防止超时:
- 确保事务的生存期不会太长 - 超过您需要的时间,并且您会阻塞队列中的其他工作。
- 增加默认事务超时(默认为 4 秒,您可以传入不同的值)
重新排序不会导致任何变化。
关于azure-service-fabric - 我们可以防止 Service Fabric 中的 ReliableQueue 出现死锁和超时吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37584736/