上個月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放寬限制。?