【问题标题】:cancellationToken.IsCancellationRequested not getting true in rolling upgrade for service fabriccancelToken.IsCancellationRequested 在服务结构的滚动升级中不成立
【发布时间】:2018-10-25 19:11:46
【问题描述】:

我有一个状态完整的服务,它正在扫描一个可靠的集合并对其执行一些操作。 RunAsync 中的代码如下:

while (!cancellationToken.IsCancellationRequested)
        {
            try
            {
                var cacheItemsWithExpiration = await this.cacheStore.GetAllCacheItemsWithExpiration(); // Call to reliable collection

                // some processing on cacheItemsWithExpiration
            }
            catch (Exception ex)
            {
                this.telemetryHelper.TrackException(ex); // Telemetry logging
            }
        }

现在在滚动升级期间,GetAllCacheItemsWithExpiration 方法会引发错误“Primary State Manager 当前不可读”

现在根据编写的代码,在出现异常后,while 循环应该退出,因为我认为升级将发送取消。但不知何故,它卡在了那个循环中并继续记录异常。

我在 Service Fabric 资源管理器中看到以下消息:

【问题讨论】:

  • 只是添加这种情况会在发布时间歇性发生,即不是每次发布。

标签: azure-service-fabric


【解决方案1】:

如屏幕截图所示,该错误发生在次要副本中,根据消息,看起来它正在尝试切换角色,其中主副本变为辅助副本,反之亦然。

SwapPrimary 重新配置发生在升级必须放下实例以带来新版本时,并且当它发生在主要副本上时,其中一个次要被提升为主要。

如您所见,这只是一个警告,可能发生的情况是您的代码在循环之间花费了太长时间才能完成,直到您再次检查取消,可能是 GetAllCacheItemsWithExpiration() 花费的时间太长或代码在交换发生时它仍在处理之后。

您可以尝试:

  • 检查取消令牌是否被正确取消
  • 检查您的方法中的取消GetAllCacheItemsWithExpiration()
  • 返回方法后检查是否取消
  • 检查所有可能导致进程挂起一段时间的地方

在最后一种情况下,您可能希望从有状态服务中实现对 OnChangeRoleAsync(ReplicaRole newRole, CancellationToken cancellationToken) 的覆盖以跟踪角色的变化,请参阅更多详细信息 here

See this docs to understand more about the Reconfiguration in Azure Service Fabric

【讨论】:

  • 是的,我正在处理取消令牌。只是为了提供更多说明,正在发生以下情况: 1. 在升级期间 GetAllCacheItemsWithExpiration 抛出异常“System.Fabric.FabricNotReadableException” 2. 它去捕获块并记录异常 3. 在它检查cancellationRequestedFlag的地方点击while循环条件,这似乎返回 false 并使其再次进入循环。 4. 再次调用 GetAllCacheItemsWithExpiration 并且上述序列不断重复。最后我必须删除 ASF explorer 中的服务。
  • 请注意:: 这并不总是发生,我在一周内注意到它两次(我们每天进行 2 次部署),但是当它发生时它无限卡在状态,然后我们必须删除它最终。这很可怕的原因是,如果它发生在 PROD 中,我们需要请求停机,因为我们必须删除服务然后部署它,这肯定会破坏我们使用服务结构(零停机)的目的。
  • 在这种情况下,原因似乎是令牌没有被取消,您是使用他们提供的令牌还是使用自己的令牌?您是在处理所有副本上的数据还是仅在主节点上处理数据?你能覆盖OnChangeRoleAsync,看看取消是否被取消?
  • 1.是的,我使用与 RunAsync 2 中的参数相同的令牌。我不确定如何确定我是在处理所有副本还是主副本中的数据。有配置吗? 3. 我已经覆盖 OnChangeRoleAsync 并记录了 canceltoken 状态。将在问题再次出现时通知您。 4. 当上述情况发生时,遥测表明cancellationtoken状态为false。
猜你喜欢
  • 2018-12-09
  • 2021-07-31
  • 2018-07-23
  • 1970-01-01
  • 2017-11-24
  • 2017-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多