Оптимизация ограничения скорости и рекомендаций в Microsoft Teams.Optimize your bot: rate limiting and best practices in Microsoft Teams

Как правило, ваше приложение должно ограничивать количество сообщений, отправляемых в отдельный чат или беседу по каналу.As a general principle, your application should limit the number of messages it posts to an individual chat or channel conversation. Это обеспечивает оптимальный интерфейс для конечных пользователей.This ensures an optimal experience that doesn't feel “spammy” to your end users.

Чтобы защитить Microsoft Teams и ее пользователей, API-интерфейсам Bot могут ограничивать входящие запросы.To protect Microsoft Teams and its users, the bot APIs rate-limit incoming requests. Приложения, которые переходят по этому ограничению, получают HTTP 429 Too Many Requests состояние ошибки.Apps that go over this limit receive an HTTP 429 Too Many Requests error status. Все запросы распространяются на одну и ту же политику ограничения скорости, включая отправку сообщений, перечисление каналов и извлечение списков.All requests are subject to the same rate-limiting policy, including sending messages, channel enumerations, and roster fetches.

Так как точные значения пределов скорости могут измениться, мы рекомендуем, чтобы приложение выполняло соответствующее поведение при возврате API 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.

Пределы скорости обработкиHandling rate limits

При выполнении операции с пакетом SDK построителя построителя можно обработать Microsoft.Rest.HttpOperationException код состояния и проверить его.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
    }
}

РекомендацииBest practices

В общем случае следует принять простые меры предосторожности, чтобы не получать HTTP 429 ответы.In general, you should take simple precautions to avoid receiving HTTP 429 responses. Например, не выполняйте несколько запросов к одной беседе лично или каналу.For instance, avoid issuing multiple requests to the same personal or channel conversation. Вместо этого рассмотрите возможности пакетной обработки запросов API.Instead, consider batching the API requests.

Использование экспоненциального отработки с случайной колебанием является рекомендуемым способом обработки 429s.Using an exponential backoff with a random jitter is the recommended way to handle 429s. Это гарантирует, что при повторе нескольких запросов не возникать конфликты.This ensures that multiple requests don't introduce collisions on retries.

Пример: Обнаружение временных исключенийExample: detecting transient exceptions

Ниже приведен пример с использованием экспоненциального переработки через временный блок обработки сбоев.Here is a sample using exponential backoff via the Transient Fault Handling Application Block.

Вы можете выполнять операции перегрузки и повторных попыток, используя временную обработку сбоев.You can perform backoff and retries using Transient Fault Handling. Рекомендации по получению и установке пакета NuGet приведены в статье Добавление временного блока обработки сбоев в решение.For guidelines on obtaining and installing the NuGet package, see Adding the Transient Fault Handling Application Block to Your Solution). См. также временная обработка сбоев.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;
        }
    }

Пример: отходExample: backoff

В дополнение к определению пределов скорости, можно также выполнить экспоненциальное переопределение.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);

Выполнение метода также можно выполнить System.Action с помощью политики повторных попыток, описанной выше.You can also perform a System.Action method execution with the retry policy described above. Указанная библиотека также позволяет указать фиксированный интервал или линейный механизм отрезков.The referenced library also allows you to specify a fixed interval or a linear backoff mechanism.

Рекомендуется хранить значение и стратегию в файле конфигурации для точной настройки и корректировки значений во время выполнения.We recommend storing the value and strategy in a configuration file to fine-tune and tweak values at run time.

Дополнительную информацию вы узнаете в этом удобном руководстве по различным шаблонам повторных попыток: шаблон повторов.For more information, check out this handy guide on various retry patterns: Retry pattern.

Предельное число потоков для каждой лентыPer bot per thread limit

Примечание

Разбиение сообщений на уровне службы приведет к превышению ожидаемых запросов в секунду (RPS).Message splitting at the service level will result in higher than expected requests per second (RPS). Если вы беспокоитесь об этих пределах, необходимо реализовать стратегию отработки отказа, описанную выше.If you're concerned about approaching the limits, you should implement the backoff strategy described above. Указанные ниже значения предназначены только для оценки.The values provided below are for estimation only.

Это предельное значение управляет трафиком, который может создаваться с помощью Bot в одной беседе.This limit controls the traffic that a bot is allowed to generate on a single conversation. Беседа — 1:1 между Bot и пользователем, группой-чат или каналом в команде.A conversation here is 1:1 between bot and user, a group-chat, or a channel in a team.

СценарийScenario Период времени (с)Time-period (sec) Максимальное число разрешенных операцийMax allowed operations
Отправить беседуSend to Conversation 1 1 7 7
Отправить беседуSend to Conversation 2 2 8 8
Отправить беседуSend to Conversation более30 6060
Отправить беседуSend to Conversation 36003600 18001800
Создание беседыCreate Conversation 1 1 7 7
Создание беседыCreate Conversation 2 2 8 8
Создание беседыCreate Conversation более30 6060
Создание беседыCreate Conversation 36003600 18001800
Получение участников беседыGet Conversation Members 1 1 14 14
Получение участников беседыGet Conversation Members 2 2 16 16
Получение участников беседыGet Conversation Members более30 120120
Получение участников беседыGet Conversation Members 36003600 36003600
Получение беседGet Conversations 1 1 14 14
Получение беседGet Conversations 2 2 16 16
Получение беседGet Conversations более30 120120
Получение беседGet Conversations 36003600 36003600

Предельное количество потоков для всех БотыPer thread limit for all bots

Это значение управляет трафиком, в течение которого все боты могут создаваться в одной беседе.This limit controls the traffic that all bots are allowed to generate across a single conversation. Беседа — 1:1 между Bot и пользователем, группой-чат или каналом в команде.A conversation here is 1:1 between bot and user, a group-chat, or a channel in a team.

СценарийScenario Период времени (с)Time-period (sec) Максимальное число разрешенных операцийMax allowed operations
Отправить беседуSend to Conversation 1 1 14 14
Отправить беседуSend to Conversation 2 2 16 16
Создание беседыCreate Conversation 1 1 14 14
Создание беседыCreate Conversation 2 2 16 16
креатеконверсатионCreateConversation 1 1 14 14
креатеконверсатионCreateConversation 2 2 16 16
Получение участников беседыGet Conversation Members 1 1 828
Получение участников беседыGet Conversation Members 2 2 3232
Получение беседGet Conversations 1 1 828
Получение беседGet Conversations 2 2 3232