WiederholungsmusterRetry pattern

Ermöglichen Sie einer Anwendung beim Herstellen einer Verbindung mit einem Dienst oder einer Netzwerkressource die Behandlung vorübergehender Fehler, indem ein fehlgeschlagener Vorgang transparent wiederholt wird.Enable an application to handle transient failures when it tries to connect to a service or network resource, by transparently retrying a failed operation. Dies kann die Stabilität der Anwendung verbessern.This can improve the stability of the application.

Kontext und ProblemContext and problem

Eine Anwendung, die mit in der Cloud ausgeführten Elementen kommuniziert, muss gegenüber vorübergehenden Fehlern empfindlich sein, die in dieser Umgebung auftreten können.An application that communicates with elements running in the cloud has to be sensitive to the transient faults that can occur in this environment. Fehler umfassen den vorübergehenden Verlust der Netzwerkkonnektivität mit Komponenten und Diensten, die vorübergehende Nichtverfügbarkeit eines Diensts oder Timeouts, die auftreten, wenn ein Dienst ausgelastet ist.Faults include the momentary loss of network connectivity to components and services, the temporary unavailability of a service, or timeouts that occur when a service is busy.

Diese Fehler werden in der Regel automatisch behoben, und wenn die Aktion, die einen Fehler ausgelöst hat, nach einer angemessenen Verzögerung wiederholt wird, wird sie wahrscheinlich erfolgreich ausgeführt.These faults are typically self-correcting, and if the action that triggered a fault is repeated after a suitable delay it's likely to be successful. Beispielsweise kann ein Datenbankdienst, der eine große Anzahl gleichzeitiger Anforderungen verarbeitet, eine Drosselungsstrategie implementieren, durch die weitere Anforderungen vorübergehend abgelehnt werden, bis die Arbeitsauslastung abgenommen hat.For example, a database service that's processing a large number of concurrent requests can implement a throttling strategy that temporarily rejects any further requests until its workload has eased. Eine Anwendung, die auf die Datenbank zuzugreifen versucht, kann möglicherweise keine Verbindung herstellen, doch ist bei einem wiederholten Versuch nach einer Verzögerung der Zugriff möglich.An application trying to access the database might fail to connect, but if it tries again after a delay it might succeed.

LösungSolution

In der Cloud sind vorübergehende Fehler nicht ungewöhnlich, und eine Anwendung sollte so entworfen sein, dass diese elegant und transparent behandelt werden.In the cloud, transient faults aren't uncommon and an application should be designed to handle them elegantly and transparently. Dadurch verringern sich die Auswirkungen, die Fehler auf die Geschäftsaufgaben haben können, die von der Anwendung ausgeführt werden.This minimizes the effects faults can have on the business tasks the application is performing.

Wenn eine Anwendung beim Senden einer Anforderung an einen Remotedienst einen Fehler erkennt, kann dieser mithilfe der folgenden Strategien behandelt werden:If an application detects a failure when it tries to send a request to a remote service, it can handle the failure using the following strategies:

  • Abbrechen.Cancel. Wenn der Fehler anzeigt, dass er nicht vorübergehend ist oder durch eine Wiederholung wahrscheinlich nicht erfolgreich behoben werden kann, sollte die Anwendung den Vorgang abbrechen und eine Ausnahme melden.If the fault indicates that the failure isn't transient or is unlikely to be successful if repeated, the application should cancel the operation and report an exception. Beispielsweise kann ein Authentifizierungsfehler, der durch Bereitstellung ungültiger Anmeldeinformationen entsteht, wahrscheinlich nicht erfolgreich behoben werden, unabhängig davon, wie oft dies versucht wird.For example, an authentication failure caused by providing invalid credentials is not likely to succeed no matter how many times it's attempted.

  • Wiederholen.Retry. Ist der gemeldete Fehler ungewöhnlich oder selten, wurde er möglicherweise durch ungewöhnliche Umstände verursacht, wie z. B. ein Netzwerkpaket, das während der Übertragung beschädigt wurde.If the specific fault reported is unusual or rare, it might have been caused by unusual circumstances such as a network packet becoming corrupted while it was being transmitted. In diesem Fall kann die Anwendung die fehlgeschlagene Anforderung sofort wiederholen, da der gleiche Fehler wahrscheinlich nicht erneut auftreten wird und die Anforderung dann erfolgreich ausgeführt werden kann.In this case, the application could retry the failing request again immediately because the same failure is unlikely to be repeated and the request will probably be successful.

  • Wiederholen nach Verzögerung.Retry after delay. Wenn der Fehler durch einen der eher häufig auftretenden Konnektivitäts- oder Auslastungsfehler verursacht wird, benötigt das Netzwerk oder der Dienst möglicherweise eine kurze Zeit, um die Verbindungsprobleme zu beheben oder die Arbeitsrückstände aufzuarbeiten.If the fault is caused by one of the more commonplace connectivity or busy failures, the network or service might need a short period while the connectivity issues are corrected or the backlog of work is cleared. Die Anwendung sollte eine entsprechende Zeit lang warten, bevor die Anforderung wiederholt wird.The application should wait for a suitable time before retrying the request.

