Wiederholungsanleitung für Azure-DiensteRetry guidance for Azure services

Die meisten Azure-Dienste und Client-SDKs enthalten einen Wiederholungsmechanismus.Most Azure services and client SDKs include a retry mechanism. Diese unterscheiden sich jedoch, da jeder Dienst unterschiedliche Merkmale und Anforderungen hat und somit jeder Wiederholungsmechanismus für einen bestimmten Dienst optimiert ist.However, these differ because each service has different characteristics and requirements, and so each retry mechanism is tuned to a specific service. Dieses Handbuch fasst die Wiederholungsmechanismusfunktionen für die Mehrzahl der Azure-Dienste zusammen und enthält Informationen, mit denen Sie die Wiederholungsmechanismus für diesen Dienst verwenden, anpassen oder erweitern können.This guide summarizes the retry mechanism features for the majority of Azure services, and includes information to help you use, adapt, or extend the retry mechanism for that service.

Allgemeine Anweisungen zum Behandeln von vorübergehenden Fehlern und für Wiederholungsverbindungen und Operationen für Dienste und Ressourcen finden Sie unter Wiederholungsanleitung.For general guidance on handling transient faults, and retrying connections and operations against services and resources, see Retry guidance.

In der folgende Tabelle werden die Wiederholungsfunktionen für die in dieser Anleitung beschriebenen Azure-Dienste zusammengefasst.The following table summarizes the retry features for the Azure services described in this guidance.

ServiceService WiederholungsfunktionenRetry capabilities RichtlinienkonfigurationPolicy configuration UmfangScope TelemetriefunktionenTelemetry features
Azure Active DirectoryAzure Active Directory Nativ in ADAL-BibliothekNative in ADAL library Eingebettet in ADAL-BibliothekEmbedded into ADAL library InternInternal KeineNone
Cosmos DBCosmos DB Systemeigen im DienstNative in service Nicht konfigurierbarNon-configurable GlobalGlobal TraceSourceTraceSource
Data Lake StoreData Lake Store Systemeigen in ClientNative in client Nicht konfigurierbarNon-configurable Einzelne VorgängeIndividual operations KeineNone
Event HubsEvent Hubs Systemeigen in ClientNative in client ProgrammgesteuertProgrammatic ClientClient KeineNone
IoT HubIoT Hub Nativ im Client SDKNative in client SDK ProgrammgesteuertProgrammatic ClientClient KeineNone
Azure Cache for RedisAzure Cache for Redis Systemeigen in ClientNative in client ProgrammgesteuertProgrammatic ClientClient TextWriterTextWriter
SearchSearch Systemeigen in ClientNative in client ProgrammgesteuertProgrammatic ClientClient ETW oder benutzerdefiniertETW or Custom
Service BusService Bus Systemeigen in ClientNative in client ProgrammgesteuertProgrammatic Namespace-Manager, Messaging Factory und ClientNamespace Manager, Messaging Factory, and Client ETWETW
Service FabricService Fabric Systemeigen in ClientNative in client ProgrammgesteuertProgrammatic ClientClient KeineNone
SQL-Datenbank mit ADO.NETSQL Database with ADO.NET PollyPolly Deklarativ und programmatischDeclarative and programmatic Einzelne Anweisungen oder CodeblöckeSingle statements or blocks of code BenutzerdefiniertCustom
SQL-Datenbank mit Entity FrameworkSQL Database with Entity Framework Systemeigen in ClientNative in client ProgrammgesteuertProgrammatic Global pro AppDomainGlobal per AppDomain KeineNone
SQL-Datenbank mit Entity Framework CoreSQL Database with Entity Framework Core Systemeigen in ClientNative in client ProgrammgesteuertProgrammatic Global pro AppDomainGlobal per AppDomain KeineNone
StorageStorage Systemeigen in ClientNative in client ProgrammgesteuertProgrammatic Clientvorgänge und einzelne VorgängeClient and individual operations TraceSourceTraceSource

Hinweis

Für die meisten der integrierten Azure-Mechanismen gibt es derzeit keine Möglichkeit, unterschiedliche Wiederholungsrichtlinien für verschiedene Arten von Fehlern oder Ausnahmen anzuwenden.For most of the Azure built-in retry mechanisms, there is currently no way apply a different retry policy for different types of error or exception. Konfigurieren Sie eine Richtlinie mit optimalem Leistungs- und Verfügbarkeitsdurchschnitt.You should configure a policy that provides the optimum average performance and availability. Eine Möglichkeit zur Optimierung der Richtlinie ist die Analyse von Protokolldateien, um den Typ der vorübergehenden Fehler zu bestimmen, die auftreten.One way to fine-tune the policy is to analyze log files to determine the type of transient faults that are occurring.

Azure Active DirectoryAzure Active Directory

Azure Active Directory (Azure AD) ist eine umfassende Cloud-Lösung für die Identitäts- und Zugriffsverwaltung, die zentrale Verzeichnisdienste, eine erweiterte Identitätsgovernance, Sicherheit und Zugriffsverwaltung von Anwendungen kombiniert.Azure Active Directory (Azure AD) is a comprehensive identity and access management cloud solution that combines core directory services, advanced identity governance, security, and application access management. Azure AD bietet Entwicklern auf der Grundlage von zentralen Richtlinien und Regeln auch eine Plattform für die Identitätsverwaltung zur Bereitstellung einer Zugriffssteuerung für deren Anwendungen.Azure AD also offers developers an identity management platform to deliver access control to their applications, based on centralized policy and rules.

Hinweis

Eine Anleitung zu Wiederholungen für Endpunkte der verwalteten Dienstidentität finden Sie unter Verwenden der verwalteten Dienstidentität (Managed Service Identity, MSI) eines virtuellen Azure-Computers für den Tokenabruf.For retry guidance on Managed Service Identity endpoints, see How to use an Azure VM Managed Service Identity (MSI) for token acquisition.

WiederholungsmechanismusRetry mechanism

In der Active Directory-Authentifizierungsbibliothek (ADAL) ist ein integrierter Wiederholungsmechanismus für Azure Active Directory enthalten.There is a built-in retry mechanism for Azure Active Directory in the Active Directory Authentication Library (ADAL). Zur Vermeidung von unerwarteten Sperrungen empfehlen wir, für Drittanbieterbibliotheken und -anwendungscode keine Wiederholungsversuche zum Herstellen von fehlgeschlagenen Verbindungen durchzuführen, sondern die Verarbeitung von Wiederholungsversuchen ADAL zu überlassen.To avoid unexpected lockouts, we recommend that third-party libraries and application code do not retry failed connections, but allow ADAL to handle retries.

Gebrauchsanleitung WiederholungenRetry usage guidance

Berücksichtigen Sie Bei Verwendung von Azure Active Directory die folgenden Richtlinien:Consider the following guidelines when using Azure Active Directory:

  • Verwenden Sie nach Möglichkeit die ADAL-Bibliothek und die integrierte Unterstützung für Wiederholungsversuche.When possible, use the ADAL library and the built-in support for retries.
  • Wenn Sie die REST-API für Azure Active Directory verwenden, wiederholen Sie den Vorgang, wenn der Ergebniscode 429 (Zu viele Anforderungen) lautet oder das Ergebnis ein Fehler im Bereich 5xx ist.If you are using the REST API for Azure Active Directory, retry the operation if the result code is 429 (Too Many Requests) or an error in the 5xx range. Bei anderen Fehlern den Vorgang nicht wiederholen.Do not retry for any other errors.
  • Eine exponentielle Backoff-Richtlinie wird für die Verwendung in Batch-Szenarien mit Azure Active Directory empfohlen.An exponential back-off policy is recommended for use in batch scenarios with Azure Active Directory.

Erwägen Sie, mit den folgenden Einstellungen für Wiederholungsvorgänge zu beginnen.Consider starting with the following settings for retrying operations. Hierbei handelt es sich um allgemeine Einstellungen und Sie sollten die Vorgänge überwachen und die Werte entsprechend Ihrem Szenario optimieren.These settings are general purpose, and you should monitor the operations and fine-tune the values to suit your own scenario.

ContextContext Beispiel-Ziel E2E
Maximale Wartezeit
Sample target E2E
max latency
WiederholungsstrategieRetry strategy EinstellungenSettings WerteValues So funktioniert'sHow it works
Interaktiv, BenutzeroberflächeInteractive, UI,
oder Vordergrundor foreground
2 Sek2 sec FixedIntervalFixedInterval Anzahl der WiederholungenRetry count
WiederholungsintervallRetry interval
Erster schneller WiederholungsversuchFirst fast retry
33
500 ms500 ms
truetrue
Versuch 1 – Verzögerung 0 Sek.Attempt 1 - delay 0 sec
Versuch 2 – Verzögerung 500 msAttempt 2 - delay 500 ms
Versuch 3 – Verzögerung 500 msAttempt 3 - delay 500 ms
Hintergrund oderBackground or
Batchbatch
60 Sekunden60 sec ExponentialBackoffExponentialBackoff Anzahl der WiederholungenRetry count
Min. BackoffMin back-off
Max. BackoffMax back-off
Delta-BackoffDelta back-off
Erster schneller WiederholungsversuchFirst fast retry
55
0 Sek.0 sec
60 Sekunden60 sec
2 Sek2 sec
falsefalse
Versuch 1 – Verzögerung 0 Sek.Attempt 1 - delay 0 sec
Versuch 2 – Verzögerung ca. 2 Sek.Attempt 2 - delay ~2 sec
Versuch 3 – Verzögerung ca. 6 Sek.Attempt 3 - delay ~6 sec
Versuch 4 – Verzögerung ca. 14 Sek.Attempt 4 - delay ~14 sec
Versuch 5 – Verzögerung ca. 30 Sek.Attempt 5 - delay ~30 sec

Weitere InformationenMore information

Cosmos DBCosmos DB

Cosmos DB ist eine vollständig verwaltete Datenbank mit mehreren Modellen, die schemalose JSON-Daten unterstützt.Cosmos DB is a fully managed multi-model database that supports schemaless JSON data. Sie bietet konfigurierbare und zuverlässige Leistung, systemeigene JavaScript-Transaktionsverarbeitung und ist für die Cloud mit elastischer Skalierung konzipiert.It offers configurable and reliable performance, native JavaScript transactional processing, and is built for the cloud with elastic scale.

WiederholungsmechanismusRetry mechanism

Die DocumentClient-Klasse führt bei Fehlversuchen automatisch Wiederholungsversuche durch.The DocumentClient class automatically retries failed attempts. Konfigurieren Sie zum Festlegen der Anzahl von Wiederholungsversuchen und der maximalen Wartezeit ConnectionPolicy.RetryOptions.To set the number of retries and the maximum wait time, configure ConnectionPolicy.RetryOptions. Ausnahmen, die vom Client ausgelöst werden, unterliegen entweder nicht der Wiederholungsrichtlinie oder sind keine vorübergehenden Fehler.Exceptions that the client raises are either beyond the retry policy or are not transient errors.

Wenn Cosmos DB den Client einschränkt, wird ein HTTP 429-Fehler zurückgegeben.If Cosmos DB throttles the client, it returns an HTTP 429 error. Überprüfen Sie den Statuscode unter DocumentClientException.Check the status code in the DocumentClientException.

RichtlinienkonfigurationPolicy configuration

Die folgende Tabelle enthält die Standardeinstellungen für die RetryOptions-Klasse.The following table shows the default settings for the RetryOptions class.

EinstellungSetting StandardwertDefault value BESCHREIBUNGDescription
MaxRetryAttemptsOnThrottledRequestsMaxRetryAttemptsOnThrottledRequests 99 Die maximale Anzahl von Wiederholungsversuchen bei einem Fehlschlagen der Anforderung, weil Cosmos DB die Rateneinschränkung auf den Client angewendet hat.The maximum number of retries if the request fails because Cosmos DB applied rate limiting on the client.
MaxRetryWaitTimeInSecondsMaxRetryWaitTimeInSeconds 3030 Die maximale Wiederholungszeit in Sekunden.The maximum retry time in seconds.

BeispielExample

DocumentClient client = new DocumentClient(new Uri(endpoint), authKey); ;
var options = client.ConnectionPolicy.RetryOptions;
options.MaxRetryAttemptsOnThrottledRequests = 5;
options.MaxRetryWaitTimeInSeconds = 15;

TelemetrieTelemetry

Wiederholungsversuche werden als unstrukturierte Ablaufverfolgungsmeldungen über eine .NET TraceSourceprotokolliert.Retry attempts are logged as unstructured trace messages through a .NET TraceSource. Sie müssen einen TraceListener konfigurieren, um die Ereignisse zu erfassen und diese in ein geeignetes Zielprotokoll zu schreiben.You must configure a TraceListener to capture the events and write them to a suitable destination log.

Wenn Sie Ihrer Datei „App.config“ beispielsweise Folgendes hinzugefügt haben, werden die Ablaufverfolgungen in einer Textdatei an demselben Speicherort wie die ausführbare Datei generiert:For example, if you add the following to your App.config file, traces will be generated in a text file in the same location as the executable:

<configuration>
  <system.diagnostics>
    <switches>
      <add name="SourceSwitch" value="Verbose"/>
    </switches>
    <sources>
      <source name="DocDBTrace" switchName="SourceSwitch" switchType="System.Diagnostics.SourceSwitch" >
        <listeners>
          <add name="MyTextListener" type="System.Diagnostics.TextWriterTraceListener" traceOutputOptions="DateTime,ProcessId,ThreadId" initializeData="CosmosDBTrace.txt"></add>
        </listeners>
      </source>
    </sources>
  </system.diagnostics>
</configuration>

Event HubsEvent Hubs

Azure Event Hubs ist ein hyperskalierbarer Dienst für die Erfassung von Telemetriedaten, der Millionen von Ereignissen sammelt, transformiert und speichert.Azure Event Hubs is a hyperscale telemetry ingestion service that collects, transforms, and stores millions of events.

