【问题标题】:Force return from RunAsync() via decision made in web API Controller in Service Fabric通过在 Service Fabric 中的 Web API 控制器中做出的决定从 RunAsync() 强制返回
【发布时间】:2019-07-13 12:12:17
【问题描述】:

当您看到抛出异常(例如FabricObjectClosedException)时,此线程与场景高度相关。

问题是针对特定场景,当您根据 http-request 使用 Web api 控制器中的 StateManager 提交入队时看到上述异常。

为了提供更多背景故事,当 Service Fabric 对象由于某种原因 (here) 当前处于关闭状态时,将引发 FabricObjectCloseException

  1. 正在删除 Service Fabric 对象。
  2. 由于故障转移,无法访问 Service Fabric 对象。

如果上述异常是在RunAsync() while 循环中抛出的,推荐的做法是从RunAsync() 方法中返回,该方法基于link 调用服务的重启。

如果尝试在 Web API 控制器中使用可靠状态管理器时抛出异常怎么办?在这种情况下,有状态服务的RunAsync() 怎么能跳出while循环呢?

【问题讨论】:

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


    【解决方案1】:

    我不能 100% 确定我了解全部情况,但我可以想到以下情况:

    你有:

    1. 公开为 ServiceReplicaListener 以服务传入请求的 Web API 控制器
    2. RunAsync 方法中完成的一些背景/继续工作

    这里的第一件事是检查CancellationToken是否在FabricObjectCloseException被抛出时被设置为RunAsync

    据我了解,FabricObjectCloseException 在副本被关闭时抛出(here 我曾经描述过 Service Fabric 在服务关闭时执行的步骤),由集群管理器或其他原因引起。如果这个假设成立,那么应该设置CancellationToken

    如果未设置通过 CancellationToken - 那么我可以建议您:

    1. 创建一个简单的服务来包装CancellationTokenSource
    2. StatefulService 类的构造函数中创建CancellationTokenSource 的实例,并从#1 初始化服务。
    3. 使用依赖注入,在 Web API 控制器中注入此服务,并在 FabricObjectCloseException 发生时取消信号。
    4. RunAsync中,检查两者的取消状态:通过CancellationToken和自定义服务。

    附:我不确定你在 RunAsync 方法中做了什么样的工作,但我只想提一下,当工作的后台部分完成时,从 returnreturn 是可以的 - 或者甚至不覆盖当没有后台工作时。

    【讨论】:

    • 我唯一关心的是,当副本之间的角色发生变化或 DI 注入如何包含陈旧的引用时,这种设计能否动态处理指向正确的主副本?会不会有这样的情况,或者DI注入能够处理所有情况?
    • 当副本更改角色时,将调用CreateReplicaListeners 方法。您可以在此方法中使用新的CancellationTokenSource 从 #1 初始化服务。
    猜你喜欢
    • 2021-07-31
    • 2017-06-17
    • 1970-01-01
    • 2012-03-21
    • 2017-05-13
    • 1970-01-01
    相关资源
    最近更新 更多