2016-07-28 120 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)。 –