正确关闭Azure工作者角色

时间:2016-12-18 19:48:49

标签: .net azure asynchronous timeout application-shutdown

让我们考虑一下工人角色:

  1. 托管WCF服务器
  2. 收听一些Azure存储队列和服务总线队列
  3. 处理方法执行一些Azure存储I / O,HttpClient调用外部API和实体框架调用。现在我希望我的worker角色正常关闭,以便以托管方式完成或取消所有挂起的操作:

    1. 触发RoleEntryPoint.OnStop()后,停止接受任何传入请求。 Azure是否适合我?如果不是我如何执行它?
    2. 允许N秒完成任何待处理操作
    3. N秒后取消任何操作。取消时间不得超过M秒,以便N + M < 5 minutes。我相信5分钟是Azure运行时在触发OnStop()之后和终止进程之前等待的保证时间。
    4. 我想像这样:

      public override void Run() {
         // create a cancellation token source
         try {
           // pass the token to all processing/listening routines
         }
         catch (Exception e) { }
      }
      
      public override void OnStop() { 
         try {
            // trigger the cancellation token source
         } 
         catch (Exception e) { }
      }
      

      上面的天真样本假设我的所有处理例程都是从上到下的异步(对于EF / HttpClient调用)。如果是这样的话,我需要一个能够处理前置条件的工作示例(WCF主机,队列侦听器)。

      问题已经开启:

      1. 如何在触发OnStop()后确保不再向我的辅助角色发送传入的TCP请求?这对于将关机代码安装到5分钟的限制非常重要。
      2. 如何在配置文件中考虑WCF通道超时,EF超时等所有内容,找出NM的具体数字?
      3. 同步代码是否可行?

1 个答案:

答案 0 :(得分:1)

  

触发RoleEntryPoint.OnStop()后,停止接受任何传入请求。 Azure是否适合我?如果不是我如何执行它?

正如此官员document提到ServiceHost.close()

  

Close方法允许在返回之前完成任何未完成的工作。例如,完成发送任何缓冲的消息。

为了优雅地终止接收新请求但允许现有连接继续的WCF服务,您可以参考此issue

对于侦听Service Bus队列,您可以定义CancellationTokenSource对象,并在触发CancellationTokenSource.Cancel()后调用RoleEntryPoint.OnStop()

并检查CancellationTokenSource是否已按照以下要求取消:

try
{
    if (!_cancellationTokenSource.IsCancellationRequested)
    {
        //retrieve and process the message
    }
}
catch (Exception)
{
    // Handle any message processing specific exceptions here
}
  

允许N秒完成任何待处理操作

根据我的理解,我假设你可以在调用Task.Delay(TimeSpan.FromSeconds(N)).Wait()后调用CancellationTokenSource.Cancel()并在OnStop函数中终止WCF服务。然后,将关闭挂起的操作以及关闭工作者角色实例。

  

如何在配置文件中考虑WCF通道超时,EF超时等所有内容,找出N和M的具体数字?

我假设您可以利用Application Insights与您的辅助角色一起检索指标数据并为N配置合理的值,以便降低失败的请求率并快速让您的VM重新启动,开始处理新请求。您也可以参考此tutorial来处理Azure OnStop事件。