【问题标题】:System.Fabric.FabricNotPrimaryException When saving state from timerSystem.Fabric.FabricNotPrimaryException 从计时器保存状态时
【发布时间】:2017-04-05 23:21:11
【问题描述】:

我正在编写一个托管在 Service Fabric 中的有状态服务。该服务的工作是使用来自外部队列的消息,转换它们并将它们放置到我们自己的消息传递系统中。根据供应商文档,吞吐量可以达到 6k 消息/秒。

我已将服务配置为多个分区以分散消息负载,每个分区有最少 2/最多 3 个副本。为了从故障中恢复,我可以订阅供应商队列并传入我希望接收消息的时间戳。为此,我将存储在服务状态下处理的最后一条消息的时间戳。由于消息量很大,我决定在计时器上“保存”(并允许下游消息的潜在重复)

这是当时调用的代码:

private async void _timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        var saveRetryPolicy = Policy
            .Handle<Exception>()
            .WaitAndRetryAsync(5, retryAttempt =>
                TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))
            );

        await saveRetryPolicy.ExecuteAsync(async () =>
        {
            using (var tx = _stateManager.CreateTransaction())
            {
                var state = await _stateManager.TryGetAsync<IReliableDictionary<string, long>>(TimestampStateName);

                if (state.HasValue)
                {
                    await state.Value.AddOrUpdateAsync(tx, TimestampStateName, _lastTXTimestamp,
                        (s, l) => _lastTXTimestamp);

                    await tx.CommitAsync();
                }
                else
                {
                    var s =
                        await _stateManager.GetOrAddAsync<IReliableDictionary<string, long>>(tx, TimestampStateName);

                    await tx.CommitAsync();
                    _timer_Elapsed(this, null);
                }
            }
        });
    }

每次尝试持久化时,我都会在每个分区上收到“System.Fabric.FabricNotPrimaryException”错误。

我已经包含了重试策略(由 Polly Retry 提供),因为有关于类似问题的评论建议这样做。这没有任何效果,只是延长了报告错误之前的时间。

我是否误解了应该如何使用 SF 的一些基本内容?这对我来说似乎是一个简单的用例。

【问题讨论】:

  • 您是否在所有副本上启动计时器?还是只在主副本上?
  • 好地方(我现在看起来不傻)。谢谢

标签: c# azure-service-fabric service-fabric-stateful


【解决方案1】:

来自cmets的回答:

确保不要在所有副本上启动计时器,而仅在主副本上启动。

【讨论】:

  • 我想知道,为什么“计时器”代码会在辅助副本上运行?我假设计时器代码是通过“runasync”设置的。如果是这样,“RunAsync”总是在主节点上运行,对吗?
猜你喜欢
  • 2018-06-17
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
  • 1970-01-01
相关资源
最近更新 更多