Bei häufiger auftretenden vorübergehenden Fehlern sollte der Zeitraum zwischen den Wiederholungen so gewählt werden, dass Anforderungen von mehreren Instanzen der Anwendung so gleichmäßig wie möglich verteilt werden.For the more common transient failures, the period between retries should be chosen to spread requests from multiple instances of the application as evenly as possible. Dadurch sinkt die Wahrscheinlichkeit, dass ein ausgelasteter Dienst weiterhin überlastet wird.This reduces the chance of a busy service continuing to be overloaded. Wenn viele Instanzen einer Anwendung einen Dienst ständig mit Wiederholungsanforderungen überlasten, benötigt der Dienst mehr Zeit zur Wiederherstellung.If many instances of an application are continually overwhelming a service with retry requests, it'll take the service longer to recover.

Schlägt die Anforderung immer noch fehl, kann die Anwendung warten und einen erneuten Versuch unternehmen.If the request still fails, the application can wait and make another attempt. Bei Bedarf kann dieser Vorgang mit zunehmender Verzögerung zwischen den Wiederholungsversuchen ausgeführt werden, bis eine maximale Anzahl von Anforderungsversuchen unternommen wurde.If necessary, this process can be repeated with increasing delays between retry attempts, until some maximum number of requests have been attempted. Die Verzögerung kann inkrementell oder exponentiell erhöht werden, je nach Art des Fehlers und der Wahrscheinlichkeit, dass er während dieser Zeit behoben wird.The delay can be increased incrementally or exponentially, depending on the type of failure and the probability that it'll be corrected during this time.

Das folgende Diagramm veranschaulicht das Aufrufen eines Vorgangs in einem gehosteten Dienst mithilfe dieses Musters.The following diagram illustrates invoking an operation in a hosted service using this pattern. Wenn die Anforderung nach einer vordefinierten Anzahl von Versuchen nicht erfolgreich ausgeführt werden kann, sollte die Anwendung den Fehler als Ausnahme behandeln und entsprechend vorgehen.If the request is unsuccessful after a predefined number of attempts, the application should treat the fault as an exception and handle it accordingly.

Abbildung 1: Aufrufen eines Vorgangs in einem gehosteten Dienst mithilfe des Wiederholungsmusters

Die Anwendung sollte alle Zugriffsversuche auf einen Remotedienst in Code einschließen, der eine Wiederholungsrichtlinie implementiert, die einer der oben aufgeführten Strategien entspricht.The application should wrap all attempts to access a remote service in code that implements a retry policy matching one of the strategies listed above. Anforderungen, die an verschiedene Dienste gesendet werden, können unterschiedliche Richtlinien unterliegen.Requests sent to different services can be subject to different policies. Einige Anbieter stellen Bibliotheken bereit, die Wiederholungsrichtlinien implementieren, in denen die Anwendung die maximale Anzahl von Wiederholungen, die Zeit zwischen Wiederholungsversuchen und andere Parameter angeben kann.Some vendors provide libraries that implement retry policies, where the application can specify the maximum number of retries, the time between retry attempts, and other parameters.