WiederholungsmechanismusRetry mechanism

Das Wiederholungsverhalten in der Azure Event Hubs-Clientbibliothek wird von der RetryPolicy-Eigenschaft in der EventHubClient-Klasse gesteuert.Retry behavior in the Azure Event Hubs Client Library is controlled by the RetryPolicy property on the EventHubClient class. Die Standardrichtlinie führt Wiederholungsversuche mit exponentiell ansteigender Wartezeit durch, wenn Azure Event Hub eine vorübergehende Ausnahme vom Typ EventHubsException oder OperationCanceledException zurückgibt.The default policy retries with exponential backoff when Azure Event Hub returns a transient EventHubsException or an OperationCanceledException.

BeispielExample

EventHubClient client = EventHubClient.CreateFromConnectionString("[event_hub_connection_string]");
client.RetryPolicy = RetryPolicy.Default;

Weitere InformationenMore information

.NET Standard client library for Azure Event Hubs (.NET Standard-Clientbibliothek für Azure Event Hubs).NET Standard client library for Azure Event Hubs

IoT HubIoT Hub

Azure IoT Hub ist ein Dienst zum Verbinden, Überwachen und Verwalten von Geräten für die Entwicklung von IoT-Anwendungen (Internet of Things, Internet der Dinge).Azure IoT Hub is a service for connecting, monitoring, and managing devices to develop Internet of Things (IoT) applications.

WiederholungsmechanismusRetry mechanism

Mit dem Azure IoT-Geräte-SDK können Fehler im Netzwerk, im Protokoll oder in der Anwendung ermittelt werden.The Azure IoT device SDK can detect errors in the network, protocol, or application. Basierend auf dem Fehlertyp überprüft das SDK, ob eine Wiederholung erforderlich ist.Based on the error type, the SDK checks whether a retry needs to be performed. Ist der Fehler behebbar, beginnt das SDK unter Verwendung der Wiederholungsrichtlinie mit der Wiederholung.If the error is recoverable, the SDK begins to retry using the configured retry policy.

Die standardmäßige Wiederholungsrichtlinie ist exponentielles Backoff mit zufälligem Jitter, sie kann jedoch konfiguriert werden.The default retry policy is exponential back-off with random jitter, but it can be configured.

RichtlinienkonfigurationPolicy configuration

Die Richtlinienkonfiguration unterscheidet sich je nach Sprache.Policy configuration differs by language. Weitere Informationen finden Sie unter Verwalten von Konnektivität und zuverlässigem Messaging mithilfe von Azure IoT Hub-Geräte-SDKs.For more details, see IoT Hub retry policy configuration.

Weitere InformationenMore information

Azure Cache for RedisAzure Cache for Redis

Azure Cache for Redis ist ein Dienst für schnellen Datenzugriff und Caching mit niedriger Latenz, der auf dem beliebten Open-Source-Cache Redis basiert.Azure Cache for Redis is a fast data access and low latency cache service based on the popular open-source Redis cache. Er ist sicher, von Microsoft verwaltet und ist von jeder Anwendung in Azure zugänglich.It is secure, managed by Microsoft, and is accessible from any application in Azure.

Die Anleitung in diesem Abschnitt beruht auf der Verwendung des StackExchange.Redis-Clients für den Zugriff auf den Cache.The guidance in this section is based on using the StackExchange.Redis client to access the cache. Eine Liste der anderer geeigneter Clients finden Sie auf der Redis-Website, diese haben möglicherweise unterschiedliche Wiederholungsmechanismen.A list of other suitable clients can be found on the Redis website, and these may have different retry mechanisms.

Beachten Sie, dass der StackExchange.Redis Client Multiplex über eine einzige Verbindung verwendet.Note that the StackExchange.Redis client uses multiplexing through a single connection. Die empfohlene Verwendung ist das Erstellen einer Instanz des Clients beim Starten der Anwendung und die Verwendung dieser Instanz für alle Vorgänge im Cache.The recommended usage is to create an instance of the client at application startup and use this instance for all operations against the cache. Aus diesem Grund wird die Verbindung mit dem Cache nur einmal hergestellt, und die Anleitungen in diesem Abschnitt beziehen sich auf die Wiederholungsrichtlinie für die anfängliche Verbindung – und nicht für jeden Vorgang, der auf den Cache zugreift.For this reason, the connection to the cache is made only once, and so all of the guidance in this section is related to the retry policy for this initial connection—and not for each operation that accesses the cache.

WiederholungsmechanismusRetry mechanism

Der StackExchange.Redis-Client verwendet eine Verbindungs-Manager-Klasse, die über eine Reihe von Optionen konfiguriert ist, z.B.:The StackExchange.Redis client uses a connection manager class that is configured through a set of options, including:

  • ConnectRetry:ConnectRetry. Die Anzahl, wie häufig erneut versucht wird, eine fehlgeschlagene Verbindung mit dem Cache herzustellen.The number of times a failed connection to the cache will be retried.
  • ReconnectRetryPolicy:ReconnectRetryPolicy. Die Wiederholungsstrategie, die verwendet werden soll.The retry strategy to use.
  • ConnectTimeout:ConnectTimeout. Die maximale Wartezeit in Millisekunden.The maximum waiting time in milliseconds.

RichtlinienkonfigurationPolicy configuration

Wiederholungsrichtlinien werden programmgesteuert durch Festlegen der Optionen für den Client konfiguriert, bevor eine Verbindung mit dem Cache hergestellt wird.Retry policies are configured programmatically by setting the options for the client before connecting to the cache. Dies kann durch das Erstellen einer Instanz der ConfigurationOptions-Klasse, das Auffüllen ihrer Eigenschaften und die Übergabe an die Connect-Methode erreicht werden.This can be done by creating an instance of the ConfigurationOptions class, populating its properties, and passing it to the Connect method.

Die integrierten Klassen unterstützen die lineare (konstante) Verzögerung und exponentiell ansteigende Wartezeiten mit zufälligen Wiederholungsintervallen.The built-in classes support linear (constant) delay and exponential backoff with randomized retry intervals. Sie können auch eine benutzerdefinierte Wiederholungsrichtlinie erstellen, indem Sie die IReconnectRetryPolicy-Schnittstelle implementieren.You can also create a custom retry policy by implementing the IReconnectRetryPolicy interface.

Im folgenden Beispiel wird eine Wiederholungsstrategie mit exponentiell ansteigender Wartezeit konfiguriert.The following example configures a retry strategy using exponential backoff.

var deltaBackOffInMilliseconds = TimeSpan.FromSeconds(5).Milliseconds;
var maxDeltaBackOffInMilliseconds = TimeSpan.FromSeconds(20).Milliseconds;
var options = new ConfigurationOptions
{
    EndPoints = {"localhost"},
    ConnectRetry = 3,
    ReconnectRetryPolicy = new ExponentialRetry(deltaBackOffInMilliseconds, maxDeltaBackOffInMilliseconds),
    ConnectTimeout = 2000
};
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(options, writer);

Alternativ können Sie die Optionen als Zeichenfolge angeben und diese an die Connect Methode übergeben.Alternatively, you can specify the options as a string, and pass this to the Connect method. Die ReconnectRetryPolicy-Eigenschaft kann nicht auf diese Weise festgelegt werden, sondern nur per Code.The ReconnectRetryPolicy property cannot be set this way, only through code.

var options = "localhost,connectRetry=3,connectTimeout=2000";
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(options, writer);

Es ist auch möglich, Optionen direkt beim Herstellen der Verbindung mit dem Cache anzugeben.You can also specify options directly when you connect to the cache.

var conn = ConnectionMultiplexer.Connect("redis0:6380,redis1:6380,connectRetry=3");

Weitere Informationen finden Sie unter Configuration (Konfiguration) in der StackExchange.Redis-Dokumentation.For more information, see Stack Exchange Redis Configuration in the StackExchange.Redis documentation.

Die folgende Tabelle zeigt die Standardeinstellungen für die integrierte Wiederholungsrichtlinie.The following table shows the default settings for the built-in retry policy.

ContextContext EinstellungSetting StandardwertDefault value
(v 1.2.2)(v 1.2.2)
BedeutungMeaning
ConfigurationOptionsConfigurationOptions ConnectRetryConnectRetry

ConnectTimeoutConnectTimeout

SyncTimeoutSyncTimeout

ReconnectRetryPolicyReconnectRetryPolicy
33

Maximal 5000 ms plus SyncTimeoutMaximum 5000 ms plus SyncTimeout
10001000

LinearRetry 5000 msLinearRetry 5000 ms
Die Anzahl der Wiederholungen von Verbindungsversuchen während des Erstverbindungsvorgangs.The number of times to repeat connect attempts during the initial connection operation.
Zeitlimit (ms) für Verbindungen.Timeout (ms) for connect operations. Keine Verzögerung zwischen den Wiederholungsversuchen.Not a delay between retry attempts.
Zeit (ms), um synchrone Vorgänge zu ermöglichen.Time (ms) to allow for synchronous operations.

Wiederholung jeweils nach 5000 ms.Retry every 5000 ms.

Hinweis

Für synchrone Vorgänge kann SyncTimeout einen Beitrag zur End-to-End-Wartezeit leisten, aber wenn der Wert zu niedrig festgelegt wird, kann es zu übermäßigen Zeitüberschreitungen kommen.For synchronous operations, SyncTimeout can add to the end-to-end latency, but setting the value too low can cause excessive timeouts. Weitere Informationen finden Sie unter Problembehandlung für Azure Cache for Redis.See How to troubleshoot Azure Cache for Redis. Im Allgemeinen ist es ratsam, die Verwendung von synchronen Vorgängen zu vermeiden und stattdessen asynchrone Vorgänge zu verwenden.In general, avoid using synchronous operations, and use asynchronous operations instead. Weitere Informationen finden Sie unter Pipelines und Multiplexers.For more information, see Pipelines and Multiplexers.

Gebrauchsanleitung WiederholungenRetry usage guidance

Berücksichtigen Sie bei Verwendung von Azure Cache for Redis die folgenden Richtlinien:Consider the following guidelines when using Azure Cache for Redis:

  • Der StackExchange Redis-Client verwaltet seine eigene Wiederholungen, aber nur beim Herstellen einer Verbindung mit dem Cache beim ersten Starten der Anwendung.The StackExchange Redis client manages its own retries, but only when establishing a connection to the cache when the application first starts. Sie können das Verbindungstimeout, die Anzahl von Wiederholungsversuchen und die Dauer zwischen den Wiederholungen zur Herstellung dieser Verbindung konfigurieren, aber die Wiederholungsrichtlinie gilt nicht für Vorgänge für den Cache.You can configure the connection timeout, the number of retry attempts, and the time between retries to establish this connection, but the retry policy does not apply to operations against the cache.
  • Anstatt eine große Anzahl von Wiederholungsversuchen zu verwenden, sollten Sie auf die ursprüngliche Datenquelle zurückgreifen.Instead of using a large number of retry attempts, consider falling back by accessing the original data source instead.

TelemetrieTelemetry

Sie können Informationen zu Verbindungen (aber nicht für andere Vorgänge) mit einem TextWritersammeln.You can collect information about connections (but not other operations) using a TextWriter.

var writer = new StringWriter();
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(options, writer);

Ein Beispiel für die dadurch generierte Ausgabe ist unten dargestellt.An example of the output this generates is shown below.

localhost:6379,connectTimeout=2000,connectRetry=3
1 unique nodes specified
Requesting tie-break from localhost:6379 > __Booksleeve_TieBreak...
Allowing endpoints 00:00:02 to respond...
localhost:6379 faulted: SocketFailure on PING
localhost:6379 failed to nominate (Faulted)
> UnableToResolvePhysicalConnection on GET
No masters detected
localhost:6379: Standalone v2.0.0, master; keep-alive: 00:01:00; int: Connecting; sub: Connecting; not in use: DidNotRespond
localhost:6379: int ops=0, qu=0, qs=0, qc=1, wr=0, sync=1, socks=2; sub ops=0, qu=0, qs=0, qc=0, wr=0, socks=2
Circular op-count snapshot; int: 0 (0.00 ops/s; spans 10s); sub: 0 (0.00 ops/s; spans 10s)
Sync timeouts: 0; fire and forget: 0; last heartbeat: -1s ago
resetting failing connections to retry...
retrying; attempts left: 2...
...

BeispieleExamples

Im folgenden Codebeispiel wird eine konstante (lineare) Verzögerung zwischen Wiederholungsversuchen konfiguriert, wenn der StackExchange.Redis-Client initialisiert wird.The following code example configures a constant (linear) delay between retries when initializing the StackExchange.Redis client. In diesem Beispiel wird veranschaulicht, wie die Konfiguration mit einer ConfigurationOptions-Instanz festgelegt wird.This example shows how to set the configuration using a ConfigurationOptions instance.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using StackExchange.Redis;

namespace RetryCodeSamples
{
    class CacheRedisCodeSamples
    {
        public async static Task Samples()
        {
            var writer = new StringWriter();
            {
                try
                {
                    var retryTimeInMilliseconds = TimeSpan.FromSeconds(4).Milliseconds; // delay between retries

                    // Using object-based configuration.
                    var options = new ConfigurationOptions
                                        {
                                            EndPoints = { "localhost" },
                                            ConnectRetry = 3,
                                            ReconnectRetryPolicy = new LinearRetry(retryTimeInMilliseconds)
                                        };
                    ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(options, writer);

                    // Store a reference to the multiplexer for use in the application.
                }
                catch
                {
                    Console.WriteLine(writer.ToString());
                    throw;
                }
            }
        }
    }
}

