Optimieren eines Bots mit Ratenbegrenzung in Teams
Ratenbegrenzung ist eine Methode, um Nachrichten auf eine bestimmte maximale Häufigkeit zu beschränken. Als allgemeines Prinzip muss Ihre Anwendung die Anzahl der Nachrichten beschränken, die sie auf einen einzelnen Chat oder eine Kanalunterhaltung sendet. Dadurch wird eine optimale Benutzererfahrung sichergestellt, und Nachrichten werden ihren Benutzern nicht als Spam angezeigt.
Um Microsoft Teams und seine Benutzer zu schützen, bieten die Bot-APIs eine Ratenbegrenzung für eingehende Anforderungen. Apps, die diesen Grenzwert überschreiten, erhalten den Fehlerstatus HTTP 429 Too Many Requests
. Alle Anforderungen unterliegen derselben Richtlinie zur Begrenzung der Rate, einschließlich senden von Nachrichten, Kanalaufzählungen und Listenabrufen.
Da sich die genauen Werte von Ratenbegrenzungen ändern können, muss Ihre Anwendung das entsprechende Backoff-Verhalten implementieren, wenn die API HTTP 429 Too Many Requests
zurückgibt.
Behandeln von Ratenbegrenzungen
Beim Ausgeben eines Bot Builder SDK-Vorgangs können Sie Microsoft.Rest.HttpOperationException
behandeln und den Statuscode überprüfen.
Der folgende Code zeigt ein Beispiel für das Behandeln von Ratenbegrenzungen:
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
}
}
Nachdem Sie Ratenbegrenzungen für Bots behandelt haben, können Sie HTTP 429
-Antworten mit einem exponentiellen Backoff verarbeiten.
Behandeln von HTTP 429
-Anworten
Im Allgemeinen müssen Sie einfache Vorsichtsmaßnahmen treffen, um HTTP 429
-Anworten zu vermeiden. Vermeiden Sie beispielsweise, mehrere Anforderungen an dieselbe persönliche oder Kanalunterhaltung auszustellen. Erstellen Sie stattdessen einen Batch der API-Anforderungen.
Die empfohlene Methode zum Behandeln von 429-Ausnahmen ist die Verwendung eines exponentiellen Backoffs mit einem zufälligen Jitter. Dadurch wird sichergestellt, dass mehrere Anforderungen keine Kollisionen bei Wiederholungen auslösen.
Nachdem Sie HTTP 429
-Antworten behandelt haben, können Sie das Beispiel zum Erkennen vorübergehender Ausnahmen durchgehen.
Hinweis
Neben dem Wiederholen des Fehlercodes 429 müssen auch die Fehlercodes 412, 502 und 504 wiederholt werden.
Beispiel für das Erkennen vorübergehender Ausnahmen
Der folgende Code zeigt ein Beispiel für die Verwendung des exponentiellen Backoffs mithilfe des Anwendungsblocks für die Behandlung vorübergehender Fehler:
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;
HttpResponseMessageWrapper? response = null;
if (ex is HttpOperationException httpOperationException)
{
response = httpOperationException.Response;
}
else
if (ex is ErrorResponseException errorResponseException)
{
response = errorResponseException.Response;
}
return response != null && transientErrorStatusCodes.Contains((int)response.StatusCode);
}
}
Sie können Backoff- und Wiederholungsversuche mithilfe der Behandlung vorübergehender Fehler durchführen. Richtlinien zum Abrufen und Installieren des NuGet-Pakets finden Sie unter Hinzufügen des Anwendungsblocks für die Behandlung vorübergehender Fehler zu Ihrer Lösung. Weitere Informationen finden Sie unter Behandlung vorübergehender Fehler.
Nachdem Sie das Beispiel zum Erkennen vorübergehender Ausnahmen durchgearbeitet haben, arbeiten Sie das exponentielle Backoff-Beispiel durch. Sie können statt Wiederholversuchen bei Fehlern einen exponentiellen Backoff verwenden.
Backoff-Beispiel
Zusätzlich zum Erkennen von Ratenbegrenzungen können Sie auch einen exponentiellen Backoff durchführen.
Der folgende Code zeigt ein Beispiel für diesen 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 in diesem Abschnitt beschriebenen Wiederholungsrichtlinie ausführen. Mit der Referenzbibliothek können Sie auch ein festes Intervall oder einen linearen Backoff-Mechanismus angeben.
Speichern Sie den Wert und die Strategie in einer Konfigurationsdatei, um Werte zur Laufzeit fein abzustimmen und zu optimieren.
Weitere Informationen finden Sie unter Wiederholungsmuster.
Sie können die Ratenbegrenzung auch mithilfe des Grenzwerts „Pro Bot pro Thread“ behandeln.
Pro Bot pro Thread-Grenzwert
Der Grenzwert „Pro Bot pro Thread“ steuert den Datenverkehr, den ein Bot in einer einzigen Unterhaltung generieren darf. Eine Unterhaltung ist 1:1 zwischen Bot und Benutzer, einem Gruppenchat oder einem Kanal in einem Team. Wenn die Anwendung also eine Botnachricht an jeden Benutzer sendet, wird der Threadgrenzwert nicht gedrosselt.
Hinweis
- Der Threadgrenzwert von 3600 Sekunden und 1800 Vorgängen gilt nur, wenn mehrere Bot-Nachrichten an einen einzelnen Benutzer gesendet werden.
- Der globale Grenzwert pro App und Mandant beträgt 50 Anforderungen pro Sekunde (RPS). Daher darf die Gesamtzahl der Bot-Nachrichten pro Sekunde den Threadgrenzwert nicht überschreiten.
- Die Nachrichtenaufteilung auf Dienstebene führt zu führt zu höheren RPS als erwartet. Wenn Sie Bedenken haben, sich den Grenzen zu nähern, müssen Sie die Backoff-Strategie implementieren. Die in diesem Abschnitt angegebenen Werte dienen nur der Schätzung.
In der folgenden Tabelle sind die Grenzwerte pro Bot pro Thread aufgeführt:
Szenario | Zeitraum in Sekunden | Maximal zulässige Vorgänge |
---|---|---|
An Unterhaltung senden | 1 | 7 |
An Unterhaltung senden | 2 | 8 |
An Unterhaltung senden | 30 | 60 |
An Unterhaltung senden | 3600 | 1800 |
Unterhaltung erstellen | 1 | 7 |
Unterhaltung erstellen | 2 | 8 |
Unterhaltung erstellen | 30 | 60 |
Unterhaltung erstellen | 3600 | 1800 |
Abrufen von Unterhaltungsmitgliedern | 1 | 14 |
Abrufen von Unterhaltungsmitgliedern | 2 | 16 |
Abrufen von Unterhaltungsmitgliedern | 30 | 120 |
Abrufen von Unterhaltungsmitgliedern | 3600 | 3600 |
Abrufen von Unterhaltungen | 1 | 14 |
Abrufen von Unterhaltungen | 2 | 16 |
Abrufen von Unterhaltungen | 30 | 120 |
Abrufen von Unterhaltungen | 3600 | 3600 |
Hinweis
Frühere Versionen der APIs TeamsInfo.getMembers
und TeamsInfo.GetMembersAsync
sind veraltet. Sie werden auf fünf Anforderungen pro Minute gedrosselt und geben maximal 10K-Mitglieder pro Team zurück. Informationen zum Aktualisieren Ihres Bot-Framework-SDK und des Codes für die Verwendung der neuesten paginierten API-Endpunkte finden Sie unter Bot-API-Änderungen für Team- und Chatmitglieder.
Sie können Ratenbegrenzungsausnahmen auch mithilfe des Grenzwerts „Pro Thread“ für alle Bots behandeln.
Grenzwert pro Thread für alle Bots
Der Grenzwert pro Thread für alle Bots steuert den Datenverkehr, den alle Bots in einer einzigen Unterhaltung generieren dürfen. Hier ist eine Unterhaltung 1:1 zwischen Bot und Benutzer, ein Gruppenchat oder ein Kanal in einem Team.
Die folgende Tabelle enthält den Grenzwert pro Thread für alle Bots:
Szenario | Zeitraum in Sekunden | Maximal zulässige Vorgänge |
---|---|---|
An Unterhaltung senden | 1 | 14 |
An Unterhaltung senden | 2 | 16 |
Unterhaltung erstellen | 1 | 14 |
Unterhaltung erstellen | 2 | 16 |
Unterhaltung erstellen | 1 | 14 |
Unterhaltung erstellen | 2 | 16 |
Abrufen von Unterhaltungsmitgliedern | 1 | 28 |
Abrufen von Unterhaltungsmitgliedern | 2 | 32 |
Abrufen von Unterhaltungen | 1 | 28 |
Abrufen von Unterhaltungen | 2 | 32 |