Eine Anwendung sollte die Details der Fehler und fehlgeschlagenen Vorgänge protokollieren.An application should log the details of faults and failing operations. Diese Informationen sind für Betreiber nützlich.This information is useful to operators. Wenn ein Dienst häufig nicht verfügbar oder ausgelastet ist, liegt dies oft daran, dass die Ressourcen des Diensts ausgeschöpft sind.If a service is frequently unavailable or busy, it's often because the service has exhausted its resources. Sie können die Häufigkeit dieser Fehler reduzieren, indem Sie den Dienst horizontal skalieren.You can reduce the frequency of these faults by scaling out the service. Wenn beispielsweise ein Datenbankdienst ständig überlastet ist, kann es nützlich sein, die Datenbank zu partitionieren und die Last auf mehrere Server zu verteilen.For example, if a database service is continually overloaded, it might be beneficial to partition the database and spread the load across multiple servers.

Microsoft Entity Framework bietet Funktionen für das Wiederholen von Datenbankvorgängen.Microsoft Entity Framework provides facilities for retrying database operations. Auch die meisten Azure-Dienste und Client-SDKs enthalten einen Wiederholungsmechanismus.Also, most Azure services and client SDKs include a retry mechanism. Weitere Informationen finden Sie unter Wiederholungsanleitung für bestimmte Dienste.For more information, see Retry guidance for specific services.

Probleme und ÜberlegungenIssues and considerations

Bei der Entscheidung, wie dieses Muster implementiert werden soll, sind die folgenden Punkte zu beachten.You should consider the following points when deciding how to implement this pattern.

Die Wiederholungsrichtlinie sollte entsprechend den geschäftlichen Anforderungen der Anwendung und der Art des Fehlers angepasst werden.The retry policy should be tuned to match the business requirements of the application and the nature of the failure. Bei einigen nicht kritischen Vorgängen ist es besser, Fail-Fast-fähig zu sein, statt sie mehrere Male zu wiederholen und dadurch den Durchsatz der Anwendung zu verringern.For some noncritical operations, it's better to fail fast rather than retry several times and impact the throughput of the application. Bei einer interaktiven Webanwendung, die auf einen Remotedienst zugreift, ist es beispielsweise besser, nach einer kleineren Anzahl von Wiederholungen mit nur einer kurzen Verzögerung zwischen den Wiederholungsversuchen einen Fehler auszugeben und dem Benutzer eine entsprechende Meldung anzuzeigen (z. B. „Versuchen Sie es später noch einmal“).For example, in an interactive web application accessing a remote service, it's better to fail after a smaller number of retries with only a short delay between retry attempts, and display a suitable message to the user (for example, “please try again later”). Bei einer Batchanwendung ist es möglicherweise besser, die Anzahl der Wiederholungsversuche mit einer exponentiell zunehmenden Verzögerung zwischen den einzelnen Versuchen zu erhöhen.For a batch application, it might be more appropriate to increase the number of retry attempts with an exponentially increasing delay between attempts.

Durch eine aggressive Wiederholungsrichtlinie mit minimaler Verzögerung zwischen den Versuchen und einer großen Anzahl von Wiederholungen kann ein ausgelasteter Dienst, der nahe oder an seiner Kapazitätsgrenze ausgeführt wird, zusätzlich beeinträchtigt werden.An aggressive retry policy with minimal delay between attempts, and a large number of retries, could further degrade a busy service that's running close to or at capacity. Diese Wiederholungsrichtlinie könnte sich auch auf die Reaktionsfähigkeit der Anwendung auswirken, wenn ständig versucht wird, einen fehlgeschlagenen Vorgang auszuführen.This retry policy could also affect the responsiveness of the application if it's continually trying to perform a failing operation.

Wenn eine Anforderung nach einer erheblichen Anzahl von Wiederholungen immer noch fehlschlägt, ist es besser, wenn die Anwendung weitere Anforderungen an die gleiche Ressource verhindert und einfach sofort einen Fehler meldet.If a request still fails after a significant number of retries, it's better for the application to prevent further requests going to the same resource and simply report a failure immediately. Nach Ablauf des Zeitraums kann die Anwendung eine oder mehrere Anforderungen vorläufig zulassen, um festzustellen, ob diese erfolgreich ausgeführt werden.When the period expires, the application can tentatively allow one or more requests through to see whether they're successful. Weitere Informationen zu dieser Strategie finden Sie unter Trennschalter-Muster.For more details of this strategy, see the Circuit Breaker pattern.

