Skip to the content.

Teams bot的调用限制

上个月Teams团队发布了对Teams app/bot调用api的频率的限制。这也从侧面说明Teams app越来越多,Teams团队需要优先保证Teams本身的计算资源,来提供流畅的用户体验。

具体的每个限制指标在这里: https://docs.microsoft.com/en-us/microsoftteams/platform/concepts/bots/rate-limit

我解释一下目前的做法,teams app需要注意的地方,以及一些容易混淆的概念:

  • Teams会对大家的api服务返回HTTP 429错误,可能大家之前很少遇到这个status code。429是Too Many Requests,就是请求数太多。服务器无法处理。当达到一些限制条件后,teams就会返回这个code

  • 大家的api服务当遇到这个429时不要惊慌,这个是很平常的预料中的错误,需要做的是稍微等待一会儿,然后再次发送相同的请求给到Teams,如果你的api服务中已经有了retry机制,那就比较简单。如果没有,可以使用这段代码来重试。

public class MyRetryStrategy : ITransientErrorDetectionStrategy
{
    public bool IsTransient(Exception ex)
    {
        var httpOperationException = ex as HttpOperationException;
        if (httpOperationException != null)
        {
            return httpOperationException.Response != null && (int)httpOperationException.Response.StatusCode == 429);
        }
        return false;
    }
}

var exponentialBackoffRetryStrategy = new ExponentialBackoff(5, TimeSpan.FromSeconds(2),
                        TimeSpan.FromSeconds(8), TimeSpan.FromSeconds(16), TimeSpan.FromSeconds(32));

// Setup Retry Policy
var retryPolicy = new RetryPolicy(new MyRetryStrategy(), fixedIntervalRetryStrategy);

await retryPolicy.ExecuteAsync(() => connector.Conversations.ReplyToActivityAsync((Activity)reply)).ConfigureAwait(false);

上面是C#的代码,对于其他语言,做法也类似,当接收到429代码时,等待一段时间,然后重试,再不行再等待一段时间,再重试。

  • 这次的限制分为三个等级:
    • 第一级:你的bot对于一个聊天,这个聊天可以是:一个1对1的聊天,用户和bot的聊天,团队中一个频道的聊天
    • 第二级:所有bot对于一个聊天的限制,也就是说如果这个频道中有很多bot,大家共享这个限制。如果一个bot非常频繁的往频道中发送消息,那意味着其他bot会很大概率收到429出错代码
    • 第三级:你的bot针对datacenter的限制。这个大家可能不好理解。实际上Teams整个系统部署Azure上,但是并不是全部覆盖了所有的Azure数据中心,我们的bot在收到一个message payload时可以看到有一个字段。
{
    "name": "composeExtension/fetchTask",
    "type": "invoke",
    "timestamp": "2019-06-17T14:32:04.956Z",
    "localTimestamp": "2019-06-18T00:32:04.956+10:00",
    "id": "f:1361493733941541435",
    "channelId": "msteams",
    "serviceUrl": "https://smba.trafficmanager.net/apac/",
    "from": {
        "id": "29:1l8B9m9SOOdHTqLDgmXvSrJyHfwd2ihooa7cxgtzJ8QjQ4WFC4mA_8K2Sa7jL-xUh7g4yh8sZIiDOX6vTtoaz6w",
        "name": "Tony Xia",
        "aadObjectId": "56c6599d-9216-4078-a8cf-3f039d36e1fd"
    },
    "conversation": {
        "isGroup": true,
        "conversationType": "channel",
        "tenantId": "aece5000-341d-493a-841d-f67e417f1447",
        "id": "19:bf1cbc367561473db0c3fe762c11b508@thread.skype"
    },
    "recipient": {
        "id": "28:89e9cdd8-f500-4696-a701-7c2323f62a86",
        "name": "TestMsgExt"
    },
    "entities": [
        {
            "locale": "en-US",
            "country": "US",
            "platform": "Windows",
            "type": "clientInfo"
        }
    ],
    "channelData": {
        "channel": {
            "id": "19:bf1cbc367561473db0c3fe762c11b508@thread.skype"
        },
        "team": {
            "id": "19:bf1cbc367561473db0c3fe762c11b508@thread.skype"
        },
        "tenant": {
            "id": "aece5000-341d-493a-841d-f67e417f1447"
        },
        "source": {
            "name": "compose"
        }
    },
    "value": {
        "commandId": "start",
        "commandContext": "compose",
        "context": {
            "theme": "default"
        }
    },
    "locale": "en-US"
}

大家又看到serviceUrl这个字段吗?

https://smba.trafficmanager.net/apac/

上面这个是表明这个是从哪个数据中心传来的数据,APAC就是亚洲太平洋地区。

所以这个条调用限制的意思就是你的bot往一个数据中心的调用次数有限制。大家可能会问:那如果我的teams bot很流行,这个数据中心的很多企业在用这个bot,这个限制有点不公平啊。

放心,首先你的bot很难达到这个限制,如果达到了,你可以向teams团队提申请,我相信他们肯定很愿意看到这种超级teams app,肯定愿意为你的bot放宽限制。😀

Written on August 13, 2019