让我们考虑一下工人角色:
处理方法执行一些Azure存储I / O,HttpClient
调用外部API和实体框架调用。现在我希望我的worker角色正常关闭,以便以托管方式完成或取消所有挂起的操作:
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
的具体数字?答案 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事件。