Achten Sie darauf, ob der Vorgang idempotent ist.Consider whether the operation is idempotent. Wenn das der Fall ist, ist eine Wiederholung grundsätzlich sicher.If so, it's inherently safe to retry. Andernfalls könnte der Vorgang bei Wiederholungen mehr als einmal ausgeführt werden, was unbeabsichtigte Nebeneffekte haben kann.Otherwise, retries could cause the operation to be executed more than once, with unintended side effects. Beispielsweise kann ein Dienst die Anforderung empfangen, sie erfolgreich verarbeiten, jedoch das Senden einer Antwort fehlschlagen.For example, a service might receive the request, process the request successfully, but fail to send a response. An diesem Punkt kann die Wiederholungslogik die Anforderung erneut senden, da davon ausgegangen wird, dass die erste Anforderung nicht empfangen wurde.At that point, the retry logic might re-send the request, assuming that the first request wasn't received.

Eine Anforderung an einen Dienst kann aus einer Vielzahl von Gründen fehlschlagen, die je nach Art des Fehlers verschiedene Ausnahmen auslösen.A request to a service can fail for a variety of reasons raising different exceptions depending on the nature of the failure. Einige Ausnahmen geben einen Fehler an, der schnell behoben werden kann, während andere angeben, dass der Fehler länger andauert.Some exceptions indicate a failure that can be resolved quickly, while others indicate that the failure is longer lasting. Es ist nützlich, wenn bei der Wiederholungsrichtlinie der Zeitraum zwischen den Wiederholungsversuchen entsprechend dem Typ der Ausnahme angepasst wird.It's useful for the retry policy to adjust the time between retry attempts based on the type of the exception.

Beachten Sie, wie sich das Wiederholen eines Vorgangs, der Teil einer Transaktion ist, auf die Transaktionskonsistenz insgesamt auswirkt.Consider how retrying an operation that's part of a transaction will affect the overall transaction consistency. Nehmen Sie eine Feinanpassung der Wiederholungsrichtlinie für Transaktionsvorgänge vor, um die Wahrscheinlichkeit einer erfolgreichen Ausführung zu erhöhen und die Notwendigkeit zu verringern, alle Transaktionsschritte rückgängig zu machen.Fine tune the retry policy for transactional operations to maximize the chance of success and reduce the need to undo all the transaction steps.

Stellen Sie sicher, dass der gesamte Wiederholungscode vollständig für eine Vielzahl von Fehlerbedingungen getestet ist.Ensure that all retry code is fully tested against a variety of failure conditions. Vergewissern Sie sich, dass er keine schwerwiegenden Auswirkungen auf die Leistungsfähigkeit oder Zuverlässigkeit der Anwendung hat, keine übermäßige Auslastung von Diensten und Ressourcen bewirkt und auch keine Racebedingungen oder Engpässe erzeugt.Check that it doesn't severely impact the performance or reliability of the application, cause excessive load on services and resources, or generate race conditions or bottlenecks.

Implementieren Sie eine Wiederholungslogik nur unter Berücksichtigung des gesamten Kontexts eines fehlgeschlagenen Vorgangs.Implement retry logic only where the full context of a failing operation is understood. Wenn beispielsweise eine Aufgabe, die eine Wiederholungsrichtlinie enthält, eine andere Aufgabe aufruft, die ebenfalls eine Wiederholungsrichtlinie enthält, kann diese zusätzliche Ebene von Wiederholungen zu lange Verzögerungen bei der Verarbeitung führen.For example, if a task that contains a retry policy invokes another task that also contains a retry policy, this extra layer of retries can add long delays to the processing. Möglicherweise ist es besser, die Aufgabe auf niedrigerer Ebene so zu konfigurieren, dass sie Fail-Fast-fähig ist und die Ursache des Fehlers an die Aufgabe zurückmeldet, von der sie aufgerufen wurde.It might be better to configure the lower-level task to fail fast and report the reason for the failure back to the task that invoked it. Diese Aufgabe auf höherer Ebene kann dann den Fehler basierend auf ihrer eigenen Richtlinie behandeln.This higher-level task can then handle the failure based on its own policy.

Es ist wichtig, alle Konnektivitätsfehler zu protokollieren, die zu einer Wiederholung führen, damit zugrunde liegende Probleme mit der Anwendung, Diensten oder Ressourcen ermittelt werden können.It's important to log all connectivity failures that cause a retry so that underlying problems with the application, services, or resources can be identified.

