Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
La limitation du débit est une méthode permettant de limiter les messages à une certaine fréquence maximale. En règle générale, votre application doit limiter le nombre de messages qu’elle publie dans une conversation ou une conversation de canal individuelle. Cela garantit une expérience optimale et les messages ne s’affichent pas en tant que courrier indésirable pour vos utilisateurs.
Pour protéger Microsoft Teams et ses utilisateurs, les API de bot fournissent une limite de débit pour les demandes entrantes. Les applications qui dépassent cette limite reçoivent un état d’erreur HTTP 429 Too Many Requests. Toutes les demandes sont soumises à la même stratégie de limitation de débit, y compris l’envoi de messages, d’énumérations de canaux et d’extractions de listes.
Étant donné que les valeurs exactes des limites de débit sont susceptibles d’être modifiées, votre application doit implémenter le comportement d’interruption approprié lorsque l’API retourne HTTP 429 Too Many Requests.
Gérer les limites de débit
Lors de l’émission d’une opération Bot Builder SDK, vous pouvez gérer Microsoft.Rest.HttpOperationException et vérifier le code d’état.
Le code suivant montre un exemple de limites de débit de gestion :
try
{
// Perform Agent 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
}
}
Une fois que vous avez géré les limites de débit pour les agents, vous pouvez gérer HTTP 429 les réponses à l’aide d’une interruption exponentielle.
Gérer HTTP 429 réponses
Vous devez prendre des précautions simples pour éviter de recevoir des HTTP 429 réponses. Par exemple, évitez d’émettre plusieurs demandes à la même conversation personnelle ou de canal. Au lieu de cela, créez un lot de demandes d’API.
L’utilisation d’un backoff exponentiel avec une instabilité aléatoire est la méthode recommandée pour gérer les 429. Cela garantit que plusieurs requêtes n’introduisent pas de collisions lors de nouvelles tentatives.
Après avoir traité HTTP 429 réponses, vous pouvez passer en revue l’exemple pour détecter les exceptions temporaires.
Remarque
En plus de réessayer le code d’erreur 429, les codes d’erreur 412, 502et 504 doivent également être retentés.
Exemple de détection d’exceptions temporaires
Le code suivant montre un exemple d’utilisation du backoff exponentiel à l’aide du bloc d’application de gestion des erreurs temporaires :
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);
}
}
Vous pouvez effectuer des backoffs et des nouvelles tentatives à l’aide de gestion des erreurs temporaires. Pour obtenir des instructions sur l’obtention et l’installation du package NuGet, consultez ajouter le bloc d’application de gestion des erreurs temporaires à votre solution. Consultez également de gestion des erreurs temporaires.
Une fois que vous avez passé en revue l’exemple de détection des exceptions temporaires, passez par l’exemple de backoff exponentiel. Vous pouvez utiliser le backoff exponentiel au lieu de réessayer en cas d’échec.
Exemple d’interruption
En plus de détecter les limites de débit, vous pouvez également effectuer un backoff exponentiel.
Le code suivant montre un exemple de backoff exponentiel :
/**
* 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 ExponentialBackoffRetryStrategy(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);
Vous pouvez également exécuter une méthode System.Action avec la stratégie de nouvelle tentative décrite dans cette section. La bibliothèque référencée vous permet également de spécifier un intervalle fixe ou un mécanisme de backoff linéaire.
Stockez la valeur et la stratégie dans un fichier de configuration pour affiner et ajuster les valeurs au moment de l’exécution.
Pour plus d’informations, consultez modèles de nouvelles tentatives.
Vous pouvez également gérer la limite de débit à l’aide de la limite par agent et par thread.
Limite par agent et par thread
La limite par agent par thread contrôle le trafic qu’un agent est autorisé à générer dans une seule conversation. Une conversation est 1:1 entre l’agent et l’utilisateur, une conversation de groupe ou un canal dans une équipe. Par conséquent, si l’application envoie un message d’agent à chaque utilisateur, la limite de threads n’est pas limitée.
Remarque
- La limite de thread de 3600 secondes et de 1800 opérations s’applique uniquement si plusieurs messages d’agent sont envoyés à un seul utilisateur.
- La limite globale par application et par locataire est de 50 demandes par seconde (RPS). Par conséquent, le nombre total de messages d’agent par seconde ne doit pas franchir la limite de threads.
- Le fractionnement des messages au niveau du service entraîne un RPS plus élevé que prévu. Si vous craignez de vous approcher des limites, vous devez mettre en œuvre la stratégie de backoff. Les valeurs fournies dans cette section sont uniquement à des fins d’estimation.
Le tableau suivant fournit les limites par agent et par thread :
| Scénario | Période en secondes | Nombre maximal d’opérations autorisées |
|---|---|---|
| Envoyer à la conversation | 1 | 7 |
| Envoyer à la conversation | 2 | 8 |
| Envoyer à la conversation | 30 | 60 |
| Envoyer à la conversation | 3600 | 1800 |
| Créer une conversation | 1 | 7 |
| Créer une conversation | 2 | 8 |
| Créer une conversation | 30 | 60 |
| Créer une conversation | 3600 | 1800 |
| Obtenir les membres de la conversation | 1 | 14 |
| Obtenir les membres de la conversation | 2 | 16 |
| Obtenir les membres de la conversation | 30 | 120 |
| Obtenir les membres de la conversation | 3600 | 3600 |
| Obtenir des conversations | 1 | 14 |
| Obtenir des conversations | 2 | 16 |
| Obtenir des conversations | 30 | 120 |
| Obtenir des conversations | 3600 | 3600 |
Remarque
Les versions précédentes de TeamsInfo.getMembers et TeamsInfo.GetMembersAsync API sont dépréciées. Ils sont limités à cinq demandes par minute et retournent un maximum de 10 000 membres par équipe. Pour mettre à jour votre implémentation afin d’utiliser la récupération des membres paginés, consultez Obtenir le contexte spécifique teams pour votre agent.
Vous pouvez également gérer la limite de débit à l’aide de la limite par thread pour tous les agents.
Limite par thread pour tous les agents
La limite par thread pour tous les agents contrôle le trafic que tous les agents sont autorisés à générer dans une même conversation. Une conversation ici est 1:1 entre l’agent et l’utilisateur, une conversation de groupe ou un canal dans une équipe.
Le tableau suivant fournit la limite par thread pour tous les agents :
| Scénario | Période en secondes | Nombre maximal d’opérations autorisées |
|---|---|---|
| Envoyer à la conversation | 1 | 14 |
| Envoyer à la conversation | 2 | 16 |
| Créer une conversation | 1 | 14 |
| Créer une conversation | 2 | 16 |
| Créer une conversation | 1 | 14 |
| Créer une conversation | 2 | 16 |
| Obtenir les membres de la conversation | 1 | 28 |
| Obtenir les membres de la conversation | 2 | 32 |
| Obtenir des conversations | 1 | 28 |
| Obtenir des conversations | 2 | 32 |