Optimieren Ihres bot: Ratenbegrenzung und bewährte Methoden in Microsoft TeamsOptimize your bot: rate limiting and best practices in Microsoft Teams

Als allgemeiner Grundsatz sollte Ihre Anwendung die Anzahl der Nachrichten begrenzen, die Sie an eine einzelne Chat-oder Kanal Unterhaltung sendet.As a general principle, your application should limit the number of messages it posts to an individual chat or channel conversation. Dadurch wird eine optimale Oberfläche gewährleistet, bei der die Endbenutzer nicht "spammy" empfinden.This ensures an optimal experience that doesn't feel “spammy” to your end users.

Um Microsoft Teams und seine Benutzer zu schützen, begrenzen die bot-APIs eingehende Anforderungen.To protect Microsoft Teams and its users, the bot APIs rate-limit incoming requests. Apps, die diesen Grenzwert überschreiten, erhalten einen HTTP 429 Too Many Requests Fehlerstatus.Apps that go over this limit receive an HTTP 429 Too Many Requests error status. Alle Anforderungen unterliegen der gleichen Richtlinie zur Ratenbegrenzung, einschließlich Senden von Nachrichten, Kanal Aufzählungen und Dienstplan abrufen.All requests are subject to the same rate-limiting policy, including sending messages, channel enumerations, and roster fetches.

Da die genauen Werte von Raten Grenzwerten geändert werden können, wird empfohlen, dass Ihre Anwendung das entsprechende Backoff-Verhalten implementiert, wenn die API zurückgegeben wird HTTP 429 Too Many Requests .Because the exact values of rate limits are subject to change, we recommend your application implement the appropriate backoff behavior when the API returns HTTP 429 Too Many Requests.

Grenzwerte für die Handhabungs RateHandling rate limits

Beim Ausgeben eines bot-Generator-SDK-Vorgangs können Sie Microsoft.Rest.HttpOperationException den Statuscode verarbeiten und überprüfen.When issuing a Bot Builder SDK operation, you can handle Microsoft.Rest.HttpOperationException and check for the status code.

try
{
    // Perform Bot Framework operation
    // for example, await connector.Conversations.UpdateActivityAsync(reply);
}
catch (HttpOperationException ex)
{
    if (ex.Response != null && (uint)ex.Response.StatusCode ==  429)
    {
        //Perform retry of the above operation/Action method
    }
}

Bewährte MethodenBest practices

Im Allgemeinen sollten Sie einfache Vorkehrungen treffen, um den Empfang von Antworten zu vermeiden HTTP 429 .In general, you should take simple precautions to avoid receiving HTTP 429 responses. Vermeiden Sie beispielsweise das ausgeben mehrerer Anforderungen an dieselbe persönliche oder Kanal Unterhaltung.For instance, avoid issuing multiple requests to the same personal or channel conversation. Verwenden Sie stattdessen die Batchverarbeitung der API-Anforderungen.Instead, consider batching the API requests.

Das Verwenden einer exponentiellen Backoff mit einem willkürlichen Jitter ist die empfohlene Vorgehensweise zum Behandeln von 429er.Using an exponential backoff with a random jitter is the recommended way to handle 429s. Dadurch wird sichergestellt, dass mehrere Anforderungen keine Kollisionen bei Wiederholungsversuchen einführen.This ensures that multiple requests don't introduce collisions on retries.

Beispiel: Erkennen von vorübergehenden AusnahmenExample: detecting transient exceptions

Im folgenden finden Sie ein Beispiel für die Verwendung eines exponentiellen Backoff über den Anwendungs Block der transienten Fehlerbehandlung.Here is a sample using exponential backoff via the Transient Fault Handling Application Block.

Sie können Backoff und Wiederholungsversuche mit vorübergehender Fehlerbehandlungdurchführen.You can perform backoff and retries using Transient Fault Handling. Richtlinien zum beziehen und Installieren des NuGet-Pakets finden Sie unter Hinzufügen des Anwendungsblocks der vorübergehenden Fehlerbehandlung zu Ihrer Lösung).For guidelines on obtaining and installing the NuGet package, see Adding the Transient Fault Handling Application Block to Your Solution). Siehe auch transient Fault Handling.See also Transient fault handling.

public class BotSdkTransientExceptionDetectionStrategy : ITransientErrorDetectionStrategy
    {
        // List of error codes to retry on
        List<int> transientErrorStatusCodes = new List<int>() { 429 };

        public bool IsTransient(Exception ex)
        {
            if (ex.Message.Contains("429"))
                return true;

            var httpOperationException = ex as HttpOperationException;
            if (httpOperationException != null)
            {
                return httpOperationException.Response != null &&
                        transientErrorStatusCodes.Contains((int)httpOperationException.Response.StatusCode);
            }

            return false;
        }
    }

Beispiel: BackoffExample: backoff

Zusätzlich zur Ermittlung von Raten Grenzwerten können Sie auch eine exponentielle Backoff ausführen.In addition to detecting rate limits, you can also perform an exponential backoff.