Untersuchen Sie die Fehler, die am wahrscheinlichsten für einen Dienst oder eine Ressource auftreten können, um festzustellen, ob diese wahrscheinlich lang andauernd oder terminal sind.Investigate the faults that are most likely to occur for a service or a resource to discover if they're likely to be long lasting or terminal. Wenn das der Fall ist, sollte der Fehler besser als Ausnahme behandelt werden.If they are, it's better to handle the fault as an exception. Die Anwendung kann die Ausnahme melden oder protokollieren und dann fortfahren, indem entweder ein alternativer Dienst (sofern verfügbar) aufgerufen oder eingeschränkte Funktionalität geboten wird.The application can report or log the exception, and then try to continue either by invoking an alternative service (if one is available), or by offering degraded functionality. Weitere Informationen zum Erkennen und Behandeln lang andauernder Fehler finden Sie unter der Trennschalter-Muster.For more information on how to detect and handle long-lasting faults, see the Circuit Breaker pattern.

Verwendung dieses MustersWhen to use this pattern

Verwenden Sie dieses Muster, wenn es bei einer Anwendung zu vorübergehenden Fehlern bei der Interaktion mit einem Remotedienst oder dem Zugriff auf eine Remoteressource kommen kann.Use this pattern when an application could experience transient faults as it interacts with a remote service or accesses a remote resource. Diese Fehler sind erwartungsgemäß von kurzer Dauer und das Wiederholen einer zuvor fehlgeschlagenen Anforderung kann bei einem weiteren Versuch erfolgreich sein.These faults are expected to be short lived, and repeating a request that has previously failed could succeed on a subsequent attempt.

Dieses Muster ist in folgenden Fällen möglicherweise nicht geeignet:This pattern might not be useful:

  • Wenn ein Fehler wahrscheinlich länger andauert, da sich dies auf die Reaktionsfähigkeit einer Anwendung auswirken kann.When a fault is likely to be long lasting, because this can affect the responsiveness of an application. Die Anwendung verschwendet möglicherweise Zeit und Ressourcen bei dem Versuch, eine Anforderung zu wiederholen, die wahrscheinlich fehlschlägt.The application might be wasting time and resources trying to repeat a request that's likely to fail.
  • Bei der Behandlung von Fehlern, die nicht auf vorübergehenden Fehlern basieren, z. B. interne Ausnahmen, die auf Fehler in der Geschäftslogik einer Anwendung zurückzuführen sind.For handling failures that aren't due to transient faults, such as internal exceptions caused by errors in the business logic of an application.
  • Als Alternative zur Behebung von Skalierbarkeitsproblemen in einem System.As an alternative to addressing scalability issues in a system. Wenn bei einer Anwendung häufig Auslastungsfehler auftreten, ist dies oft ein Zeichen dafür, dass der Dienst oder die Ressource, auf den bzw. die zugegriffen wird, hochskaliert werden sollte.If an application experiences frequent busy faults, it's often a sign that the service or resource being accessed should be scaled up.

BeispielExample

Dieses Beispiel in C# zeigt eine Implementierung des Wiederholungsmusters.This example in C# illustrates an implementation of the Retry pattern. Die unten gezeigte Methode OperationWithBasicRetryAsync ruft einen externen Dienst asynchron über die Methode TransientOperationAsync auf.The OperationWithBasicRetryAsync method, shown below, invokes an external service asynchronously through the TransientOperationAsync method. Die Details der Methode TransientOperationAsync entsprechen dem jeweiligen Dienst und sind im Beispielcode ausgelassen.The details of the TransientOperationAsync method will be specific to the service and are omitted from the sample code.

private int retryCount = 3;
private readonly TimeSpan delay = TimeSpan.FromSeconds(5);

public async Task OperationWithBasicRetryAsync()
{
  int currentRetry = 0;

  for (;;)
  {
    try
    {
      // Call external service.
      await TransientOperationAsync();

      // Return or break.
      break;
    }
    catch (Exception ex)
    {
      Trace.TraceError("Operation Exception");

      currentRetry++;

      // Check if the exception thrown was a transient exception
      // based on the logic in the error detection strategy.
      // Determine whether to retry the operation, as well as how
      // long to wait, based on the retry strategy.
      if (currentRetry > this.retryCount || !IsTransient(ex))
      {
        // If this isn't a transient error or we shouldn't retry,
        // rethrow the exception.
        throw;
      }
    }

    // Wait to retry the operation.
    // Consider calculating an exponential delay here and
    // using a strategy best suited for the operation and fault.
    await Task.Delay(delay);
  }
}

