2016-06-28 5 views
0

Ich habe in unseren Fehlerprotokollen festgestellt, dass unser statusloser Service von Azure Service Fabric bei einem Versuch, eine Methode auf einem Actor-Proxy nach einer gewissen Zeit aufzurufen, auf Microsoft.ServiceFabric.Actors.Runtime.DuplicateMessageException gestoßen ist. Der Schauspieler kann eine Weile dauern, um zu laufen. Die vollständige Meldung der Ausnahme war:Wie kann das Zeitlimit für einen Azure Service Fabric Actor erhöht werden?

Schauspieler Microsoft.ServiceFabric.Actors.Runtime.ActorConcurrencyLock bekam gleichen Anfrage mehr als einmal. Dies kann bei einer Anfrage der Fall sein, die mehr Verarbeitungszeit benötigt als die konfigurierte OperationTimeout auf Client-Seite als Client versucht, bei TimeoutException erneut.

Ich sehe nirgendwo, dass ich diesen Wert konfigurieren kann. Ich sehe einen Verweis darauf in the documentation for the FabricTransportSettings class, aber ich kann nicht sagen, wo dieser Typ verwendet wird.

Da erwartet wird, dass unsere Actor-Methode eine Weile dauert (oft Minuten), wie kann ich den OperationTimeout erhöhen, wenn dieser Fehler tatsächlich mit einem Timeout zusammenhängt?

Antwort

3

Ich würde in Betracht ziehen, zu ändern, wie der Akteur arbeitet, dass Sie den Akteur mit den notwendigen Parametern initialisieren und "säen". Dann feuern Sie einen Timer, um die lang andauernde Arbeit auszuführen. Fragen Sie den Akteur dann erneut ab, bis die Arbeit abgeschlossen ist, und rufen Sie das Ergebnis ab.

Wir haben ein paar lange laufende Workloads Akteure in unserem System, das wir auf diese Weise funktionieren Setup

+0

Ich denke, das ist ein guter Vorschlag von einer Architektur, Perspektive und ich werde auf jeden Fall Versuch es. Leider beantwortet es die Frage nicht wirklich, daher kann ich es nicht als Antwort bezeichnen. Ist es möglich, das Timeout zu erhöhen, und wenn ja, wie? – Paul

+0

Gut genug, ich erinnere mich, dass ich an einer Stelle etwas gelesen habe, das für Änderungen an den FabricTransportSettings gesagt hat, dass Sie die Änderungen an beiden Enden der Leitung vornehmen müssen (Requester und Empfänger auf Empfängerseite) –

+0

dieses Problem auch. Ich nahm den Ratschlag, das Zeitlimit nicht zu erhöhen, sondern schaltete stattdessen einen Actor aus und setzte einen Timer für die lange laufende Aufgabe und verwendete dann akteurbasierte Ereignisse, die vom anrufenden Dienst abonniert werden können, um Benachrichtigungen zu erhalten, wenn die Arbeit abgeschlossen ist. Sie können mehr über Akteur-Ereignisse @ https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-reliable-actors-events lesen. –

2

Sie den Timeout-Wert auf Baugruppenebene einstellen.

using Microsoft.ServiceFabric.Services.Remoting.FabricTransport; 
[assembly: FabricTransportServiceRemotingProvider(MaxMessageSize = int.MaxValue,OperationTimeoutInSeconds =2000)] 
Verwandte Themen