Im nächsten Beispiel wird die Konfiguration durch Angeben der Optionen als Zeichenfolge festgelegt.The next example sets the configuration by specifying the options as a string. Das Verbindungstimeout ist der maximale Zeitraum für das Warten auf die Verbindungsherstellung mit dem Cache und nicht die Verzögerung zwischen Wiederholungsversuchen.The connection timeout is the maximum period of time to wait for a connection to the cache, not the delay between retry attempts. Beachten Sie, dass die ReconnectRetryPolicy-Eigenschaft nur per Code festgelegt werden kann.Note that the ReconnectRetryPolicy property can only be set by code.

using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using StackExchange.Redis;

namespace RetryCodeSamples
{
    class CacheRedisCodeSamples
    {
        public async static Task Samples()
        {
            var writer = new StringWriter();
            {
                try
                {
                    // Using string-based configuration.
                    var options = "localhost,connectRetry=3,connectTimeout=2000";
                    ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(options, writer);

                    // Store a reference to the multiplexer for use in the application.
                }
                catch
                {
                    Console.WriteLine(writer.ToString());
                    throw;
                }
            }
        }
    }
}

Weitere Beispiele finden Sie unter Konfiguration auf der Projektwebsite.For more examples, see Configuration on the project website.

Weitere InformationenMore information

Azure Search kann dafür verwendet werden, nützliche und anspruchsvolle Suchfunktionen zu einer Website oder Anwendung hinzuzufügen, Suchergebnisse schnell und einfach zu optimieren und umfassende und fein abgestimmte Rangmodelle zu erstellen.Azure Search can be used to add powerful and sophisticated search capabilities to a website or application, quickly and easily tune search results, and construct rich and fine-tuned ranking models.

WiederholungsmechanismusRetry mechanism

Das Wiederholungsverhalten im Azure Search SDK wird mit der SetRetryPolicy-Methode in den Klassen SearchServiceClient und SearchIndexClient gesteuert.Retry behavior in the Azure Search SDK is controlled by the SetRetryPolicy method on the SearchServiceClient and SearchIndexClient classes. Bei der Standardrichtlinie werden Wiederholungsversuche mit exponentiellem Backoff (exponentiell ansteigende Wartezeiten) durchgeführt, wenn Azure Search eine 5xx- oder 408-Antwort (Anforderungstimeout) zurückgibt.The default policy retries with exponential backoff when Azure Search returns a 5xx or 408 (Request Timeout) response.

TelemetrieTelemetry

Nachverfolgung mit ETW oder per Registrierung eines benutzerdefinierten Ablaufverfolgungsanbieters.Trace with ETW or by registering a custom trace provider. Weitere Informationen finden Sie in der AutoRest-Dokumentation.For more information, see the AutoRest documentation.

Service BusService Bus

Service Bus ist ein Cloud Messaging-Plattform, die lose gekoppelten Nachrichtenaustausch mit verbesserter Skalierbarkeit und Stabilität für die Komponenten einer Anwendung bietet, egal ob in der Cloud oder lokal gehostet.Service Bus is a cloud messaging platform that provides loosely coupled message exchange with improved scale and resiliency for components of an application, whether hosted in the cloud or on-premises.

WiederholungsmechanismusRetry mechanism

Service Bus implementiert Wiederholungen mithilfe von Implementierungen der abstrakten RetryPolicy-Klasse.Service Bus implements retries using implementations of the abstract RetryPolicy class. Der Namespace und einige Konfigurationsdetails sind davon abhängig, welches Service Bus-Client-SDK-Paket verwendet wird:The namespace and some of the configuration details depend on which Service Bus client SDK package is used:

PaketPackage BESCHREIBUNGDescription NamespaceNamespace
Microsoft.Azure.ServiceBusMicrosoft.Azure.ServiceBus Azure Service Bus-Clientbibliothek für .NET Standard.Azure Service Bus client library for .NET Standard. Microsoft.ServiceBus
WindowsAzure.ServiceBusWindowsAzure.ServiceBus Bei diesem Paket handelt es sich um die ältere Service Bus-Clientbibliothek.This package is the older Service Bus client library. Hierfür ist .NET Framework 4.5.2 erforderlich.It requires .Net Framework 4.5.2. Microsoft.Azure.ServiceBus

Beide Versionen der Clientbibliothek stellen die folgenden integrierten Implementierungen von RetryPolicty bereit:Both versions of the client library provide the following built-in implementations of RetryPolicty:

  • RetryExponential:RetryExponential. Implementiert exponentielles Backoff.Implements exponential backoff.

  • NoRetry:NoRetry. Führt keine Wiederholungsversuche aus.Does not perform retries. Verwenden Sie diese Klasse, wenn Sie keine Wiederholungen auf Ebene der Service Bus-API benötigen, beispielsweise wenn Wiederholungen durch einen anderen Prozess im Rahmen eines Batch- oder mehrstufigen Vorgangs verwaltet werden.Use this class when you don't need retries at the Service Bus API level, for example when another process manages retries as part of a batch or multistep operation.

Die RetryPolicy.Default-Eigenschaft gibt eine Standardrichtlinie vom Typ RetryExponential zurück.The RetryPolicy.Default property returns a default policy of type RetryExponential. Dieses Richtlinienobjekt weist die folgenden Einstellungen auf:This policy object has the following settings:

EinstellungSetting StandardwertDefault value BedeutungMeaning
MinimalBackoffMinimalBackoff 00 Das minimale Backoff-Intervall.Minimum back-off interval. Es wird zum Wiederholungsintervall addiert, das auf der Grundlage von deltaBackoff berechnet wurde.Added to the retry interval computed from deltaBackoff.
MaximumBackoffMaximumBackoff 30 Sekunden30 seconds Das maximale Backoff-Intervall.Maximum back-off interval.
DeltaBackoffDeltaBackoff 3 Sekunden3 seconds Backoff-Intervall zwischen den Wiederholungen.Back-off interval between retries. Ein Vielfaches dieser Zeitspanne wird für nachfolgende Wiederholungsversuche verwendet.Multiples of this timespan are used for subsequent retry attempts.
MaxRetryCountMaxRetryCount 55 Die maximale Anzahl von Warnungen.The maximum number of retries. (Der Standardwert ist 10 im WindowsAzure.ServiceBus-Paket.)(Default value is 10 in the WindowsAzure.ServiceBus package.)

Außerdem ist die folgende Eigenschaft im älteren WindowsAzure.ServiceBus-Paket definiert:In addition, the following property is defined in the older WindowsAzure.ServiceBus package:

EinstellungSetting StandardwertDefault value BedeutungMeaning
TerminationTimeBufferTerminationTimeBuffer 5 Sekunden5 seconds Wiederholungsversuche werden abgebrochen, wenn die verbleibende Zeit kleiner als dieser Wert ist.Retry attempts will be abandoned if the remaining time is less than this value.

Service Bus-Aktionen können eine Reihe von Ausnahmen zurückgeben, die unter Service Bus-Messagingausnahmen aufgeführt sind.Service Bus actions can return a range of exceptions, listed in Service Bus messaging exceptions. Die von Service Bus zurückgegebenen Ausnahmen machen die IsTransient-Eigenschaft verfügbar, die angibt, ob der Client den Vorgang wiederholen soll.Exceptions returned from Service Bus expose the IsTransient property that indicates whether the client should retry the operation. Die integrierte Richtlinie RetryExponential überprüft diese Eigenschaft, bevor ein erneuter Versuch gestartet wird.The built-in RetryExponential policy checks this property before retrying.

Wenn es sich bei der zuletzt aufgetretenen Ausnahme um ServerBusyException handelt, fügt die Richtlinie RetryExponential dem berechneten Wiederholungsintervall 10 Sekunden hinzu.If the last exception encountered was ServerBusyException, the RetryExponential policy adds 10 seconds to the computed retry interval. Dieser Wert kann nicht geändert werden.This value cannot be changed.

Benutzerdefinierte Implementierungen können eine Kombination aus Ausnahmetyp und der IsTransient-Eigenschaft verwenden, um eine genauere Steuerung der Wiederholungsaktionen zu ermöglichen.Custom implementations could use a combination of the exception type and the IsTransient property to provide more fine-grained control over retry actions. Sie können z.B. eine QuotaExceededException erkennen und Maßnahmen ergreifen, um die Warteschlange zu leeren, bevor erneut versucht wird, darüber eine Nachricht zu senden.For example, you could detect a QuotaExceededException and take action to drain the queue before retrying sending a message to it.

Der folgende Code legt die Wiederholungsrichtlinie für einen Service Bus-Client mithilfe der Microsoft.Azure.ServiceBus-Bibliothek fest:The following code sets the retry policy on a Service Bus client using the Microsoft.Azure.ServiceBus library:

const string QueueName = "queue1";
const string ServiceBusConnectionString = "<your_connection_string>";

var policy = new RetryExponential(
    minimumBackoff: TimeSpan.FromSeconds(10),
    maximumBackoff: TimeSpan.FromSeconds(30),
    maximumRetryCount: 3);
var queueClient = new QueueClient(ServiceBusConnectionString, QueueName, ReceiveMode.PeekLock, policy);

Die Wiederholungsrichtlinie kann auf der individuellen Vorgangsebene festgelegt werden.The retry policy cannot be set at the individual operation level. Sie gilt für alle Vorgänge des Clients.It applies to all operations for the client.

Gebrauchsanleitung WiederholungenRetry usage guidance

Berücksichtigen Sie bei Verwendung von Service Bus die folgenden Richtlinien:Consider the following guidelines when using Service Bus:

  • Implementieren Sie bei Verwendung der integrierten RetryExponential -Implementierung keinen Fallbackvorgang, da die Richtlinie auf Server Busy-Ausnahmen reagiert und automatisch in einen entsprechenden Wiederholungsmodus wechselt.When using the built-in RetryExponential implementation, do not implement a fallback operation as the policy reacts to Server Busy exceptions and automatically switches to an appropriate retry mode.
  • Service Bus unterstützt eine Funktion namens Paired Namespace, mit der automatisches Failover zu einer Backup-Warteschlange in einem separaten Namespace implementiert wird, falls die Warteschlange im primären Namespace fehlschlägt.Service Bus supports a feature called Paired Namespaces that implements automatic failover to a backup queue in a separate namespace if the queue in the primary namespace fails. Nachrichten aus der sekundären Warteschlange können an die primäre Warteschlange gesendet werden, wenn diese wiederhergestellt wird.Messages from the secondary queue can be sent back to the primary queue when it recovers. Mit dieser Funktion können vorübergehender Fehler behandelt werden.This feature helps to address transient failures. Weitere Informationen finden Sie unter Asynchrone Nachrichtenmuster und Hochverfügbarkeit.For more information, see Asynchronous Messaging Patterns and High Availability.

Erwägen Sie, mit den folgenden Einstellungen für Wiederholungsvorgänge zu beginnen.Consider starting with the following settings for retrying operations. Hierbei handelt es sich um allgemeine Einstellungen und Sie sollten die Vorgänge überwachen und die Werte entsprechend Ihrem Szenario optimieren.These settings are general purpose, and you should monitor the operations and fine-tune the values to suit your own scenario.

KontextContext Beispiel für maximale WartezeitExample maximum latency WiederholungsrichtlinieRetry policy EinstellungenSettings So funktioniert'sHow it works
Interaktiv, Benutzeroberfläche oder VordergrundInteractive, UI, or foreground 2 Sekunden*2 seconds* ExponentiellExponential MinimumBackoff = 0MinimumBackoff = 0
MaximumBackoff = 30 sMaximumBackoff = 30 sec.
DeltaBackoff = 300 msDeltaBackoff = 300 msec.
TimeBuffer = 300 msTimeBuffer = 300 msec.
MaxRetryCount = 2MaxRetryCount = 2
1. Versuch: Verzögerung: 0 sAttempt 1: Delay 0 sec.
2. Versuch: Verzögerung: ~300 msAttempt 2: Delay ~300 msec.
3. Versuch: Verzögerung: ~900 msAttempt 3: Delay ~900 msec.
Hintergrund oder BatchBackground or batch 30 Sekunden30 seconds ExponentiellExponential MinimumBackoff = 1MinimumBackoff = 1
MaximumBackoff = 30 sMaximumBackoff = 30 sec.
DeltaBackoff = 1,75 sDeltaBackoff = 1.75 sec.
TimeBuffer = 5 sTimeBuffer = 5 sec.
MaxRetryCount = 3MaxRetryCount = 3
1. Versuch: Verzögerung: ~1 sAttempt 1: Delay ~1 sec.
2. Versuch: Verzögerung: ~3 sAttempt 2: Delay ~3 sec.
3. Versuch: Verzögerung: ~6 msAttempt 3: Delay ~6 msec.
4. Versuch: Verzögerung: ~13 msAttempt 4: Delay ~13 msec.

*Ohne Berücksichtigung der Verzögerung, die hinzukommt, wenn eine Antwort vom Typ „Server ausgelastet“ empfangen wird.* Not including additional delay that is added if a Server Busy response is received.

TelemetrieTelemetry

Service Bus protokollieren Wiederholungen als ETW-Ereignisse mit einer EventSource.Service Bus logs retries as ETW events using an EventSource. Sie müssen einen EventListener an die Ereignisquelle anfügen, um die Ereignisse zu erfassen und in Performance-Viewer anzuzeigen oder diese in ein geeignetes Ziel-Protokoll schreiben.You must attach an EventListener to the event source to capture the events and view them in Performance Viewer, or write them to a suitable destination log. Die Wiederholungsereignisse sind im folgenden Format:The retry events are of the following form:

Microsoft-ServiceBus-Client/RetryPolicyIteration
ThreadID="14,500"
FormattedMessage="[TrackingId:] RetryExponential: Operation Get:https://retry-tests.servicebus.windows.net/TestQueue/?api-version=2014-05 at iteration 0 is retrying after 00:00:00.1000000 sleep because of Microsoft.ServiceBus.Messaging.MessagingCommunicationException: The remote name could not be resolved: 'retry-tests.servicebus.windows.net'.TrackingId:6a26f99c-dc6d-422e-8565-f89fdd0d4fe3, TimeStamp:9/5/2014 10:00:13 PM."
trackingId=""
policyType="RetryExponential"
operation="Get:https://retry-tests.servicebus.windows.net/TestQueue/?api-version=2014-05"
iteration="0"
iterationSleep="00:00:00.1000000"
lastExceptionType="Microsoft.ServiceBus.Messaging.MessagingCommunicationException"
exceptionMessage="The remote name could not be resolved: 'retry-tests.servicebus.windows.net'.TrackingId:6a26f99c-dc6d-422e-8565-f89fdd0d4fe3,TimeStamp:9/5/2014 10:00:13 PM"

BeispieleExamples

Das folgende Codebeispiel zeigt, wie Sie die Wiederholungsrichtlinie festlegen für:The following code example shows how to set the retry policy for:

  • Einen Namespace-Manager.A namespace manager. Die Richtlinie gilt für alle Vorgänge dieses Managers und kann nicht durch einzelne Vorgänge überschrieben werden.The policy applies to all operations on that manager, and cannot be overridden for individual operations.
  • Eine Messaging-Factory.A messaging factory. Die Richtlinie gilt für alle Clients, die von dieser Factory erstellt wurden, und kann bei der Erstellung einzelner Clients nicht überschrieben werden.The policy applies to all clients created from that factory, and cannot be overridden when creating individual clients.
  • Ein einzelner Messaging Client.An individual messaging client. Nachdem ein Client erstellt wurde, können Sie die Wiederholungsrichtlinie für diesen festlegen.After a client has been created, you can set the retry policy for that client. Die Richtlinie gilt für alle Vorgänge auf dem Client.The policy applies to all operations on that client.
using System;
using System.Threading.Tasks;
using Microsoft.ServiceBus;
using Microsoft.ServiceBus.Messaging;

namespace RetryCodeSamples
{
    class ServiceBusCodeSamples
    {
        private const string connectionString =
            @"Endpoint=sb://[my-namespace].servicebus.windows.net/;
                SharedAccessKeyName=RootManageSharedAccessKey;
                SharedAccessKey=C99..........Mk=";

        public async static Task Samples()
        {
            const string QueueName = "TestQueue";

            ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.Http;

            var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString);

            // The namespace manager will have a default exponential policy with 10 retry attempts
            // and a 3 second delay delta.
            // Retry delays will be approximately 0 sec, 3 sec, 9 sec, 25 sec and the fixed 30 sec,
            // with an extra 10 sec added when receiving a ServiceBusyException.

            {
                // Set different values for the retry policy, used for all operations on the namespace manager.
                namespaceManager.Settings.RetryPolicy =
                    new RetryExponential(
                        minBackoff: TimeSpan.FromSeconds(0),
                        maxBackoff: TimeSpan.FromSeconds(30),
                        maxRetryCount: 3);

                // Policies cannot be specified on a per-operation basis.
                if (!await namespaceManager.QueueExistsAsync(QueueName))
                {
                    await namespaceManager.CreateQueueAsync(QueueName);
                }
            }

            var messagingFactory = MessagingFactory.Create(
                namespaceManager.Address, namespaceManager.Settings.TokenProvider);
            // The messaging factory will have a default exponential policy with 10 retry attempts
            // and a 3 second delay delta.
            // Retry delays will be approximately 0 sec, 3 sec, 9 sec, 25 sec and the fixed 30 sec,
            // with an extra 10 sec added when receiving a ServiceBusyException.

            {
                // Set different values for the retry policy, used for clients created from it.
                messagingFactory.RetryPolicy =
                    new RetryExponential(
                        minBackoff: TimeSpan.FromSeconds(1),
                        maxBackoff: TimeSpan.FromSeconds(30),
                        maxRetryCount: 3);


                // Policies cannot be specified on a per-operation basis.
                var session = await messagingFactory.AcceptMessageSessionAsync();
            }

            {
                var client = messagingFactory.CreateQueueClient(QueueName);
                // The client inherits the policy from the factory that created it.


                // Set different values for the retry policy on the client.
                client.RetryPolicy =
                    new RetryExponential(
                        minBackoff: TimeSpan.FromSeconds(0.1),
                        maxBackoff: TimeSpan.FromSeconds(30),
                        maxRetryCount: 3);

                // Policies cannot be specified on a per-operation basis.
                var session = await client.AcceptMessageSessionAsync();
            }
        }
    }
}

Weitere InformationenMore information

Service FabricService Fabric

Die Verteilung von Reliable Services in einem Service Fabric-Cluster dient als Schutz vor den meisten potenziellen vorübergehenden Fehlern, die in diesem Artikel beschrieben wurden.Distributing reliable services in a Service Fabric cluster guards against most of the potential transient faults discussed in this article. Einige vorübergehende Fehler sind aber weiterhin möglich.Some transient faults are still possible, however. Für den Naming Service kann beispielsweise gerade eine Routingänderung durchgeführt werden, wenn er eine Anforderung erhält, sodass eine Ausnahme ausgelöst wird.For example, the naming service might be in the middle of a routing change when it gets a request, causing it to throw an exception. Wenn dieselbe Anforderung 100 Millisekunden später eintrifft, ist der Vorgang wahrscheinlich erfolgreich.If the same request comes 100 milliseconds later, it will probably succeed.

Intern verwaltet Service Fabric diese Art von vorübergehenden Fehlern.Internally, Service Fabric manages this kind of transient fault. Sie können einige Einstellungen konfigurieren, indem Sie beim Einrichten Ihrer Dienste die OperationRetrySettings-Klasse verwenden.You can configure some settings by using the OperationRetrySettings class while setting up your services. Der folgende Code enthält hierzu ein Beispiel.The following code shows an example. In den meisten Fällen sollte dies nicht erforderlich sein, sodass die Standardeinstellungen verwendet werden können.In most cases, this should not be necessary, and the default settings will be fine.

FabricTransportRemotingSettings transportSettings = new FabricTransportRemotingSettings
{
    OperationTimeout = TimeSpan.FromSeconds(30)
};

var retrySettings = new OperationRetrySettings(TimeSpan.FromSeconds(15), TimeSpan.FromSeconds(1), 5);

var clientFactory = new FabricTransportServiceRemotingClientFactory(transportSettings);

var serviceProxyFactory = new ServiceProxyFactory((c) => clientFactory, retrySettings);

var client = serviceProxyFactory.CreateServiceProxy<ISomeService>(
    new Uri("fabric:/SomeApp/SomeStatefulReliableService"),
    new ServicePartitionKey(0));

Weitere InformationenMore information

SQL-Datenbank mit ADO.NETSQL Database using ADO.NET

SQL-Datenbank ist eine gehostete SQL-Datenbank, die in unterschiedlichen Größen und als Standard (freigegeben) und Premium (nicht freigegebenen)-Dienst verfügbar ist.SQL Database is a hosted SQL database available in a range of sizes and as both a standard (shared) and premium (non-shared) service.

WiederholungsmechanismusRetry mechanism

SQL-Datenbank hat keine integrierte Unterstützung für Wiederholungen, wenn auf diese mit ADO.NET zugegriffen wird.SQL Database has no built-in support for retries when accessed using ADO.NET. Allerdings können die Rückgabecodes von Anforderungen verwendet werden, um zu bestimmen, warum eine Anforderung fehlgeschlagen ist.However, the return codes from requests can be used to determine why a request failed. Weitere Informationen zur SQL-Datenbank-Drosselung finden Sie unter Ressourceneinschränkungen für Azure SQL-Datenbank.For more information about SQL Database throttling, see Azure SQL Database resource limits. Eine Liste mit relevanten Fehlercodes finden Sie unter SQL-Fehlercodes für SQL-Datenbank-Clientanwendungen.For a list of relevant error codes, see SQL error codes for SQL Database client applications.

Sie können die Polly-Bibliothek verwenden, um Wiederholungen für SQL-Datenbank zu implementieren.You can use the Polly library to implement retries for SQL Database. Weitere Informationen finden Sie unter Behandeln von vorübergehenden Fehlern mit Polly.See Transient fault handling with Polly.

Gebrauchsanleitung WiederholungenRetry usage guidance

Beachten Sie den Zugriff auf SQL-Datenbank mit ADO.NET die folgenden Richtlinien:Consider the following guidelines when accessing SQL Database using ADO.NET:

  • Wählen Sie die entsprechende Dienstoption (freigegeben oder Premium).Choose the appropriate service option (shared or premium). Bei einer freigegebenen Instanz kann es möglicherweise zu längeren Verbindungsverzögerungen als üblich und Drosselung durch die Verwendung des gemeinsam genutzten Servers durch andere Mandanten kommen.A shared instance may suffer longer than usual connection delays and throttling due to the usage by other tenants of the shared server. Wenn Vorgänge mit vorhersagbarerer Leistung und zuverlässig geringe Latenz erforderlich sind, sollten Sie die Premium-Option wählen.If more predictable performance and reliable low latency operations are required, consider choosing the premium option.
  • Stellen Sie sicher, dass Sie Wiederholungen auf der entsprechenden Ebene oder im entsprechenden Bereich durchführen, um nicht-idempotente Operationen zu vermeiden, die Dateninkonsistenzen verursachen.Ensure that you perform retries at the appropriate level or scope to avoid non-idempotent operations causing inconsistency in the data. Im Idealfall sollten alle Vorgänge idempotent sein, sodass sie ohne Inkonsistenzen wiederholt werden können.Ideally, all operations should be idempotent so that they can be repeated without causing inconsistency. Wenn dies nicht der Fall ist, sollte die Wiederholung auf einer Ebene oder in einem Bereich durchgeführt werden, die ermöglichen, dass alle zugehörigen Änderungen rückgängig gemacht werden können, wenn ein Vorgang fehlschlägt; zum Beispiel im Transaktionsbereich.Where this is not the case, the retry should be performed at a level or scope that allows all related changes to be undone if one operation fails; for example, from within a transactional scope. Weitere Informationen finden Sie unter Clouddienst-Grundlagen Datenzugriffsebene - Handhabung vorübergehender Fehler.For more information, see Cloud Service Fundamentals Data Access Layer – Transient Fault Handling.
  • Eine Strategie mit festgelegtem Intervall wird für die Verwendung mit Azure SQL-Datenbank nicht empfohlen, mit Ausnahme von interaktiven Szenarien, wo nur wenige Wiederholungen in sehr kurzen Intervallen vorkommen.A fixed interval strategy is not recommended for use with Azure SQL Database except for interactive scenarios where there are only a few retries at very short intervals. Ziehen Sie stattdessen eine exponentielle Backoff-Strategie für die meisten Szenarien in Betracht.Instead, consider using an exponential back-off strategy for the majority of scenarios.
  • Wählen Sie einen geeigneten Wert für die Verbindungs- und Befehls-Timeouts bei der Definition von Verbindungen.Choose a suitable value for the connection and command timeouts when defining connections. Ein zu kurzes Timeout kann zu vorzeitigen Fehlern bei Verbindungen führen, wenn die Datenbank ausgelastet ist.Too short a timeout may result in premature failures of connections when the database is busy. Ein zu langes Timeout kann verhindern, dass die Wiederholungslogik ordnungsgemäß funktioniert, da sie vor der Erkennung einer fehlgeschlagenen Verbindung zu lange wartet.Too long a timeout may prevent the retry logic working correctly by waiting too long before detecting a failed connection. Der Wert für das Timeout ist eine Komponente der End-to-End-Latenz. Sie wird effektiv der Wiederholungsverzögerung hinzugefügt, die in der Wiederholungsrichtlinie für jeden Wiederholungsversuch festgelegt ist.The value of the timeout is a component of the end-to-end latency; it is effectively added to the retry delay specified in the retry policy for every retry attempt.
  • Schließen Sie die Verbindung nach einer bestimmten Anzahl von Wiederholungen, selbst wenn Sie eine exponentielle Backoff-Wiederholungslogik verwenden, und wiederholen Sie den Vorgang auf einer neuen Verbindung.Close the connection after a certain number of retries, even when using an exponential back off retry logic, and retry the operation on a new connection. Das mehrmalige Wiederholen des gleichen Vorgangs für dieselbe Verbindung kann ein Faktor sein, der zu Verbindungsproblemen beiträgt.Retrying the same operation multiple times on the same connection can be a factor that contributes to connection problems. Beispiele für dieses Verfahrens finden Sie unter Clouddienst-Grundlagen Datenzugriffsebene - Handhabung vorübergehender Fehler.For an example of this technique, see Cloud Service Fundamentals Data Access Layer – Transient Fault Handling.
  • Wenn Verbindungspooling verwendet wird (Standardeinstellung), besteht die Möglichkeit, dass auch nach dem Schließen und erneuten Öffnen einer Verbindung dieselbe Verbindung aus dem Pool ausgewählt wird.When connection pooling is in use (the default) there is a chance that the same connection will be chosen from the pool, even after closing and reopening a connection. Wenn dies der Fall ist, ist ein Verfahren zu Behebung das Aufrufen der ClearPool-Methode der SqlConnection-Klasse, um die Verbindung als nicht wiederverwendbar zu markieren.If this is the case, a technique to resolve it is to call the ClearPool method of the SqlConnection class to mark the connection as not reusable. Allerdings sollten Sie dies erst nach mehreren fehlgeschlagenen Verbindungsversuchen tun und nur, wenn die spezifische Klasse des vorübergehende Fehler wie z. B. SQL-Timeouts (Fehlercode: -2) im Zusammenhang mit fehlerhaften Verbindungen auftritt.However, you should do this only after several connection attempts have failed, and only when encountering the specific class of transient failures such as SQL timeouts (error code -2) related to faulty connections.
  • Wenn der Datenzugriffscode als TransactionScope -Instanzen initiierte Transaktionen verwendet, sollte die Wiederholungslogik erneut eine Verbindung herstellen und einen neuen Transaktionsbereich initiieren.If the data access code uses transactions initiated as TransactionScope instances, the retry logic should reopen the connection and initiate a new transaction scope. Aus diesem Grund sollte der wiederholbare Codeblock den gesamten Bereich der Transaktion umfassen.For this reason, the retryable code block should encompass the entire scope of the transaction.