/**
* The first parameter specifies the number of retries before failing the operation.
* The second parameter specifies the minimum and maximum backoff time respectively.
* The last parameter is used to add a randomized  +/- 20% delta to avoid numerous clients retrying simultaneously.
*/
var exponentialBackoffRetryStrategy = new ExponentialBackoff(3, TimeSpan.FromSeconds(2),
                        TimeSpan.FromSeconds(20), TimeSpan.FromSeconds(1));


// Define the Retry Policy
var retryPolicy = new RetryPolicy(new BotSdkTransientExceptionDetectionStrategy(), exponentialBackoffRetryStrategy);

//Execute any bot sdk action
await retryPolicy.ExecuteAsync(() => connector.Conversations.ReplyToActivityAsync( (Activity)reply) ).ConfigureAwait(false);

Sie können auch eine System.Action Methodenausführung mit der oben beschriebenen Wiederholungs Richtlinie ausführen.You can also perform a System.Action method execution with the retry policy described above. Mit der referenzierten Bibliothek können Sie auch ein festes Intervall oder einen linearen Backoff-Mechanismus angeben.The referenced library also allows you to specify a fixed interval or a linear backoff mechanism.

Es wird empfohlen, den Wert und die Strategie in einer Konfigurationsdatei zu speichern, um Werte zur Laufzeit zu optimieren und zu optimieren.We recommend storing the value and strategy in a configuration file to fine-tune and tweak values at run time.

Weitere Informationen finden Sie in diesem handlichen Leitfaden für verschiedene Wiederholungsmuster: Wiederholungsmuster.For more information, check out this handy guide on various retry patterns: Retry pattern.

Pro bot pro Thread-GrenzwertPer bot per thread limit

Hinweis

Die Nachrichten Aufteilung auf Dienstebene führt zu höheren als erwarteten Anforderungen pro Sekunde (RPS).Message splitting at the service level will result in higher than expected requests per second (RPS). Wenn Sie Bedenken haben, sich an die Grenzwerte zu wenden, sollten Sie die oben beschriebene Backoff-Strategie implementieren.If you're concerned about approaching the limits, you should implement the backoff strategy described above. Die unten angegebenen Werte dienen nur der Schätzung.The values provided below are for estimation only.

Dieser Grenzwert steuert den Datenverkehr, den ein bot für eine einzelne Unterhaltung generieren darf.This limit controls the traffic that a bot is allowed to generate on a single conversation. Eine Unterhaltung ist 1:1 zwischen bot und Benutzer, einem Gruppenchat oder einem Kanal in einem Team.A conversation here is 1:1 between bot and user, a group-chat, or a channel in a team.

SzenarioScenario Zeitraum (Sek.)Time-period (sec) Max. zulässige VorgängeMax allowed operations
An Unterhaltung sendenSend to Conversation 1 1 7 7
An Unterhaltung sendenSend to Conversation 2 2 8 8
An Unterhaltung sendenSend to Conversation 3030 6060
An Unterhaltung sendenSend to Conversation 36003600 18001800
Unterhaltung erstellenCreate Conversation 1 1 7 7
Unterhaltung erstellenCreate Conversation 2 2 8 8
Unterhaltung erstellenCreate Conversation 3030 6060
Unterhaltung erstellenCreate Conversation 36003600 18001800
Abrufen von Unterhaltungs MitgliedernGet Conversation Members 1 1 14 14
Abrufen von Unterhaltungs MitgliedernGet Conversation Members 2 2 16 16
Abrufen von Unterhaltungs MitgliedernGet Conversation Members 3030 120120
Abrufen von Unterhaltungs MitgliedernGet Conversation Members 36003600 36003600
Unterhaltungen abrufenGet Conversations 1 1 14 14
Unterhaltungen abrufenGet Conversations 2 2 16 16
Unterhaltungen abrufenGet Conversations 3030 120120
Unterhaltungen abrufenGet Conversations 36003600 36003600

Grenzwert pro Thread für alle BotsPer thread limit for all bots

Dieser Grenzwert steuert den Datenverkehr, den alle Bots in einer einzigen Unterhaltung generieren dürfen.This limit controls the traffic that all bots are allowed to generate across a single conversation. Eine Unterhaltung ist 1:1 zwischen bot und Benutzer, einem Gruppenchat oder einem Kanal in einem Team.A conversation here is 1:1 between bot and user, a group-chat, or a channel in a team.

SzenarioScenario Zeitraum (Sek.)Time-period (sec) Max. zulässige VorgängeMax allowed operations
An Unterhaltung sendenSend to Conversation 1 1 14 14
An Unterhaltung sendenSend to Conversation 2 2 16 16
Unterhaltung erstellenCreate Conversation 1 1 14 14
Unterhaltung erstellenCreate Conversation 2 2 16 16
CreateconversationCreateConversation 1 1 14 14
CreateconversationCreateConversation 2 2 16 16
Abrufen von Unterhaltungs MitgliedernGet Conversation Members 1 1 2828
Abrufen von Unterhaltungs MitgliedernGet Conversation Members 2 2 3232
Unterhaltungen abrufenGet Conversations 1 1 2828
Unterhaltungen abrufenGet Conversations 2 2 3232