【问题标题】: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 方法中做了什么样的工作,但我只想提一下,当工作的后台部分完成时,从 return 到 return 是可以的 - 或者甚至不覆盖当没有后台工作时。

    【讨论】:

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