it-swarm.com.de

Hystrix-Befehl schlägt fehl mit "Zeitüberschreitung und kein Fallback verfügbar"

Ich habe festgestellt, dass einige Befehle in meiner Anwendung mit fehlschlagen 

Caused by: ! com.netflix.hystrix.exception.HystrixRuntimeException: GetAPICommand timed-out and no fallback available.
out: ! at com.netflix.hystrix.HystrixCommand.getFallbackOrThrowException(HystrixCommand.Java:1631)
out: ! at com.netflix.hystrix.HystrixCommand.access$2000(HystrixCommand.Java:97)
out: ! at com.netflix.hystrix.HystrixCommand$TimeoutObservable$1$1.tick(HystrixCommand.Java:1025)
out: ! at com.netflix.hystrix.HystrixCommand$1.performBlockingGetWithTimeout(HystrixCommand.Java:621)
out: ! at com.netflix.hystrix.HystrixCommand$1.get(HystrixCommand.Java:516)
out: ! at com.netflix.hystrix.HystrixCommand.execute(HystrixCommand.Java:425)
out: Caused by: ! Java.util.concurrent.TimeoutException: null
out: !... 11 common frames omitted

Dies ist meine Hystrix-Konfiguration überschreiben:

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=210000
hystrix.threadpool.default.coreSize=50
hystrix.threadpool.default.maxQueueSize=100
hystrix.threadpool.default.queueSizeRejectionThreshold=50

Was für eine Auszeit ist das? Ist es ein Lese-/Verbindungs-Timeout für die externe Anwendung? Wie kann ich das debuggen?

16
dkulkarni

Dies ist ein Zeitlimit für Hystrix-Befehle. Dieses Zeitlimit wird standardmäßig für jeden Befehl aktiviert. Sie definieren den Wert mithilfe der folgenden Eigenschaft:

execution.isolation.thread.timeoutInMilliseconds: Diese Eigenschaft legt die Zeit in Millisekunden fest, nach der der Aufrufer eine Zeitüberschreitung feststellt und die Befehlsausführung verlässt. Hystrix markiert> den HystrixCommand als TIMEOUT und führt eine Fallback-Logik durch.

So können Sie Ihren Timeout-Wert erhöhen oder das Standard-Timeout (falls in Ihrem Fall zutreffend) für Ihren Befehl mithilfe der folgenden Eigenschaft deaktivieren:

@HystrixProperty(name = "hystrix.command.default.execution.timeout.enabled", value = "false")

Weitere Informationen finden Sie hier: https://github.com/Netflix/Hystrix/wiki/Configuration#CommandExecution

29
psantamaria

Möglicherweise befinden Sie sich im Debugging oder Ihre Verbindung ist zu langsam. Das Standardausführungszeitlimit für Threads beträgt nur 1 Sekunde. Sie können diese Meldung also leicht erhalten, wenn Sie in Ihrem Befehl einen Haltepunkt setzen

Dies ist zwar nicht Ihr Fall, könnte aber jemand anderem helfen

11
xval

Beim Stacktrace handelt es sich um eine Ausnahme, die von Hystrix nach den oben definierten 210 Sekunden ausgelöst wird. 

As TimeoutException ist eine geprüfte Ausnahme, die für jede Methode deklariert werden muss, die diese Ausnahme auslösen könnte. Sie würden dies in der run()-Methode Ihres Codes deklariert sehen. 

Sie können dies wie jedes andere Programm debuggen. Beachten Sie jedoch, dass die run()-Methode in einem vom Aufrufer separaten Thread ausgeführt wird. Nach 210 Sekunden wird der Anrufer trotz Ihrer Debugging-Sitzung einfach fortgesetzt.

1
ahus1