首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >浅谈浅蓝型工人角色的优雅关闭

浅谈浅蓝型工人角色的优雅关闭
EN

Stack Overflow用户
提问于 2016-12-18 19:48:48
回答 1查看 702关注 0票数 0

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

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

这些处理方法执行一些Azure /O、对外部API的HttpClient调用和实体框架调用。现在,我希望我的工作人员角色能够优雅地关闭,以便所有挂起的操作都以托管方式完成或取消:

  1. 一旦RoleEntryPoint.OnStop()被触发,停止接受任何传入的请求。Azure为我做的吗?如果不是,我该如何执行呢?
  2. 允许任何挂起的操作完成N
  3. N秒之后,取消所有剩下的操作。取消不能超过M秒,以便使N + M < 5 minutes。我相信5分钟是一个保证的时间,Azure运行时将等待在它触发OnStop()之后,在它终止进程之前。

我把它想象成这样:

代码语言:javascript
复制
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. 如何在配置文件中找到NM的具体数字,包括WCF通道超时、EF超时等?
  3. 同步代码甚至可能实现吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-21 03:45:01

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

正如这位官方文档所提到的ServiceHost.close()

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

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

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

并检查是否要求取消CancellationTokenSource,如下所示:

代码语言:javascript
复制
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()并终止OnStop函数中的WCF服务之后调用OnStop。然后,挂起的操作将随着工人角色实例的关闭而被丢弃。

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

我假设您可以利用应用洞察和您的工作者角色来检索度量数据并为N配置合理的值,以便降低失败的请求率,并让VM重新启动并开始处理新的请求。此外,您还可以参考这个教程来处理Azure OnStop事件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41212216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档