azure-service-fabric - 我们可以防止 Service Fabric 中的 ReliableQueue 出现死锁和超时吗?

标签 azure-service-fabric

我们在 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/

相关文章:

azure - Service Fabric 停用(暂停)与停用(重新启动)?

c# - 在 Service Fabric 中调试 .NET Core RC2 Web 应用程序时出现错误消息

powershell - 如何使用 PowerShell 或 CLI 启动本地 Azure Service Fabric 集群

azure - 如何访问Azure Service Fabric集群中的日志?

azure - ARM 模板循环依赖问题

azure-service-fabric - 将 Service Fabric 集群子网关联到 NSG

c# - 应如何将 IIS 托管的基于 ASP.Net 的系统部署到 Azure Service Fabric?

msbuild - 如何在sfproj上使用MSBuild?

azure-service-fabric - 从可靠的字典中删除项目实际上并没有从内存中删除它们

azure - 在服务结构上托管多个公共(public)站点