Erwägen Sie, mit den folgenden Einstellungen für Wiederholungsvorgänge zu beginnen.Consider starting with the following settings for retrying operations. Hierbei handelt es sich um allgemeine Einstellungen und Sie sollten die Vorgänge überwachen und die Werte entsprechend Ihrem Szenario optimieren.These settings are general purpose, and you should monitor the operations and fine-tune the values to suit your own scenario.

ContextContext Beispiel-Ziel E2E
Maximale Wartezeit
Sample target E2E
max latency
WiederholungsstrategieRetry strategy EinstellungenSettings WerteValues So funktioniert'sHow it works
Interaktiv, BenutzeroberflächeInteractive, UI,
oder Vordergrundor foreground
2 Sek2 sec FixedIntervalFixedInterval Anzahl der WiederholungenRetry count
WiederholungsintervallRetry interval
Erster schneller WiederholungsversuchFirst fast retry
33
500 ms500 ms
truetrue
Versuch 1 – Verzögerung 0 Sek.Attempt 1 - delay 0 sec
Versuch 2 – Verzögerung 500 msAttempt 2 - delay 500 ms
Versuch 3 – Verzögerung 500 msAttempt 3 - delay 500 ms
HintergrundBackground
oder Batchor batch
30 Sek30 sec ExponentialBackoffExponentialBackoff Anzahl der WiederholungenRetry count
Min. BackoffMin back-off
Max. BackoffMax back-off
Delta-BackoffDelta back-off
Erster schneller WiederholungsversuchFirst fast retry
55
0 Sek.0 sec
60 Sekunden60 sec
2 Sek2 sec
falsefalse
Versuch 1 – Verzögerung 0 Sek.Attempt 1 - delay 0 sec
Versuch 2 – Verzögerung ca. 2 Sek.Attempt 2 - delay ~2 sec
Versuch 3 – Verzögerung ca. 6 Sek.Attempt 3 - delay ~6 sec
Versuch 4 – Verzögerung ca. 14 Sek.Attempt 4 - delay ~14 sec
Versuch 5 – Verzögerung ca. 30 Sek.Attempt 5 - delay ~30 sec

Hinweis

Die End-to-End-Latenzziele setzen das Standardtimeout für Verbindungen mit dem Dienst voraus.The end-to-end latency targets assume the default timeout for connections to the service. Wenn Sie längere Verbindungstimeouts angeben, wird die End-to-End-Latenz durch diese zusätzliche Zeit für jeden Wiederholungsversuch erweitert.If you specify longer connection timeouts, the end-to-end latency will be extended by this additional time for every retry attempt.

BeispieleExamples

In diesem Abschnitt wird veranschaulicht, wie Sie Polly zum Zugreifen auf Azure SQL-Datenbank verwenden können, indem Sie eine Reihe von Wiederholungsrichtlinien verwenden, die in der Policy-Klasse konfiguriert sind.This section shows how you can use Polly to access Azure SQL Database using a set of retry policies configured in the Policy class.

Der folgende Code enthält eine Erweiterungsmethode für die SqlCommand-Klasse, mit der ExecuteAsync mit exponentiell ansteigender Wartezeit aufgerufen wird.The following code shows an extension method on the SqlCommand class that calls ExecuteAsync with exponential backoff.

public async static Task<SqlDataReader> ExecuteReaderWithRetryAsync(this SqlCommand command)
{
    GuardConnectionIsNotNull(command);

    var policy = Policy.Handle<Exception>().WaitAndRetryAsync(
        retryCount: 3, // Retry 3 times
        sleepDurationProvider: attempt => TimeSpan.FromMilliseconds(200 * Math.Pow(2, attempt - 1)), // Exponential backoff based on an initial 200 ms delay.
        onRetry: (exception, attempt) =>
        {
            // Capture some information for logging/telemetry.
            logger.LogWarn($"ExecuteReaderWithRetryAsync: Retry {attempt} due to {exception}.");
        });

    // Retry the following call according to the policy.
    await policy.ExecuteAsync<SqlDataReader>(async token =>
    {
        // This code is executed within the Policy

        if (conn.State != System.Data.ConnectionState.Open) await conn.OpenAsync(token);
        return await command.ExecuteReaderAsync(System.Data.CommandBehavior.Default, token);

    }, cancellationToken);
}

Diese asynchrone Erweiterungsmethode kann wie unten beschrieben verwendet werden.This asynchronous extension method can be used as follows.

var sqlCommand = sqlConnection.CreateCommand();
sqlCommand.CommandText = "[some query]";

using (var reader = await sqlCommand.ExecuteReaderWithRetryAsync())
{
    // Do something with the values
}

Weitere InformationenMore information

Eine allgemeine Anleitung dazu, wie Sie für SQL-Datenbank den größtmöglichen Nutzen erzielen, finden Sie unter Anleitung zu Leistung und Flexibilität von Azure SQL-Datenbanken.For general guidance on getting the most from SQL Database, see Azure SQL Database performance and elasticity guide.

SQL-Datenbank mit Entity Framework 6SQL Database using Entity Framework 6

SQL-Datenbank ist eine gehostete SQL-Datenbank, die in unterschiedlichen Größen und als Standard (freigegeben) und Premium (nicht freigegebenen)-Dienst verfügbar ist.SQL Database is a hosted SQL database available in a range of sizes and as both a standard (shared) and premium (non-shared) service. Entity Framework ist eine objektrelationale Zuordnung, die .NET Entwicklern die Arbeit mit relationalen Daten mithilfe von domänenspezifischen Objekten ermöglicht.Entity Framework is an object-relational mapper that enables .NET developers to work with relational data using domain-specific objects. Es entfällt die Notwendigkeit für den Großteil des Datenzugriffs-Codes, den Entwickler normalerweise schreiben müssen.It eliminates the need for most of the data-access code that developers usually need to write.

WiederholungsmechanismusRetry mechanism

Wenn auf SQL-Datenbank über Entity Framework 6.0 (oder eine höhere Version) zugegriffen wird, werden Wiederholungen über einen Mechanismus namens Verbindungsstabilität/Wiederholungslogik unterstützt.Retry support is provided when accessing SQL Database using Entity Framework 6.0 and higher through a mechanism called Connection resiliency / retry logic. Die wichtigsten Features des Wiederholungsmechanismus sind:The main features of the retry mechanism are:

  • Die primäre Abstraktion ist die IDbExecutionStrategy -Schnittstelle.The primary abstraction is the IDbExecutionStrategy interface. Diese Benutzeroberfläche:This interface:
    • Definiert die synchrone und die asynchrone Execute-Methode.Defines synchronous and asynchronous Execute methods.
    • Definiert Klassen, die direkt verwendet oder in einem Datenbankkontext als eine Standardstrategie konfiguriert werden können, einem Anbieternamen oder einem Anbieternamen und Servernamen zugeordnet werden können.Defines classes that can be used directly or can be configured on a database context as a default strategy, mapped to provider name, or mapped to a provider name and server name. Wenn sie für einen Kontext konfiguriert ist, treten Wiederholungen auf der Ebene der einzelnen Datenbankvorgängen auf, von denen es möglicherweise mehrere für einen angegebenen Kontext gibt.When configured on a context, retries occur at the level of individual database operations, of which there might be several for a given context operation.
    • Definiert, wann und wie versucht wird, einen fehlgeschlagene Verbindung erneut herzustellen.Defines when to retry a failed connection, and how.
  • Sie umfasst mehrere integrierte Implementierungen für die IDbExecutionStrategy -Schnittstelle:It includes several built-in implementations of the IDbExecutionStrategy interface:
    • Standard - keine Wiederholung.Default - no retrying.
    • Standard für SQL-Datenbank (automatisch) - kein erneuter Versuch, es werden jedoch Ausnahmen überprüft und in der SQL-Datenbank-Strategie mit der Empfehlung zur Verwendung eingebunden.Default for SQL Database (automatic) - no retrying, but inspects exceptions and wraps them with suggestion to use the SQL Database strategy.
    • Standardeinstellung für SQL-Datenbank - exponentiell (von der Basisklasse geerbt) plus SQL-Datenbank Erkennungslogik.Default for SQL Database - exponential (inherited from base class) plus SQL Database detection logic.
  • Sie implementiert eine exponentielle Backoff-Strategie, die einen Zufallsgenerator enthält.It implements an exponential back-off strategy that includes randomization.
  • Die integrierten Wiederholungsklassen sind zustandsbehaftet und nicht threadsicher.The built-in retry classes are stateful and are not thread-safe. Sie können jedoch wiederverwendet werden, nachdem der aktuelle Vorgang abgeschlossen ist.However, they can be reused after the current operation is completed.
  • Wenn die angegebene Wiederholungsanzahl überschritten wird, werden die Ergebnisse in einer neue Ausnahme umschlossen.If the specified retry count is exceeded, the results are wrapped in a new exception. Sie bringt die aktuelle Ausnahme nicht zum Vorschein.It does not bubble up the current exception.

RichtlinienkonfigurationPolicy configuration

Beim Zugriff auf SQL-Datenbank mit Entity Framework 6.0 und höher wird Wiederholungsunterstützung geboten.Retry support is provided when accessing SQL Database using Entity Framework 6.0 and higher. Wiederholungsrichtlinien werden programmgesteuert konfiguriert.Retry policies are configured programmatically. Die Konfiguration kann nicht pro Vorgang geändert werden.The configuration cannot be changed on a per-operation basis.

Wenn Sie eine Strategie im Kontext als Standard konfigurieren, geben Sie eine Funktion an, die bei Bedarf eine neue Strategie erstellt.When configuring a strategy on the context as the default, you specify a function that creates a new strategy on demand. Der folgende Code zeigt, wie Sie eine Wiederholungskonfigurationsklasse erstellen können, die die DbConfiguration -Basisklasse erweitert.The following code shows how you can create a retry configuration class that extends the DbConfiguration base class.

public class BloggingContextConfiguration : DbConfiguration
{
  public BlogConfiguration()
  {
    // Set up the execution strategy for SQL Database (exponential) with 5 retries and 4 sec delay
    this.SetExecutionStrategy(
         "System.Data.SqlClient", () => new SqlAzureExecutionStrategy(5, TimeSpan.FromSeconds(4)));
  }
}

Sie können diese dann mit der SetConfiguration-Methode der DbConfiguration-Instanz als Standardwiederholungsstrategie für alle Vorgänge festlegen, wenn die Anwendung gestartet wird.You can then specify this as the default retry strategy for all operations using the SetConfiguration method of the DbConfiguration instance when the application starts. In der Standardeinstellung erkennt EF die Konfigurationsklasse automatisch und verwenden diese.By default, EF will automatically discover and use the configuration class.

DbConfiguration.SetConfiguration(new BloggingContextConfiguration());

Sie können die Wiederholungskonfigurationsklasse für einen Kontext angeben, indem Sie die Kontextklasse mit einem DbConfigurationType -Attribut kommentieren.You can specify the retry configuration class for a context by annotating the context class with a DbConfigurationType attribute. Wenn Sie jedoch über nur eine Konfigurationsklasse verfügen, wird EF diese verwenden, ohne dass der Kontext kommentieren werden muss.However, if you have only one configuration class, EF will use it without the need to annotate the context.

[DbConfigurationType(typeof(BloggingContextConfiguration))]
public class BloggingContext : DbContext

Wenn Sie unterschiedliche Wiederholungsstrategien für bestimmte Vorgänge verwenden oder Wiederholungen für bestimmte Vorgänge deaktivieren müssen, können Sie eine Konfigurationsklasse erstellen, mit der Sie Strategien anhalten oder austauschen können, indem ein Flag in CallContextsetzen.If you need to use different retry strategies for specific operations, or disable retries for specific operations, you can create a configuration class that allows you to suspend or swap strategies by setting a flag in the CallContext. Die Konfigurationsklasse kann dieses Flag verwenden, um Strategien zu wechseln oder die Strategie zu deaktivieren, die Sie bereitstellen und eine Standardstrategie verwenden.The configuration class can use this flag to switch strategies, or disable the strategy you provide and use a default strategy. Weitere Informationen finden Sie unter Anhalten der Ausführungsstrategie (EF6 und höher).For more information, see Suspend Execution Strategy (EF6 onwards).

Eine andere Technik für die Verwendung von bestimmten Wiederholungsstrategien für einzelne Vorgänge ist das Erstellen einer Instanz der erforderlichen Strategieklasse und das Liefern der gewünschten Einstellungen mithilfe von Parametern.Another technique for using specific retry strategies for individual operations is to create an instance of the required strategy class and supply the desired settings through parameters. Rufen Sie dann die ExecuteAsync -Methode auf.You then invoke its ExecuteAsync method.

var executionStrategy = new SqlAzureExecutionStrategy(5, TimeSpan.FromSeconds(4));
var blogs = await executionStrategy.ExecuteAsync(
    async () =>
    {
        using (var db = new BloggingContext("Blogs"))
        {
            // Acquire some values asynchronously and return them
        }
    },
    new CancellationToken()
);

