【问题标题】:Service Fabric Reliable Queues FabricNotReadableExceptionService Fabric 可靠队列 FabricNotReadableException
【发布时间】:2017-03-28 19:20:04
【问题描述】:

我有一个有 1000 个分区和 1 个副本的有状态服务。

RunAsync 方法中的这个服务有一个无限循环,我调用一个可靠队列来获取消息。 如果没有消息我等待 5 秒,然后重试。 我曾经使用 Azure 存储队列成功地做到了这一点。

但是使用 Service Fabric,我收到了数千个 FabricNotReadableExceptions,服务变得不稳定,我无法更新或删除它,我需要取消整个集群。 我尝试更新它,但 18 小时后它仍然卡住,所以我正在做的事情有一些非常错误的地方。

这是方法代码:

public async Task<QueueObject> DeQueueAsync(string queueName)
        {
    var q = await StateManager.GetOrAddAsync<IReliableQueue<string>>(queueName);
        using (var tx = StateManager.CreateTransaction())
        {
            try
            {
                var dequeued = await q.TryDequeueAsync(tx);
                if (dequeued.HasValue)
                {
                    await tx.CommitAsync();
                    var result = dequeued.Value;
                    return JSON.Deserialize<QueueObject>(result);
                }
                else
                {
                    return null;
                }
            }
            catch (Exception e)
            {
                ServiceEventSource.Current.ServiceMessage(this, $"!!ERROR!!: {e.Message} - Partition: {Partition.PartitionInfo.Id}");
                return null;
            }
        }}

这是 RunAsync

    protected override async Task RunAsync(CancellationToken cancellationToken)
{
    while (true)
    {
        var message = await DeQueueAsync("MyQueue");
        if (message != null)
        {
            //process, takes around 500ms
        }
        else
        {
            Thread.Sleep(5000);
        }
    }
}

我还用 Task.Delay 更改了 Thread.Sleep(5000) 并且出现了数千个“任务已取消”错误。

我在这里缺少什么? 是周期太快,SF无法及时更新其他副本? 我应该删除所有副本,只留下一个吗?

我应该改用新的 ConcurrentQueue 吗?

我在生产和本地有 50 或 1000 个分区的问题,没关系。

我陷入困境和困惑。 谢谢

【问题讨论】:

    标签: azure-service-fabric


    【解决方案1】:

    您需要遵守传递给您的RunAsync 实现的cancellationToken。当 Service Fabric 出于任何原因(包括升级)想要停止您的服务时,它将取消令牌,并且它将无限期地等待 RunAsync 在取消令牌后返回。这可以解释为什么您无法升级您的应用程序。

    我建议在您的循环中检查cancellationToken.IsCancelled,如果它已被取消,则中断。

    FabricNotReadableException 的发生可能有多种原因 - this question 的答案有一个全面的解释,但要点是

    您可以考虑 FabricNotReadableException 可重试。如果您看到它,只需再次尝试调用,最终它将解析为 NotPrimary 或 Granted。

    【讨论】:

    • 天哪,我欠你一杯啤酒。正是 cancelToken 导致了一个问题的世界。谢谢
    猜你喜欢
    • 1970-01-01
    • 2020-04-05
    • 2017-07-25
    • 2017-12-08
    • 2016-03-14
    • 2017-01-28
    • 2017-12-07
    • 2016-07-26
    • 1970-01-01
    相关资源
    最近更新 更多