【问题标题】:Azure Service Fabric Actors - unhandled exceptions?Azure Service Fabric Actors - 未处理的异常?
【发布时间】:2016-09-08 12:47:35
【问题描述】:

现在我们的 ASF 集群正在运行:

  • Web API 项目 - 无状态且面向公众
  • Actor 项目 - 主要是易失性的,将数据保存在内存中,由某些 API 使用

我们正在试用 Application Insights,我可以像他们的文档 here 一样为我们的 Web API 项目设置未处理的错误跟踪。

问题是,我们的 Actor 项目也需要这个。

是否有一个全局位置来捕获 Actor 中未处理的错误?我知道它是新的,也许这就是我找不到相关文档的原因。

现在我在每个actor方法中都这样做,但似乎不是一个很好的解决方案:

public async Task DoStuff()
{
    try
    {
        //Do all my stuff
    }
    catch (Exception exc)
    {
        //Send to Windows Event Source
        ActorEventSource.Current.ActorMessage(this, "Unhandled error in {0}: {1}", nameof(DoStuff), exc);

        //Send to Application Insights
        new TelemetryClient().TrackException(exc);

        throw exc;
    }
}

【问题讨论】:

    标签: c# .net asp.net-web-api azure-service-fabric


    【解决方案1】:

    你有几个选择:

    • Actor 确实有一个内置的 ETW 提供程序 (Microsoft-ServiceFabric-Actors),它有一个 ActorMethodThrewException 事件。您可以:

      • 使用外部进程收集 ETW 事件并将其转发到 Application Insights(例如使用 SLAB 或 Azure 诊断)
      • 使用 EventListener 类监听进程中的事件并将其转发到 App Insights(可靠性稍差,但更简单)
    • 使用自定义的ActorServiceRemotingDispatcher,它是负责向actors分发操作的类

      class CustomActorServiceRemotingDispatcher : ActorServiceRemotingDispatcher
      {
          public CustomActorServiceRemotingDispatcher(ActorService actorService) : base(actorService)
          {
          }
      
          public override async Task<byte[]> RequestResponseAsync(IServiceRemotingRequestContext requestContext, ServiceRemotingMessageHeaders messageHeaders,
              byte[] requestBodyBytes)
          {
                  try
                  {
                      LogServiceMethodStart(...);
      
                      result = await base.RequestResponseAsync(requestContext, messageHeaders, requestBodyBytes).ConfigureAwait(false);
      
                      LogServiceMethodStop(...);
      
                      return result;
                  }
                  catch (Exception exception)
                  {
                      LogServiceMethodException(...);
      
                      throw;
                  }
          }
      }
      

      要使用此类,您需要创建自定义 ActorService 类并覆盖 CreateServiceReplicaListeners 方法。请注意,这将覆盖您可能正在使用的任何 ActorRemotingProviderAttributes。

      旁注:

      • 您也可以使用此方法读取您自己的标头(您还需要客户端自定义 IServiceRemotingClientFactory 来添加它们)
      • 同样的技术可以应用于 Reliable Services(使用 ServiceRemotingDispatcher 类)

    【讨论】:

    • 我认为ActorServiceRemotingDispatcher 对我来说是最好的选择,我会试一试。
    【解决方案2】:

    不,目前在 Actor 框架中没有全局位置来获取 Actor 抛出的异常。框架本身确实捕获了由 Actor 运行时管理的方法引发的异常 - 这些是您的 Actor 接口方法(可从 ActorProxy 调用的方法)、计时器回调、提醒回调和基本 Actor 覆盖(如 OnActivateAsync) - 但它们' 不会通过参与者 API 公开。

    【讨论】:

      猜你喜欢
      • 2018-03-14
      • 2017-09-18
      • 2016-12-07
      • 2016-06-23
      • 2017-10-18
      • 1970-01-01
      • 2016-04-30
      • 2016-06-28
      • 2017-07-10
      相关资源
      最近更新 更多