Die einfachste Möglichkeit zum Verwenden einer DbConfiguration-Klasse ist es, diese in der gleichen Assembly wie die DbContext-Klasse zu platzieren.The simplest way to use a DbConfiguration class is to locate it in the same assembly as the DbContext class. Dies ist jedoch nicht geeignet, wenn der gleiche Kontext in verschiedenen Szenarios benötigt wird, wie z. B. bei anderen interaktiven Strategien und Hintergrundwiederholungsstrategien.However, this is not appropriate when the same context is required in different scenarios, such as different interactive and background retry strategies. Wenn die unterschiedlichen Kontexte in separaten AppDomains ausgeführt werden, können Sie die integrierte Unterstützung für das Angeben von Konfigurationsklassen in der Konfigurationsdatei verwenden oder explizit mithilfe von Code festlegen.If the different contexts execute in separate AppDomains, you can use the built-in support for specifying configuration classes in the configuration file or set it explicitly using code. Wenn die unterschiedlichen Kontexte in derselben AppDomain ausgeführt werden müssen, ist eine benutzerdefinierte Lösung erforderlich.If the different contexts must execute in the same AppDomain, a custom solution will be required.

Weitere Informationen finden Sie unter Codebasierte Konfiguration (EF6 und höher).For more information, see Code-Based Configuration (EF6 onwards).

Die folgende Tabelle zeigt die Standardeinstellungen für die integrierte Wiederholungsrichtlinie bei Verwendung von EF6.The following table shows the default settings for the built-in retry policy when using EF6.

EinstellungSetting StandardwertDefault value BedeutungMeaning
RichtliniePolicy ExponentiellExponential Exponentielles Backoff.Exponential back-off.
MaxRetryCountMaxRetryCount 55 Die maximale Anzahl von Warnungen.The maximum number of retries.
MaxDelayMaxDelay 30 Sekunden30 seconds Die maximale Verzögerung zwischen Wiederholungsversuchen.The maximum delay between retries. Dieser Wert hat keine Auswirkung auf die Berechnung der Verzögerungsreihen.This value does not affect how the series of delays are computed. Er definiert lediglich eine Obergrenze.It only defines an upper bound.
DefaultCoefficientDefaultCoefficient 1 Sekunde1 second Der Koeffizient für die Berechnung des exponentiellen Backoffs.The coefficient for the exponential back-off computation. Dieser Wert kann nicht geändert werden.This value cannot be changed.
DefaultRandomFactorDefaultRandomFactor 1.11.1 Der Multiplikator zum Hinzufügen einer beliebigen Verzögerung für die einzelnen Einträge.The multiplier used to add a random delay for each entry. Dieser Wert kann nicht geändert werden.This value cannot be changed.
DefaultExponentialBaseDefaultExponentialBase 22 Der Multiplikator für die Berechnung der nächsten Verzögerung.The multiplier used to calculate the next delay. Dieser Wert kann nicht geändert werden.This value cannot be changed.

Gebrauchsanleitung WiederholungenRetry usage guidance

Beachten Sie den Zugriff auf SQL-Datenbank mit EF6 die folgenden Richtlinien:Consider the following guidelines when accessing SQL Database using EF6:

  • Wählen Sie die entsprechende Dienstoption (freigegeben oder Premium).Choose the appropriate service option (shared or premium). Bei einer freigegebenen Instanz kann es möglicherweise zu längeren Verbindungsverzögerungen als üblich und Drosselung durch die Verwendung des gemeinsam genutzten Servers durch andere Mandanten kommen.A shared instance may suffer longer than usual connection delays and throttling due to the usage by other tenants of the shared server. Wenn Vorgänge mit vorhersagbarer Leistung und zuverlässig geringe Latenz erforderlich sind, sollten Sie die Premium-Option wählen.If predictable performance and reliable low latency operations are required, consider choosing the premium option.

  • Eine Strategie mit festgelegtem Intervall wird für die Verwendung mit Azure SQL-Datenbank nicht empfohlen.A fixed interval strategy is not recommended for use with Azure SQL Database. Verwenden Sie stattdessen eine exponentielle Backoff-Strategie, da der Dienst möglicherweise überlastet ist und längere Verzögerungen mehr Zeit für die Wiederherstellung einräumen.Instead, use an exponential back-off strategy because the service may be overloaded, and longer delays allow more time for it to recover.

  • Wählen Sie einen geeigneten Wert für die Verbindungs- und Befehls-Timeouts bei der Definition von Verbindungen.Choose a suitable value for the connection and command timeouts when defining connections. Stützen Sie das Timeout auf Ihren Geschäftslogikentwurf und auf Tests.Base the timeout on both your business logic design and through testing. Sie müssen diesen Wert möglicherweise mit der Zeit ändern, wenn sich die Datenmengen oder Geschäftsprozesse ändern.You may need to modify this value over time as the volumes of data or the business processes change. Ein zu kurzes Timeout kann zu vorzeitigen Fehlern bei Verbindungen führen, wenn die Datenbank ausgelastet ist.Too short a timeout may result in premature failures of connections when the database is busy. Ein zu langes Timeout kann verhindern, dass die Wiederholungslogik ordnungsgemäß funktioniert, da sie vor der Erkennung einer fehlgeschlagenen Verbindung zu lange wartet.Too long a timeout may prevent the retry logic working correctly by waiting too long before detecting a failed connection. Der Wert für das Timeout ist eine Komponente der End-to-End-Latenz, auch es nicht leicht ist zu ermitteln, wie viele Befehle beim Speichern des Kontexts ausgeführt werden.The value of the timeout is a component of the end-to-end latency, although you cannot easily determine how many commands will execute when saving the context. Sie können das Standardtimeout ändern, indem Sie die Einstellung der CommandTimeout-Eigenschaft der DbContext-Instanz festlegen.You can change the default timeout by setting the CommandTimeout property of the DbContext instance.

  • Entity Framework unterstützt Wiederholungskonfigurationen, die in Konfigurationsdateien definiert sind.Entity Framework supports retry configurations defined in configuration files. Für maximale Flexibilität in Azure sollten Sie allerdings die Konfiguration in der Anwendung programmgesteuert erstellen.However, for maximum flexibility on Azure you should consider creating the configuration programmatically within the application. Die einzelnen Parameter für die Wiederholungsrichtlinien, wie z. B. die Anzahl der Wiederholungen und die Wiederholungsintervalle können in der Dienstkonfigurationsdatei gespeichert und zur Laufzeit verwendet werden, um die entsprechenden Richtlinien zu erstellen.The specific parameters for the retry policies, such as the number of retries and the retry intervals, can be stored in the service configuration file and used at runtime to create the appropriate policies. Dadurch können die Einstellungen darin geändert werden, ohne dass die Anwendung neu gestartet werden muss.This allows the settings to be changed without requiring the application to be restarted.

Erwägen Sie, mit den folgenden Einstellungen für Wiederholungsvorgänge zu beginnen.Consider starting with the following settings for retrying operations. Sie können die Verzögerung zwischen den Wiederholungen nicht angeben (sie ist als eine exponentielle Sequenz festgelegt und generiert).You cannot specify the delay between retry attempts (it is fixed and generated as an exponential sequence). Sofern Sie keine benutzerdefinierte Wiederholungsstrategie erstellen, können Sie wie hier gezeigt nur die maximalen Werte angeben.You can specify only the maximum values, as shown here; unless you create a custom retry strategy. Hierbei handelt es sich um allgemeine Einstellungen und Sie sollten die Vorgänge überwachen und die Werte entsprechend Ihrem Szenario optimieren.These settings are general purpose, and you should monitor the operations and fine-tune the values to suit your own scenario.

ContextContext Beispiel-Ziel E2E
Maximale Wartezeit
Sample target E2E
max latency
WiederholungsrichtlinieRetry policy EinstellungenSettings WerteValues So funktioniert'sHow it works
Interaktiv, BenutzeroberflächeInteractive, UI,
oder Vordergrundor foreground
2 Sekunden2 seconds ExponentiellExponential MaxRetryCountMaxRetryCount
MaxDelayMaxDelay
33
750 ms750 ms
Versuch 1 – Verzögerung 0 Sek.Attempt 1 - delay 0 sec
Versuch 2 – Verzögerung 750 msAttempt 2 - delay 750 ms
Versuch 3 - Verzögerung 750 msAttempt 3 – delay 750 ms
HintergrundBackground
oder Batchor batch
30 Sekunden30 seconds ExponentiellExponential MaxRetryCountMaxRetryCount
MaxDelayMaxDelay
55
12 Sekunden12 seconds
Versuch 1 – Verzögerung 0 Sek.Attempt 1 - delay 0 sec
Versuch 2 – Verzögerung ca. 1 Sek.Attempt 2 - delay ~1 sec
Versuch 3 – Verzögerung ca. 3 Sek.Attempt 3 - delay ~3 sec
Versuch 4 – Verzögerung ca. 7 Sek.Attempt 4 - delay ~7 sec
Versuch 5 – Verzögerung ca. 12 Sek.Attempt 5 - delay 12 sec

Hinweis

Die End-to-End-Latenzziele setzen das Standardtimeout für Verbindungen mit dem Dienst voraus.The end-to-end latency targets assume the default timeout for connections to the service. Wenn Sie längere Verbindungstimeouts angeben, wird die End-to-End-Latenz durch diese zusätzliche Zeit für jeden Wiederholungsversuch erweitert.If you specify longer connection timeouts, the end-to-end latency will be extended by this additional time for every retry attempt.

BeispieleExamples

Im folgenden Codebeispiel wird eine einfachen Datenzugriffslösung definiert, die Entity Framework verwendet.The following code example defines a simple data access solution that uses Entity Framework. Eine bestimmte Wiederholungsstrategie wird durch die Definition einer Instanz einer Klasse mit dem Namen BlogConfiguration festgelegt, die DbConfiguration erweitert.It sets a specific retry strategy by defining an instance of a class named BlogConfiguration that extends DbConfiguration.

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.SqlServer;
using System.Threading.Tasks;

namespace RetryCodeSamples
{
    public class BlogConfiguration : DbConfiguration
    {
        public BlogConfiguration()
        {
            // Set up the execution strategy for SQL Database (exponential) with 5 retries and 12 sec delay.
            // These values could be loaded from configuration rather than being hard-coded.
            this.SetExecutionStrategy(
                    "System.Data.SqlClient", () => new SqlAzureExecutionStrategy(5, TimeSpan.FromSeconds(12)));
        }
    }

    // Specify the configuration type if more than one has been defined.
    // [DbConfigurationType(typeof(BlogConfiguration))]
    public class BloggingContext : DbContext
    {
        // Definition of content goes here.
    }

    class EF6CodeSamples
    {
        public async static Task Samples()
        {
            // Execution strategy configured by DbConfiguration subclass, discovered automatically or
            // or explicitly indicated through configuration or with an attribute. Default is no retries.
            using (var db = new BloggingContext("Blogs"))
            {
                // Add, edit, delete blog items here, then:
                await db.SaveChangesAsync();
            }
        }
    }
}

Weitere Beispiele zur Verwendung des Entity Framework Wiederholungsmechanismus finden Sie unter Verbindungsstabilität / Wiederholungslogik.More examples of using the Entity Framework retry mechanism can be found in Connection Resiliency / Retry Logic.

Weitere InformationenMore information

SQL-Datenbank mit Entity Framework CoreSQL Database using Entity Framework Core

Entity Framework Core ist eine objektrelationale Zuordnung, die .NET Core-Entwicklern die Arbeit mit Daten mithilfe von domänenspezifischen Objekten ermöglicht.Entity Framework Core is an object-relational mapper that enables .NET Core developers to work with data using domain-specific objects. Es entfällt die Notwendigkeit für den Großteil des Datenzugriffs-Codes, den Entwickler normalerweise schreiben müssen.It eliminates the need for most of the data-access code that developers usually need to write. Diese Version von Entity Framework wurde von Grund auf neu geschrieben und erbt nicht automatisch alle Features von EF6.x.This version of Entity Framework was written from the ground up, and doesn't automatically inherit all the features from EF6.x.

WiederholungsmechanismusRetry mechanism

Wenn auf SQL-Datenbank über Entity Framework Core zugegriffen wird, werden Wiederholungen über einen Mechanismus namens Verbindungsstabilität unterstützt.Retry support is provided when accessing SQL Database using Entity Framework Core through a mechanism called connection resiliency. Verbindungsstabilität wurde mit EF Core 1.1.0 eingeführt.Connection resiliency was introduced in EF Core 1.1.0.

Die primäre Abstraktion ist die IExecutionStrategy-Schnittstelle.The primary abstraction is the IExecutionStrategy interface. Die Ausführungsstrategie für SQL Server, einschließlich SQL Azure, ist über die Ausnahmetypen informiert, die wiederholt werden können, und verfügt über sinnvolle Standardwerte für maximale Wiederholungsversuche, Verzögerung zwischen Wiederholungen usw.The execution strategy for SQL Server, including SQL Azure, is aware of the exception types that can be retried and has sensible defaults for maximum retries, delay between retries, and so on.

BeispieleExamples

Der folgende Code ermöglicht automatische Wiederholungen beim Konfigurieren des DbContext-Objekts, das eine Sitzung mit der Datenbank repräsentiert.The following code enables automatic retries when configuring the DbContext object, which represents a session with the database.

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder
        .UseSqlServer(
            @"Server=(localdb)\mssqllocaldb;Database=EFMiscellanous.ConnectionResiliency;Trusted_Connection=True;",
            options => options.EnableRetryOnFailure());
}

Der folgende Code veranschaulicht, wie Sie eine Transaktion mit automatischen Wiederholungsversuchen ausführen, indem Sie eine Ausführungsstrategie verwenden.The following code shows how to execute a transaction with automatic retries, by using an execution strategy. Die Transaktion wird in einem Delegaten definiert.The transaction is defined in a delegate. Wenn ein vorübergehender Fehler auftritt, wird der Delegat von der Ausführungsstrategie erneut aufgerufen.If a transient failure occurs, the execution strategy will invoke the delegate again.

