我们将Outlook REST API用于具有现代Web客户端的大部分功能的应用程序,其中包括很多对话的操作,例如在文件夹中加载对话,移动和删除对话等。
当我研究我们的选项Best way to achieve Conversation view for mail folder using Outlook REST API时,我确实遇到过这个问题
似乎在可能的“会话”端点上没有开发,所以目前我们必须做很多请求以允许用户使用对话。例如,要删除对话,我们需要通过ConversationId上的过滤器(可能是相当多的)获取对话消息,然后为每条消息发出/删除端点的请求。我们确实按照建议使用批量请求,但我不确定它们是否确实使它变得更好或更差。对于一些Office365用户,我们不断收到“503:ErrorMailboxStoreUnavailable - MapiExceptionRpcServerTooBusy:”错误。
很难确切地说出错误发生的原因,因为关于如何确定应用程序的性能以及首先限制的信息非常少。
我绝对不认为我们达到了此处描述的REST API限制:(每个用户每10分钟有10000个请求)
我还检查了速率限制限制和速率限制剩余标题,它们看起来很好。
但是,同时请求似乎存在一些问题,我怀疑这可能与此处描述的限制有关:
https://msdn.microsoft.com/en-us/library/office/jj945066(v=exchg.150).aspx
我不是交易所的专家,因此我很难确定问题所在。另外,我找不到有关其余API限制与Exchange限制之间关系的信息。例如,每次20个请求的2个批量请求是否可以打破此限制:EWSMaxConcurrency(根据文档,在线excel为27个)
看看我们的日志,我的第一个猜测是那些与会话相关的请求太贪心了。
我们可以遵循哪些指导方针来解决这种情况吗?
我将在这里粘贴错误以防万一。谢谢!
503. {"error":{"code":"ErrorMailboxStoreUnavailable","message":"The mailbox database is temporarily unavailable., MapiExceptionRpcServerTooBusy: Unable to get properties on object. (hr=0x80004005, ec=2419)
Diagnostic context:
......
Lid: 64625 StoreEc: 0x97F
Lid: 52788
Lid: 55847 EMSMDBPOOL.EcPoolSessionDoRpc called [length=117]
Lid: 43559 EMSMDBPOOL.EcPoolSessionDoRpc returned [ec=0x97F][length=522][latency=1015]
Lid: 32881 StoreEc: 0x97F
Lid: 50035
Lid: 64625 StoreEc: 0x97F
Lid: 52788
Lid: 55847 EMSMDBPOOL.EcPoolSessionDoRpc called [length=117]
Lid: 43559 EMSMDBPOOL.EcPoolSessionDoRpc returned [ec=0x97F][length=522][latency=1000]
Lid: 32881 StoreEc: 0x97F
Lid: 50035
Lid: 64625 StoreEc: 0x97F
Lid: 52788
Lid: 55847 EMSMDBPOOL.EcPoolSessionDoRpc called [length=117]
Lid: 43559 EMSMDBPOOL.EcPoolSessionDoRpc returned [ec=0x97F][length=522][latency=1015]
Lid: 32881 StoreEc: 0x97F
Lid: 50035
Lid: 64625 StoreEc: 0x97F
Lid: 52788
Lid: 55847 EMSMDBPOOL.EcPoolSessionDoRpc called [length=117]
Lid: 43559 EMSMDBPOOL.EcPoolSessionDoRpc returned [ec=0x97F][length=522][latency=1015]
Lid: 32881 StoreEc: 0x97F
Lid: 50035
Lid: 64625 StoreEc: 0x97F
Lid: 63028
Lid: 52176 ClientVersion: 15.20.527.7
Lid: 50032 ServerVersion: 15.20.527.6000
Lid: 50128
Lid: 1494 ---- Remote Context Beg ----
Lid: 48506 StoreEc: 0x80040401
Lid: 32796 StoreEc: 0x80040401
Lid: 43632 StoreEc: 0x80040401
Lid: 61692 StoreEc: 0x80040401
Lid: 34356 StoreEc: 0x97F
Lid: 1750 ---- Remote Context End ----
Lid: 1494 ---- Remote Context Beg ----
Lid: 48506 StoreEc: 0x80040401
Lid: 32796 StoreEc: 0x80040401
Lid: 43632 StoreEc: 0x80040401
Lid: 61692 StoreEc: 0x80040401
Lid: 34356 StoreEc: 0x97F
Lid: 1750 ---- Remote Context End ----
Lid: 50288
Lid: 23354 StoreEc: 0x973
Lid: 35180
Lid: 25913
Lid: 21817 ROP Failure: 0x973
Lid: 20385
Lid: 28577 StoreEc: 0x973
Lid: 32001
Lid: 29953 StoreEc: 0x973
Lid: 32768
Lid: 33024 StoreEc: 0x973 "}
不知道这会有多大帮助,但FWIW。我曾一次就批处理操作及其对节流的影响问了一个类似的问题,并从在该领域工作的其中一个PM得到了回答:
无论是批量API调用还是单个API调用,我们都决定根据它消耗的服务资源来限制或不限制,而不是调用#。因此,我们不会惩罚用于批量处理API请求的应用程序。例如,如果5个API调用需要20个单位的服务资源,并且您使用5个API进行批量调用,我们会将其视为相同的,即20个服务资源单元。在这个例子中,我忽略了处理批处理请求和处理5个单独请求的开销之间的差异。实际上,批量请求比5个单独的请求便宜一点。