让我们考虑一个工人角色,它是:
这些处理方法执行一些Azure /O、对外部API的HttpClient调用和实体框架调用。现在,我希望我的工作人员角色能够优雅地关闭,以便所有挂起的操作都以托管方式完成或取消:
RoleEntryPoint.OnStop()被触发,停止接受任何传入的请求。Azure为我做的吗?如果不是,我该如何执行呢?N秒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主机、队列侦听器)。
问题开始:
OnStop()之后不再将传入的TCP请求发送给我的工作者角色?这是重要的,以适应关闭代码在5分钟的限制。N和M的具体数字,包括WCF通道超时、EF超时等?发布于 2016-12-21 03:45:01
一旦RoleEntryPoint.OnStop()被触发,就停止接受任何传入的请求。Azure为我做的吗?如果不是,我该如何执行呢?
正如这位官方文档所提到的ServiceHost.close()
Close方法允许在返回之前完成任何未完成的工作。例如,完成发送任何缓冲消息。
为了优雅地终止接收新请求但允许继续现有连接的WCF服务,您可以参考此问题。
对于侦听服务总线队列,您可以定义一个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()并终止OnStop函数中的WCF服务之后调用OnStop。然后,挂起的操作将随着工人角色实例的关闭而被丢弃。
如何在配置文件中考虑到WCF通道超时、EF超时等所有内容,找到N和M的具体数字?
我假设您可以利用应用洞察和您的工作者角色来检索度量数据并为N配置合理的值,以便降低失败的请求率,并让VM重新启动并开始处理新的请求。此外,您还可以参考这个教程来处理Azure OnStop事件。
https://stackoverflow.com/questions/41212216
复制相似问题