using (var db = new BloggingContext())
{
    var strategy = db.Database.CreateExecutionStrategy();

    strategy.Execute(() =>
    {
        using (var transaction = db.Database.BeginTransaction())
        {
            db.Blogs.Add(new Blog { Url = "https://blogs.msdn.com/dotnet" });
            db.SaveChanges();

            db.Blogs.Add(new Blog { Url = "https://blogs.msdn.com/visualstudio" });
            db.SaveChanges();

            transaction.Commit();
        }
    });
}

Azure StorageAzure Storage

Azure Storage-Dienste umfassen Tabellen- und Blobspeicher sowie Dateien und Speicherwarteschlangen.Azure Storage services include table and blob storage, files, and storage queues.

WiederholungsmechanismusRetry mechanism

Wiederholungen treten auf individueller REST-Vorgangsebene auf und sind ein wesentlicher Bestandteil der Client-API-Implementierung.Retries occur at the individual REST operation level and are an integral part of the client API implementation. Das Client-Speicher SDK verwendet Klassen, die die IExtendedRetryPolicy Schnittstelleimplementieren.The client storage SDK uses classes that implement the IExtendedRetryPolicy Interface.

Es gibt verschiedene Implementierungen der Schnittstelle.There are different implementations of the interface. Speicherclients können Richtlinien auswählen, die für den Zugriff auf Tabellen, Blobs und Warteschlangen entworfen wurden.Storage clients can choose from policies designed for accessing tables, blobs, and queues. Jede Implementierung verwendet eine andere Wiederholungsstrategie, die im Wesentlichen das Wiederholungsintervall und andere Details definiert.Each implementation uses a different retry strategy that essentially defines the retry interval and other details.

Die integrierten Klassen bieten Unterstützung für linear (konstante Verzögerung) und exponentiell mit Zufallsgenerator-Wiederholungsintervallen.The built-in classes provide support for linear (constant delay) and exponential with randomization retry intervals. Es gibt auch eine Richtlinie für keine Wiederholung, wenn ein anderer Prozess Wiederholungen auf höherer Ebene behandelt.There is also a no retry policy for use when another process is handling retries at a higher level. Allerdings können Sie Ihre eigenen Wiederholungsklassen implementieren, wenn Sie spezielle Anforderungen haben, die von den integrierten Klassen nicht bereitgestellt werden.However, you can implement your own retry classes if you have specific requirements not provided by the built-in classes.

Abwechselnde Wiederholungen wechseln zwischen primären und sekundären Speicherdienststandorten, wenn Sie Lesezugriff auf georedundante Speicher (RA-GRS) verwenden und das Ergebnis der Anforderung ist ein wiederholbarer Fehler.Alternate retries switch between primary and secondary storage service location if you are using read access geo-redundant storage (RA-GRS) and the result of the request is a retryable error. Weitere Informationen finden Sie unter Redundanzoptionen für Azure Storage .See Azure Storage Redundancy Options for more information.

RichtlinienkonfigurationPolicy configuration

Wiederholungsrichtlinien werden programmgesteuert konfiguriert.Retry policies are configured programmatically. Eine typische Vorgehensweise ist das Erstellen und Ausfüllen von TableRequestOptions-, BlobRequestOptions-, FileRequestOptions- oder QueueRequestOptions-Instanzen.A typical procedure is to create and populate a TableRequestOptions, BlobRequestOptions, FileRequestOptions, or QueueRequestOptions instance.

TableRequestOptions interactiveRequestOption = new TableRequestOptions()
{
  RetryPolicy = new LinearRetry(TimeSpan.FromMilliseconds(500), 3),
  // For Read-access geo-redundant storage, use PrimaryThenSecondary.
  // Otherwise set this to PrimaryOnly.
  LocationMode = LocationMode.PrimaryThenSecondary,
  // Maximum execution time based on the business use case.
  MaximumExecutionTime = TimeSpan.FromSeconds(2)
};

Die Anforderungsoptioneninstanz kann dann auf dem Client festgelegt werden und alle Operationen mit dem Client verwenden die angegebene Anforderungsoptionen.The request options instance can then be set on the client, and all operations with the client will use the specified request options.

client.DefaultRequestOptions = interactiveRequestOption;
var stats = await client.GetServiceStatsAsync();

Sie können die Client-Anforderungsoptionen überschreiben, indem Sie eine ausgefüllte Instanz der Anforderungsoptionsklasse als Parameter an Vorgangsmethoden übergeben.You can override the client request options by passing a populated instance of the request options class as a parameter to operation methods.

var stats = await client.GetServiceStatsAsync(interactiveRequestOption, operationContext: null);

Sie verwenden eine OperationContext -Instanz, um den auszuführenden Code anzugeben, wenn eine Wiederholung auftritt und ein Vorgang abgeschlossen wurde.You use an OperationContext instance to specify the code to execute when a retry occurs and when an operation has completed. Dieser Code kann Informationen über den Vorgang zur Verwendung in Protokollen und Telemetrie erfassen.This code can collect information about the operation for use in logs and telemetry.

// Set up notifications for an operation
var context = new OperationContext();
context.ClientRequestID = "some request id";
context.Retrying += (sender, args) =>
{
    /* Collect retry information */
};
context.RequestCompleted += (sender, args) =>
{
    /* Collect operation completion information */
};
var stats = await client.GetServiceStatsAsync(null, context);

Zusätzlich zur Angabe, ob ein Fehler für die Wiederholung geeignet ist, geben die erweiterten Wiederholungsrichtlinien ein RetryContext -Objekt zurück, das folgendes angibt: die Anzahl der Wiederholungen, die Ergebnisse der letzten Anforderung, ob die nächste Wiederholung im primären oder sekundären Standort ausgeführt werden (siehe Tabelle unten).In addition to indicating whether a failure is suitable for retry, the extended retry policies return a RetryContext object that indicates the number of retries, the results of the last request, whether the next retry will happen in the primary or secondary location (see table below for details). Die Eigenschaften des RetryContext Objekts können verwendet werden, um zu entscheiden, ob und wann eine Wiederholung versucht wird.The properties of the RetryContext object can be used to decide if and when to attempt a retry. Weitere Informationen finden Sie unter IExtendedRetryPolicy.Evaluate-Methode.For more information, see IExtendedRetryPolicy.Evaluate Method.

Die folgenden Tabellen enthalten die Standardeinstellungen für die integrierten Wiederholungsrichtlinien.The following tables show the default settings for the built-in retry policies.

Anforderungsoptionen:Request options:

EinstellungSetting StandardwertDefault value BedeutungMeaning
MaximumExecutionTimeMaximumExecutionTime KeineNone Maximale Ausführungszeit für die Anforderung, einschließlich aller möglichen Wiederholungsversuche.Maximum execution time for the request, including all potential retry attempts. Ist diese Option nicht angegeben, ist die für diese Anforderung zulässige Zeitspanne unendlich.If it is not specified, then the amount of time that a request is permitted to take is unlimited. Das heißt, es kann sein, dass die Anforderung nicht reagiert.In other words, the request might hang.
ServerTimeoutServerTimeout KeineNone Server-Timeout-Intervall für die Anforderung (der Wert wird in Sekunden gerundet).Server timeout interval for the request (value is rounded to seconds). Wenn nicht angegeben, wird der Standardwert für alle Anforderungen an den Server verwendet.If not specified, it will use the default value for all requests to the server. In der Regel ist die beste Option, diese Einstellung auszulassen, sodass die Standardeinstellung des Servers verwendet wird.Usually, the best option is to omit this setting so that the server default is used.
LocationModeLocationMode KeineNone Wenn das Speicherkonto mit der Replikationsoption des Lesezugriffs auf georedundanten Speicher (RA-GRS) erstellt wird, können Sie mit dem Speicherortmodus bestimmen, welche Stelle die Anforderung erhalten soll.If the storage account is created with the Read access geo-redundant storage (RA-GRS) replication option, you can use the location mode to indicate which location should receive the request. Wenn zum Beispiel PrimaryThenSecondary angegeben ist, werden Anforderungen immer zuerst an den primären Standort gesendet.For example, if PrimaryThenSecondary is specified, requests are always sent to the primary location first. Wenn eine Anforderung fehlschlägt, wird sie an den sekundären Standort gesendet.If a request fails, it is sent to the secondary location.
RetryPolicyRetryPolicy ExponentialPolicyExponentialPolicy Details zu jeder Option finden Sie weiter unten.See below for details of each option.

Exponentielle Richtlinie:Exponential policy:

EinstellungSetting StandardwertDefault value BedeutungMeaning
maxAttemptmaxAttempt 33 Anzahl der Wiederholungsversuche.Number of retry attempts.
deltaBackoffdeltaBackoff 4 Sekunden4 seconds Backoff-Intervall zwischen den Wiederholungen.Back-off interval between retries. Vielfache dieser Zeitspanne, einschließlich eines Zufallselements, werden für weitere Wiederholungsversuche verwendet.Multiples of this timespan, including a random element, will be used for subsequent retry attempts.
MinBackoffMinBackoff 3 Sekunden3 seconds Wird zu allen Wiederholungsintervallen, die aus deltaBackoff berechnet werden, hinzugefügt.Added to all retry intervals computed from deltaBackoff. Dieser Wert kann nicht geändert werden.This value cannot be changed.
MaxBackoffMaxBackoff 120 Sekunden120 seconds MaxBackoff wird verwendet, wenn das berechnete Wiederholungsintervall größer als MaxBackoff ist.MaxBackoff is used if the computed retry interval is greater than MaxBackoff. Dieser Wert kann nicht geändert werden.This value cannot be changed.

Lineare Richtlinie:Linear policy:

EinstellungSetting StandardwertDefault value BedeutungMeaning
maxAttemptmaxAttempt 33 Anzahl der Wiederholungsversuche.Number of retry attempts.
deltaBackoffdeltaBackoff 30 Sekunden30 seconds Backoff-Intervall zwischen den Wiederholungen.Back-off interval between retries.

Gebrauchsanleitung WiederholungenRetry usage guidance

Beachten Sie die folgenden Richtlinien beim Zugriff auf Azure-Speicherdienste mit der Speicherclient-API:Consider the following guidelines when accessing Azure storage services using the storage client API:

  • Verwenden der integrierten Wiederholungsrichtlinien aus dem Namespace „Microsoft.Azure.Storage.RetryPolicies“, wo sie für Ihre Anforderungen geeignet sind.Use the built-in retry policies from the Microsoft.Azure.Storage.RetryPolicies namespace where they are appropriate for your requirements. In den meisten Fällen sind diese Richtlinien ausreichend.In most cases, these policies will be sufficient.

  • Verwenden der ExponentialRetry Richtlinie in Batchvorgängen, Hintergrundaufgaben oder nicht interaktiven Szenarios.Use the ExponentialRetry policy in batch operations, background tasks, or non-interactive scenarios. In diesen Szenarien können Sie in der Regel dem Dienst mehr Zeit für die Wiederherstellung zur Verfügung stellen – dadurch erhöht sich die Wahrscheinlichkeit, dass der Vorgang schließlich erfolgreich ist.In these scenarios, you can typically allow more time for the service to recover—with a consequently increased chance of the operation eventually succeeding.

  • Geben Sie die Eigenschaft MaximumExecutionTime des RequestOptions-Parameters an, um die Gesamtausführungszeit zu beschränken. Berücksichtigen Sie bei der Auswahl eines Timeoutwerts aber den Typ und die Größe des Vorgangs.Consider specifying the MaximumExecutionTime property of the RequestOptions parameter to limit the total execution time, but take into account the type and size of the operation when choosing a timeout value.

  • Wenn Sie eine benutzerdefinierte Wiederholung implementieren müssen, vermeiden Sie das Erstellen von Wrappern um die Speicherclienten-Klassen.If you need to implement a custom retry, avoid creating wrappers around the storage client classes. Verwenden Sie stattdessen die Funktionen zum Erweitern der vorhandenen Richtlinien über die IExtendedRetryPolicy Schnittstelle.Instead, use the capabilities to extend the existing policies through the IExtendedRetryPolicy interface.

  • Bei Verwendung des Lesezugriffs auf georedundante Speicher (RA-GRS) können Sie LocationMode verwenden, um zu bestimmen, dass Wiederholungsversuche nicht auf die sekundäre schreibgeschützte Kopie des Speichers zugreifen sollen, wenn der primäre Zugriff fehlschlägt.If you are using read access geo-redundant storage (RA-GRS) you can use the LocationMode to specify that retry attempts will access the secondary read-only copy of the store should the primary access fail. Bei Verwendung dieser Option müssen Sie jedoch sicherstellen, dass die Anwendung erfolgreich mit Daten arbeiten kann, die möglicherweise veraltet sind, wenn die Replikation vom primären Speicher noch nicht abgeschlossen wurde.However, when using this option you must ensure that your application can work successfully with data that may be stale if the replication from the primary store has not yet completed.

Erwägen Sie, mit den folgenden Einstellungen für Wiederholungsvorgänge zu beginnen.Consider starting with the following settings for retrying operations. Hierbei handelt es sich um allgemeine Einstellungen und Sie sollten die Vorgänge überwachen und die Werte entsprechend Ihrem Szenario optimieren.These settings are general purpose, and you should monitor the operations and fine-tune the values to suit your own scenario.

ContextContext Beispiel-Ziel E2E
Maximale Wartezeit
Sample target E2E
max latency
WiederholungsrichtlinieRetry policy EinstellungenSettings WerteValues So funktioniert'sHow it works
Interaktiv, BenutzeroberflächeInteractive, UI,
oder Vordergrundor foreground
2 Sekunden2 seconds LinearLinear maxAttemptmaxAttempt
deltaBackoffdeltaBackoff
33
500 ms500 ms
Versuch 1 – Verzögerung 500 msAttempt 1 - delay 500 ms
Versuch 2 – Verzögerung 500 msAttempt 2 - delay 500 ms
Versuch 3 – Verzögerung 500 msAttempt 3 - delay 500 ms
HintergrundBackground
oder Batchor batch
30 Sekunden30 seconds ExponentiellExponential maxAttemptmaxAttempt
deltaBackoffdeltaBackoff
55
4 Sekunden4 seconds
Versuch 1 – Verzögerung ca. 3 Sek.Attempt 1 - delay ~3 sec
Versuch 2 – Verzögerung ca. 7 Sek.Attempt 2 - delay ~7 sec
Versuch 3 – Verzögerung ca. 15 Sek.Attempt 3 - delay ~15 sec

