2016-07-28 77 views
1

我在有状态服务的RunAsync方法中创建了大量Service Bus Clients。增加RunAsync超时

该方法比在开发环境中运行并且应用程序无法启动时允许的时间长4秒。

由于在我的开发机器和Azure之间似乎存在延迟,它会失败。

我在泰国。 Azure位于美国中南部。

可以在我的开发盒上本地增加4000毫秒的超时时间吗?

我得到的错误是:

{ 
{ 

    "Message": "RunAsync has been cancelled for a stateful service replica. The cancellation will be considered 'slow' if RunAsync does not halt execution within 4000 milliseconds.   
    "Level": "Informational", 
    "Keywords": "0x0000F00000000000", 
    "EventName": "StatefulRunAsyncCancellation", 
    "Payload": { 
[...] 
"slowCancellationTimeMillis": 4000.0 

}}

+0

你能显示一些代码和错误信息吗?据我所知,没有这种超时。只要服务实例/复制是主要的,“RunAsync”就可以持续运行。有一个缓慢的取消警告,但只有当服务更改角色或被删除时,它才会生成健康报告。 –

+0

这是一个缓慢的警告我越来越。我已经编辑了我的文章更多的细节。当然,这个应用程序表明罚款...没有任何代码更改。 –

+0

我认为你可以忽略这个警告。无论如何,目前没有办法改变这个超时(它是硬编码的)。 –

回答

4

的问题不在于RunAsync时间过长运行,那就是它的时间太长取消

对于报告“缓慢”取消,服务结构有默认(硬编码)超时4秒。这意味着在此之后它会产生一个健康事件(这在升级过程中可能很重要,因为它会影响整个应用程序的健康状态)。

真正的问题是执行RunAsync。当您删除服务或升级服务时,Service Fabric将等待(可能永远)让它正常关闭。您的代码应尊重传递给RunAsync方法的CancellationToken。例如,如果您有多个IO操作,请在每个操作之后调用cancellationToken.ThrowIfCancellationRequested()(只要可能),并将其传递给接受它作为参数的任何方法。

+0

谢谢你的信息。我将回顾那部分代码。 –

+0

@Eli有没有办法让服务结构干掉我的服务?它安全地工作,并且'幂等',所以它可以在任何时候被杀害而不会感到悲伤(或健康事件) – Iain

+0

@Iain我知道的唯一方法是删除服务(例如使用PowerShell)。 –