正常关闭 Azure 辅助角色

Graceful shutdown of Azure worker role

让我们考虑一个辅助角色:

  1. 托管 WCF 服务器
  2. 监听一些 Azure 存储队列和服务总线队列

处理方法执行一些 Azure 存储 I/O、HttpClient 对外部 API 的调用和 Entity Framework 调用。现在我希望我的工作者角色正常关闭,以便所有未决操作以托管方式完成或取消:

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

我正在想象它是这样的:

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. 同步代码是否可行?

Stop accepting any incoming requests once RoleEntryPoint.OnStop() is triggered. Does Azure make it for me? If not how do I enforce it?

正如这位官员 document 提到的 ServiceHost.close():

The Close method allows any unfinished work to be completed before returning. For example, finish sending any buffered messages.

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

对于侦听服务总线队列,您可以定义一个 CancellationTokenSource 对象并在触发 RoleEntryPoint.OnStop() 后调用 CancellationTokenSource.Cancel()

并检查是否已为 CancellationTokenSource 请求取消,如下所示:

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

Allow N seconds for any pending operation to complete

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

How to find out concrete numbers for N and M considering all the stuff like WCF channel time outs, EF timeouts, etc. in the configuration file?

我假设您可以利用 Application Insights with your worker role to retrieve the metrics data and configure the reasonable value for N, in order to reduce the failed request rate and quickly let your VM restart and begin processing new requests. Also you could refer to this tutorial 来处理 Azure OnStop 事件。