【问题标题】:Graceful shutdown of Azure worker roleAzure 辅助角色的正常关闭
【发布时间】:2017-05-03 21:25:09
【问题描述】:

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

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

处理方法执行一些 Azure 存储 I/O、HttpClient 调用外部 API 和实体框架调用。现在我希望我的工作角色能够正常关闭,以便所有待处理的操作都以托管方式完成或取消:

  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. 甚至可以使用同步代码吗?

【问题讨论】:

  • 我会尝试创建一个单调(静态或取决于 di 容器),其标志在挂起时为真。对于 azure 存储队列客户端来说,这应该足够了。至于其他 wcf 和服务总线,我不确定:( 但 afaik 你应该能够关闭监听器
  • 为了解决超时问题而不是布尔标志,我将使用日期时间来检查是否应该停止使用消息

标签: .net azure asynchronous timeout application-shutdown


【解决方案1】:

一旦 RoleEntryPoint.OnStop() 被触发,就停止接受任何传入的请求。 Azure 是否适合我?如果不是,我该如何执行?

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

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

要优雅地终止接收新请求但允许现有连接继续的 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
}

允许 N 秒完成任何挂起的操作

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 2015-12-05
    • 2011-08-22
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多