// Async method that wraps a call to a remote service (details not shown).
private async Task TransientOperationAsync()
{
  ...
}

Die Anweisung, mit der diese Methode aufgerufen wird, befindet sich in einem try/catch-Block, der in eine for-Schleife eingeschlossen ist.The statement that invokes this method is contained in a try/catch block wrapped in a for loop. Die for-Schleife wird beendet, wenn die TransientOperationAsync-Methode erfolgreich aufgerufen und keine Ausnahme ausgelöst wird.The for loop exits if the call to the TransientOperationAsync method succeeds without throwing an exception. Wenn die TransientOperationAsync-Methode fehlschlägt, wird mit dem catch-Block die Ursache des Fehlers überprüft.If the TransientOperationAsync method fails, the catch block examines the reason for the failure. Wird davon ausgegangen, dass es sich um einen vorübergehenden Fehler handelt, wartet der Code für eine kurzen Verzögerungszeit, bevor der Vorgang wiederholt wird.If it's believed to be a transient error the code waits for a short delay before retrying the operation.

Die for-Schleife verfolgt auch die Anzahl, wie oft eine Ausführung des Vorgangs versucht wurde, und wenn der Code dreimal fehlschlägt, wird davon ausgegangen, dass die Ausnahme länger andauert.The for loop also tracks the number of times that the operation has been attempted, and if the code fails three times the exception is assumed to be more long lasting. Wenn die Ausnahme nicht vorübergehend ist oder lang andauert, löst der catch-Handler eine Ausnahme aus.If the exception isn't transient or it's long lasting, the catch handler throws an exception. Diese Ausnahme beendet die for-Schleife und sollte von dem Code abgefangen werden, der die OperationWithBasicRetryAsync-Methode aufruft.This exception exits the for loop and should be caught by the code that invokes the OperationWithBasicRetryAsync method.

Die unten gezeigte IsTransient-Methode prüft auf einen bestimmten Satz von Ausnahmen, die für die Umgebung relevant sind, in der der Code ausgeführt wird.The IsTransient method, shown below, checks for a specific set of exceptions that are relevant to the environment the code is run in. Die Definition einer vorübergehenden Ausnahme unterscheidet sich je nach Ressourcen, auf die zugegriffen wird, und der Umgebung, in der der Vorgang ausgeführt wird.The definition of a transient exception will vary according to the resources being accessed and the environment the operation is being performed in.

private bool IsTransient(Exception ex)
{
  // Determine if the exception is transient.
  // In some cases this is as simple as checking the exception type, in other
  // cases it might be necessary to inspect other properties of the exception.
  if (ex is OperationTransientException)
    return true;

  var webException = ex as WebException;
  if (webException != null)
  {
    // If the web exception contains one of the following status values
    // it might be transient.
    return new[] {WebExceptionStatus.ConnectionClosed,
                  WebExceptionStatus.Timeout,
                  WebExceptionStatus.RequestCanceled }.
            Contains(webException.Status);
  }

  // Additional exception checking logic goes here.
  return false;
}
  • Muster „Trennschalter“.Circuit Breaker pattern. Wenn bei einem Fehler davon ausgegangen wird, dass er länger andauert, ist es möglicherweise besser, das Trennschalter-Muster zu implementieren.If a failure is expected to be more long lasting, it might be more appropriate to implement the Circuit Breaker pattern. Die Kombination von Wiederholungs-und Schutzschaltermustern stellt einen umfassenden Ansatz für die Behandlung von Fehlern dar.Combining the Retry and Circuit Breaker patterns provides a comprehensive approach to handling faults.

  • Für die meisten Azure-Dienste enthalten die Client-SDKs integrierte Wiederholungslogik.For most Azure services, the client SDKs include built-in retry logic. Weitere Informationen finden Sie unter Wiederholungsanleitung für Azure-Dienste.For more information, see Retry guidance for Azure services.

  • Bevor Sie benutzerdefinierte Wiederholungslogik schreiben, sollten Sie ein allgemeines Framework wie z. B. Polly für .NET oder Resilience4j für Java in Betracht ziehen.Before writing custom retry logic, consider using a general framework such as Polly for .NET or Resilience4j for Java.