TelemetrieTelemetry

Wiederholungsversuche werden in einer TraceSource protokolliert.Retry attempts are logged to a TraceSource. Sie müssen einen TraceListener konfigurieren, um die Ereignisse zu erfassen und diese in ein geeignetes Zielprotokoll zu schreiben.You must configure a TraceListener to capture the events and write them to a suitable destination log. Sie können TextWriterTraceListener oder XmlWriterTraceListener zum Schreiben der Daten in eine Protokolldatei, EventLogTraceListener zum Schreiben in ein Windows-Ereignisprotokoll oder EventProviderTraceListener zum Schreiben von Daten in das ETW-Subsystem verwenden.You can use the TextWriterTraceListener or XmlWriterTraceListener to write the data to a log file, the EventLogTraceListener to write to the Windows Event Log, or the EventProviderTraceListener to write trace data to the ETW subsystem. Sie können auch automatisches Leeren des Puffers und den Ausführlichkeitsgrad der Ereignisse konfigurieren, die protokolliert werden (z. B. Fehler, Warnung, Information und ausführlich).You can also configure autoflushing of the buffer, and the verbosity of events that will be logged (for example, Error, Warning, Informational, and Verbose). Weitere Informationen finden Sie unter Clientseitige Protokollierung mit der .NET Storage Client Library.For more information, see Client-side Logging with the .NET Storage Client Library.

Vorgänge können eine OperationContext-Instanz erhalten, die ein Retrying-Ereignis verfügbar macht, das zum Anfügen von benutzerdefinierter Telemetrielogik verwendet werden kann.Operations can receive an OperationContext instance, which exposes a Retrying event that can be used to attach custom telemetry logic. Weitere Informationen finden Sie unter OperationContext.Ereignis Erneuter Versuch.For more information, see OperationContext.Retrying Event.

BeispieleExamples

Im folgenden Codebeispiel wird veranschaulicht, wie Sie zwei TableRequestOptions -Instanzen mit verschiedenen Wiederholungseinstellungen erstellen; eine für interaktive Anforderungen und eine für Anforderungen im Hintergrund.The following code example shows how to create two TableRequestOptions instances with different retry settings; one for interactive requests and one for background requests. Im Beispiel werden dann diese beiden Richtlinien auf dem Client festgelegt, sodass sie für alle Anforderungen gelten und außerdem wird die interaktive Strategie für eine bestimmte Anforderung festgelegt, damit sie die auf den Client angewandten Standardeinstellungen überschreibt.The example then sets these two retry policies on the client so that they apply for all requests, and also sets the interactive strategy on a specific request so that it overrides the default settings applied to the client.

using System;
using System.Threading.Tasks;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.RetryPolicies;
using Microsoft.WindowsAzure.Storage.Table;

namespace RetryCodeSamples
{
    class AzureStorageCodeSamples
    {
        private const string connectionString = "UseDevelopmentStorage=true";

        public async static Task Samples()
        {
            var storageAccount = CloudStorageAccount.Parse(connectionString);

            TableRequestOptions interactiveRequestOption = new TableRequestOptions()
            {
                RetryPolicy = new LinearRetry(TimeSpan.FromMilliseconds(500), 3),
                // For Read-access geo-redundant storage, use PrimaryThenSecondary.
                // Otherwise set this to PrimaryOnly.
                LocationMode = LocationMode.PrimaryThenSecondary,
                // Maximum execution time based on the business use case.
                MaximumExecutionTime = TimeSpan.FromSeconds(2)
            };

            TableRequestOptions backgroundRequestOption = new TableRequestOptions()
            {
                // Client has a default exponential retry policy with 4 sec delay and 3 retry attempts
                // Retry delays will be approximately 3 sec, 7 sec, and 15 sec
                MaximumExecutionTime = TimeSpan.FromSeconds(30),
                // PrimaryThenSecondary in case of Read-access geo-redundant storage, else set this to PrimaryOnly
                LocationMode = LocationMode.PrimaryThenSecondary
            };

            var client = storageAccount.CreateCloudTableClient();
            // Client has a default exponential retry policy with 4 sec delay and 3 retry attempts
            // Retry delays will be approximately 3 sec, 7 sec, and 15 sec
            // ServerTimeout and MaximumExecutionTime are not set

            {
                // Set properties for the client (used on all requests unless overridden)
                // Different exponential policy parameters for background scenarios
                client.DefaultRequestOptions = backgroundRequestOption;
                // Linear policy for interactive scenarios
                client.DefaultRequestOptions = interactiveRequestOption;
            }

            {
                // set properties for a specific request
                var stats = await client.GetServiceStatsAsync(interactiveRequestOption, operationContext: null);
            }

            {
                // Set up notifications for an operation
                var context = new OperationContext();
                context.ClientRequestID = "some request id";
                context.Retrying += (sender, args) =>
                {
                    /* Collect retry information */
                };
                context.RequestCompleted += (sender, args) =>
                {
                    /* Collect operation completion information */
                };
                var stats = await client.GetServiceStatsAsync(null, context);
            }
        }
    }
}

Weitere InformationenMore information

Allgemeine REST-und WiederholungsrichtlinienGeneral REST and retry guidelines

Berücksichtigen Sie beim Zugriff auf die Dienste von Azure oder von Drittanbietern Folgendes:Consider the following when accessing Azure or third-party services:

  • Verwenden Sie einen systematischen Ansatz zur Verwaltung von Wiederholungen, vielleicht als wiederverwendbaren Code, sodass Sie eine einheitliche Methodik für alle Clients und alle Lösungen anwenden können.Use a systematic approach to managing retries, perhaps as reusable code, so that you can apply a consistent methodology across all clients and all solutions.

  • Verwenden Sie ggf. ein Wiederholungsframework (beispielsweise Polly), um Wiederholungen zu verwalten, wenn der Zieldienst oder der Client nicht über einen integrierten Wiederholungsmechanismus verfügt.Consider using a retry framework such as Polly to manage retries if the target service or client has no built-in retry mechanism. Dies hilft Ihnen bei der Implementierung eines konsistenten Wiederholungsverhaltens, und kann eine geeignete Standardwiederholungsstrategie für den Zieldienst bereitstellen.This will help you implement a consistent retry behavior, and it may provide a suitable default retry strategy for the target service. Sie müssen aber unter Umständen einen benutzerdefinierten Wiederholungscode für Dienste erstellen, die kein Standardverhalten aufweisen und nicht auf Ausnahmen vertrauen, um vorübergehende Fehler anzuzeigen, oder wenn Sie eine Retry-Response-Antwort verwenden möchten, um das Wiederholungsverhalten zu verwalten.However, you may need to create custom retry code for services that have nonstandard behavior, that do not rely on exceptions to indicate transient failures, or if you want to use a Retry-Response reply to manage retry behavior.

  • Die vorübergehende Erkennungslogik hängt von der tatsächlichen Client-API ab, die Sie verwenden, um die REST-Aufrufe aufzurufen.The transient detection logic will depend on the actual client API you use to invoke the REST calls. Einige Clients, z.B. die neuere HttpClient-Klasse, lösen keine Ausnahmen für abgeschlossene Anforderungen mit einem nicht erfolgreichen HTTP-Statuscode aus.Some clients, such as the newer HttpClient class, will not throw exceptions for completed requests with a non-success HTTP status code.

  • Der vom Dienst zurückgegebene HTTP-Statuscode kann dabei helfen, zu erkennen, ob der Fehler vorübergehend ist.The HTTP status code returned from the service can help to indicate whether the failure is transient. Möglicherweise müssen Sie die Ausnahmen, die von einem Client oder dem Wiederholungsframework erzeugt wurden untersuchen, um auf den Statuscode zuzugreifen oder um den entsprechenden Ausnahmetyp bestimmen zu können.You may need to examine the exceptions generated by a client or the retry framework to access the status code or to determine the equivalent exception type. Die folgenden HTTP-Codes geben in der Regel an, dass eine Wiederholung geeignet ist:The following HTTP codes typically indicate that a retry is appropriate:

    • 408 Anforderungstimeout408 Request Timeout
    • 429 – Zu viele Anforderungen429 Too Many Requests
    • 500 Interner Serverfehler500 Internal Server Error
    • 502 Ungültiges Gateway502 Bad Gateway
    • 503 Dienst nicht verfügbar503 Service Unavailable
    • 504 Gateway-Timeout504 Gateway Timeout
  • Wenn Sie Ihre Wiederholungslogik auf Ausnahmen basieren, wird in der Regel durch Folgendes angezeigt, dass ein vorübergehender Fehler besteht, da keine Verbindung hergestellt werden konnte:If you base your retry logic on exceptions, the following typically indicate a transient failure where no connection could be established:

    • WebExceptionStatus.ConnectionClosedWebExceptionStatus.ConnectionClosed
    • WebExceptionStatus.ConnectFailureWebExceptionStatus.ConnectFailure
    • WebExceptionStatus.TimeoutWebExceptionStatus.Timeout
    • WebExceptionStatus.RequestCanceledWebExceptionStatus.RequestCanceled
  • Im Fall des Status „Dienst nicht verfügbar“ weist der Dienst unter Umständen auf die entsprechende Verzögerung vor der Wiederholung im Retry-After -Antwort-Header oder in einem anderen benutzerdefinierten Header hin.In the case of a service unavailable status, the service might indicate the appropriate delay before retrying in the Retry-After response header or a different custom header. Dienste können auch zusätzliche Informationen als benutzerdefinierte Header oder in den Inhalt der Antwort eingebettet senden.Services might also send additional information as custom headers, or embedded in the content of the response.

  • Führen Sie keine Wiederholung für Statuscodes durch, die Clientfehler (Fehler im Bereich 4xx) darstellen, mit Ausnahme des Fehlers 408 (Anforderungstimeout) und 429 (Zu viele Anforderungen).Do not retry for status codes representing client errors (errors in the 4xx range) except for a 408 Request Timeout and 429 Too Many Requests.

  • Testen Sie Ihre Wiederholungsstrategien und Mechanismen gründlich unter verschiedenen Bedingungen, wie z. B. verschiedenen Netzwerkzuständen und sich ändernden Systemlastverteilungen.Thoroughly test your retry strategies and mechanisms under a range of conditions, such as different network states and varying system loadings.

WiederholungsstrategienRetry strategies

Im Folgenden sind die typischen Arten von Wiederholungsstrategie-Intervallen dargestellt:The following are the typical types of retry strategy intervals:

  • Exponential:Exponential. Eine Wiederholungsrichtlinie, mit der eine angegebene Anzahl von Wiederholungsversuchen durchgeführt wird, bei der ein zufälliger exponentieller Backoff-Ansatz zur Ermittlung des Intervalls zwischen den Wiederholungsversuchen verwendet wird.A retry policy that performs a specified number of retries, using a randomized exponential back off approach to determine the interval between retries. Beispiel:For example:

    var random = new Random();
    
    var delta = (int)((Math.Pow(2.0, currentRetryCount) - 1.0) *
                random.Next((int)(this.deltaBackoff.TotalMilliseconds * 0.8),
                (int)(this.deltaBackoff.TotalMilliseconds * 1.2)));
    var interval = (int)Math.Min(checked(this.minBackoff.TotalMilliseconds + delta),
                    this.maxBackoff.TotalMilliseconds);
    retryInterval = TimeSpan.FromMilliseconds(interval);
    
  • Incremental:Incremental. Eine Wiederholungsstrategie mit einer angegebenen Anzahl von Wiederholungsversuchen und einem inkrementellen Zeitintervall zwischen den Wiederholungen.A retry strategy with a specified number of retry attempts and an incremental time interval between retries. Beispiel:For example:

    retryInterval = TimeSpan.FromMilliseconds(this.initialInterval.TotalMilliseconds +
                    (this.increment.TotalMilliseconds * currentRetryCount));
    
  • LinearRetry:LinearRetry. Eine Wiederholungsrichtlinie, bei der eine angegebene Anzahl von Wiederholungen durchgeführt und ein angegebenes festes Zeitintervall zwischen den Wiederholungen verwendet wird.A retry policy that performs a specified number of retries, using a specified fixed time interval between retries. Beispiel:For example:

    retryInterval = this.deltaBackoff;
    

Behandeln von vorübergehenden Fehlern mit PollyTransient fault handling with Polly

Polly ist eine Bibliothek zur programmgesteuerten Behandlung von Wiederholungsversuchen und Schutzschalter-Strategien.Polly is a library to programmatically handle retries and circuit breaker strategies. Das Polly-Projekt ist ein Mitglied der .NET Foundation.The Polly project is a member of the .NET Foundation. Für Dienste, bei denen der Client Wiederholungsversuche nicht nativ unterstützt, ist Polly eine zulässige Alternative. Es ist hierbei nicht erforderlich, benutzerdefinierten Code für die Wiederholungsversuche zu schreiben, dessen richtige Implementierung schwierig sein kann.For services where the client does not natively support retries, Polly is a valid alternative and avoids the need to write custom retry code, which can be hard to implement correctly. Polly bietet auch eine Möglichkeit zum Überwachen des Auftretens von Fehlern, damit Sie Wiederholungsversuche protokollieren können.Polly also provides a way to trace errors when they occur, so that you can log retries.

Weitere InformationenMore information