Exchange 中的 EWS 限制
了解在使用 Exchange 时影响 EWS 的限制策略。
提供者: Glen Scales; Michael Mainer,Microsoft Corporation
本文提供有关 Exchange Online、作为 Office 365 的一部分的 Exchange Online 以及从 Exchange 2010 开始的 Exchange 本地版本中的 EWS 限制信息。 Exchange 中的限制通过限制单个用户或应用程序可使用的服务器资源量来帮助确保服务器的可靠性和运行时间。 限制是对可能会影响服务可靠性和功能的系统资源过度使用的响应。 Exchange 持续监视关键基础结构资源 (如邮箱数据库) 的运行状况。 如果检测到使这些资源性能降低的高负载因素,则会根据每个调用方对此高负载条件的贡献量按比例限制 EWS 连接。 结果是,用户可能处于引擎限制限制范围内,并且在资源运行状况恢复到操作级别之前仍会遇到速度减慢的问题。
Exchange 中的每个客户端访问协议 (包括 EWS) 都有限制策略。 设计使用 EWS 的应用程序时,请务必考虑限制策略,以帮助确保 Exchange 服务器的应用程序可靠性和运行状况。 本文介绍了 EWS 的不同限制策略和服务限制,无论你是面向 Exchange Online 还是从 Exchange Server 2010 开始的 Exchange 本地部署版本。 根据适用,本文还介绍了不同版本的 Exchange 中限制策略的差异。
重要
Exchange Online 和 Exchange 本地部署之间的默认限制策略、限制策略访问权限和限制策略配置有所不同。 特定限制设置值仅适用于特定版本的 Exchange。 由于设置值因版本而异,并且 Exchange 管理员可以更改本地部署的默认限制策略,因此本文不提供默认设置值。 请务必注意设计在引擎限制限制范围内运行并相应地响应限制方案的应用程序的注意事项。
如果你是应用程序开发人员,则需要将限制因素纳入应用程序设计。 不同版本的 Exchange 具有不同的 EWS 限制参数的默认值。 设计为访问不同版本的 Exchange 的客户端和服务应用程序将需要考虑这些设置,无论它们是默认值、由Exchange 管理员设置的自定义值,还是像 Exchange Online 那样由默认设置且不可发现。 由于无法以编程方式发现限制参数值,因此客户端设计规范应包括应用程序的计划,以适应不同的潜在引擎限制限制。 设计将访问大量邮箱的多线程应用程序时,或者当许多客户端访问同一邮箱时,请考虑默认策略应用于 Exchange 的并发限制。
影响 EWS 的限制策略
Exchange 中的限制策略不仅影响 EWS,还会影响与 Exchange 服务器的所有客户端连接,包括 Office Outlook、Outlook Web App 和 Exchange ActiveSync 使用的协议。
CPUStartPercent 限制策略可能会影响运行 Exchange 2010 时的 EWS 性能。 当客户端访问服务器上运行 Exchange 进程的平均 CPU 使用率 (包括但不限于 EWS 进程) 超过此策略指定的值时,入站请求将延迟以降低 CPU 使用率。 无法更改此策略的值,但了解此策略有助于排查性能问题。 客户端访问服务器为此值执行的采样逻辑是 10 秒滚动窗口的平均值。 这使得该进程能够对 CPU 使用率的快速提升做出适当的反应。 超过此阈值时,到 EWS 的入站连接将延迟。 在每个 EWS 请求理论上 100% 的 CPU 使用率下,这个延迟的上限是500毫秒 (msecs)。 如果传递了获取 100 个项目的批处理 EWS 请求,服务器将检查 CPU 使用率 100 次 (每项一次),最大延迟为 50 秒。 延迟时间与 CPU 使用率成线性比例。 在 CPUStartPercent,延迟为 0 (线程生成),并且在 100% CPU 使用率下呈线性增大至 500 毫秒。 由于限制策略适用于所有 Exchange 用户,因此 CPU 使用率不太可能超过 Exchange 客户端访问服务器上的 CPUStartPercent 限制,因为单个用户或应用程序无法获得足够的 CPU 利用率来影响服务器操作。
下表列出了影响使用 EWS 的应用程序的限制策略参数。
表 1: 影响 EWS 的限制策略参数
限制策略参数名称 | 应用于 | 说明 |
---|---|---|
DiscoveryMaxConcurrency | Exchange 2013 Exchange Online | 指定用户可同时拥有的并发发现搜索的执行数量。 |
DiscoveryMaxKeywords | Exchange 2013 Exchange Online | 指定用户可以在发现搜索中包含的最大关键字数。 |
DiscoveryMaxKeywordsPerPage | Exchange 2013 Exchange Online | 指定要为其显示统计信息的关键字数。 |
DiscoveryMaxMailboxes | Exchange 2013 Exchange Online | 指定用户可在发现搜索中包括的最大源邮箱数量。 |
DiscoveryMaxMailboxesResultsOnly | Exchange 2013 Exchange Online | 指定可在“就地 eDiscovery”搜索中搜索而无法查看统计数据的最大邮箱数量。 |
DiscoveryPreviewSearchResultsPageSize | Exchange 2013 Exchange Online | 指定电子数据展示搜索预览响应中返回的消息数。 |
EwsCutoffBalance | Exchange 2013 Exchange Online | 指定在完全阻止用户在特定组件上执行操作止之前用户的资源消耗量限值。 |
EwsMaxBurst | Exchange 2013 Exchange Online | 定义在限制 EWS 用户之前能消耗资源升级量的时间量。 此值以毫秒为单位计量。 每个组件的此值会分别设置。 |
EwsRechargeRate | Exchange 2013 Exchange Online | 定义在预算时间中,EWS 用户的预算在速率 (预算增长速率) 为多少时会进行充值。 |
EWSMaxSubscriptions | Exchange 2010 Exchange 2013 Exchange Online | 定义用户在特定的客户端访问服务器上一次可以拥有的活动推送、拉动和流式通知订阅的最大数量。 对于不同的 Exchange 版本,预算不同。 |
EWSFastSearchTimeoutInSeconds | Exchange 2010 | 定义在 EWS 中使用 Exchange 搜索进行快速搜索在超时前继续执行的时间 (以秒为单位)。快速搜索是在FindItem 操作中使用高级查询语法 (AQS) 查询字符串进行搜索。 |
EWSFindCountLimit | Exchange 2010 Exchange 2013 Exchange Online | 定义 FindItem 操作 或 FindFolder 操作 中的最大项数,对于一个用户来说,在客户端访问服务器的内存中可以同时存在。 此属性的默认值为 1000。 此值的 fallback 值 为 1000。 在 Exchange Online 和 从Exchange 2013 开始的 Exchange 本地版本中,这种限制策略无法通过 cmdlet 查询或配置。 在 Exchange Online 和从 Exchange 2013 开始的 Exchange 本地版本中,AQS 搜索 和任何具有限制的 Exchange 搜索的 EWSFindCountLimit 都是 250 个结果。 没有限制的 Exchange 搜索将返回最多 1000 个结果。 |
EWSPercentTimeInAD | Exchange 2010 | 定义特定用户每分钟执行 Active Directory 请求的时间百分比。 |
EWSPercentTimeInCAS | Exchange 2010 | 定义特定用户每分钟执行客户端访问服务器代码的时间百分比。 |
EWSPercentTimeInMailboxRPC | Exchange 2010 | 定义特定用户每分钟执行邮箱 RPC 请求的时间百分比 |
EWSMaxConcurrency | Exchange 2010 Exchange 2013 Exchange Online | 定义特定用户可以针对一次使用 EWS 的 Exchange 服务器拥有的并发打开连接数。 Exchange 2010 的默认值为 10。 Exchange 2013 和 Exchange Online 的默认值是 27。 此策略适用于除流式处理通知以外的所有操作。 流式处理通知使用 HangingConnectionLimit 指示可用的开放流式处理事件连接数。 有关详细信息,请参阅 需要考虑什么限制值?。 |
MessageRateLimit | Exchange 2010 Exchange 2013 Exchange Online | 定义每分钟可提交的邮件数。 |
RecipientRateLimit | Exchange 2010 Exchange 2013 Exchange Online | 定义用户可在 24 小时内可以处理的收件人数限制。 |
ForwardeeLimit | Exchange 2010 Exchange 2013 Exchange Online | 定义 24 小时内收件箱转发/重定向操作的收件人数限制。 |
ConcurrentSyncCalls | Exchange 2019 Exchange 2016 Exchange Online | 定义用户的并发同步调用数限制 (SyncFolderHierarchy、SyncFolderItems)。 |
谨慎
不要将限制策略设置为 null。 这会将策略设置为等于无限制,这表示未设置限制策略。
显示适用于 Exchange 邮箱的策略
Exchange 本地提供可用于设置和获取限制策略的 Exchange 命令行管理程序 cmdlet。 Exchange Online 不提供对限制策略 cmdlet 的访问权限。
使用以下 cmdlet 显示本地 Exchange Server 部署的限制策略:
Get-ThrottlingPolicy — 获取一个或多个限制策略的客户端限制设置。 有关详细信息,请参阅 TechNet 上的 Get-ThrottlingPolicy。
Get-ThrottlingPolicyAssociation — 使你能够查看对象与其关联的限制策略之间的关系。 对象可以是拥有邮箱的用户、没有邮箱的用户或联系人。 有关详细信息,请参阅 TechNet 上的 Get-ThrottlingPolicyAssociation。
使用以下命令显示 Exchange 2010 的默认限制策略。
- Get-ThrottlingPolicy | Where-Object {$_.IsDefault -eq "True"} | format-list
使用以下命令显示 Exchange 2013 中的全局限制策略 (相当于 Exchange 2010 中的默认限制策略)。
- Get-ThrottlingPolicy | Where-Object {$_.ThrottlingPolicyScope -eq "Global"} | format-list
使用以下命令显示与 Exchange 2010 或 Exchange 2013 中的用户关联的限制策略。 将用户名 john@contoso.com 替换为要为其获取限制策略信息的目标用户的用户名。
- get-ThrottlingPolicyAssociation john@contoso.com | format-list
在 Exchange 命令行管理程序中运行此命令会生成如下所示的输出。
PS C:\>Get-ThrottlingPolicyAssociation john@contoso.com
RunspaceId : 72153d6-9dce-2fae-8dbd-5ca5f760g2df
ObjectId : john
ThrottlingPolicyId :
Name : john
Identity : FHXB-28178dom.contoso.com/Users/john
IsValid : True
NeedsToSuppressPii : False
ExchangeVersion : 0.10 (15.0.0.0)
DistinguishedName : CN=john,CN=Users,DC=FHXB-28178dom,DC=contoso,DC=com
Guid : 2c10dab6-de28-1937-ad8g-535832613a08
注意
当 ThrottlingPolicyId 属性为空时,默认策略将应用于邮箱。
可以使用 Set-ThrottlingPolicy 和 Set-ThrottlingPolicyAssociation cmdlet 在 Exchange 服务器上设置限制策略。 可以使用 New-ThrottlingPolicy 和 Remove-ThrottlingPolicy cmdlet 创建和删除非默认限制策略。
提示
建议设计应用程序以遵守默认限制策略。 仅当客户端应用程序设计无法容纳默认策略时,才对默认限制策略进行更改。 请注意,限制性较低的限制策略可能会对服务可靠性产生负面影响。
使用 EWS 模拟的应用程序的限制注意事项
模拟 是允许单个帐户访问多个帐户的授权方法。 当服务帐户模拟用户时,它将充当用户,因此拥有分配给这些用户的权限。 日志文件将访问记录为模拟用户。 管理员使用基于角色的访问控制 (RBAC) 通过 Exchange 命令行管理程序配置模拟。
使用模拟时,所有限制阈值的预算应用方式不同,具体取决于 Exchange 的版本。 预算是根据模拟的帐户或服务帐户计算的。 如果应用程序是多线程的,并对多个邮箱发出并发请求,则应考虑限制阈值将如何影响应用程序的性能。 通常,在创建使用模拟访问所有邮箱基于服务的应用程序时,请注意对服务帐户的以下限制:
使用模拟时,服务帐户具有用于以下策略参数的单独预算:
- EWSMaxConcurrency
- EWSPercentTimeInAD
- EWSPercentTimeInCAS
- EWSPercentTimeInMailboxRPC
- EWSMaxSubscriptions
- EWSFastSearchTimeoutInSeconds
- EWSFindCountLimit
EWSMaxConcurrency 预算对于所有连接到早于 Exchange 2010 Service Pack 2 (SP2) 更新汇总 4 (RU4) 的 Exchange 版本的服务账户和模拟的账户来说是共享的。 从 Exchange 2010 SP2 RU4 开始,包括 Exchange Online,服务帐户访问权限使用与用户 EWSMaxConcurrency 预算不同的预算。 有关针对 EWS 的 Exchange 并发连接限制策略更新的详细信息,请参阅 Exchange Server 2010 Service Pack 2 更新汇总 4 的描述。
从 Exchange 2010 开始的 Exchange 版本 (包括 Exchange Online) 中的 EWS 流式处理通知具有来自所有其他 EWS 客户端连接的其他克隆 EWSMaxConcurrency 预算。 与所有其他 EWS 操作相比,流式处理通知连接计入单独的预算。 流式处理通知最大并发预算实际上是两个不同的预算: 一个预算用于所有服务帐户,一个预算用于被模拟的帐户。 Exchange Online 和从 Exchange 2013 开始的 Exchange 版本中的流式处理通知使用 HangingConnectionLimit 来限制连接数。
例如,假设 EWSMaxConcurrency 等于 5。 用户可以有五个开放的拉取通知连接,而服务帐户可以与用户同时对用户的邮箱建立五个并发拉取通知连接。
下表标识了如何在服务帐户和要模拟的帐户之间计算 EWSMaxSubscriptions 限制预算。
表 2: EWSMaxSubscriptions 预算核算
Exchange 版本 EWSMaxSubscriptions 限制预算核算 Exchange Online 针对目标邮箱收费。 Exchange 2013 针对目标邮箱收费。 Exchange 2010 SP3 针对目标邮箱收费。 Exchange 2010 SP2 对调用帐户收费。 从 Exchange 2010 SP2 RU4 开始,预算按目标邮箱收费。 Exchange 2010 SP1 对调用帐户收费。 Exchange 2010 对调用帐户收费。 由于 EWSMaxSubscriptions 限制预算针对被模拟的帐户收费,因此只要使用模拟,服务帐户就可以订阅和接收流式处理通知的邮箱数量就没有限制。 对于正在模拟的帐户,每个目标邮箱不能有超过 n 个并发请求数, 其中 n 是 EWSMaxSubscriptions 值。 如果未使用模拟,则同一服务帐户的并发请求总数不能超过 n 个。 因此,我们的收获是,通过对服务帐户使用模拟,可以按指数增加可服务的邮箱数。 有关更多信息,请参阅 在 Exchange 中保持一组订阅和邮箱服务器之间的相关性。
EWSPercentTimeInMailboxRPC、EWSPercentTimeInCAS 和 EWSPercentTimeInAD 策略参数引用单个线程执行的操作。 当应用程序执行多个并发操作时,应考虑这些操作对用户资源预算的累积影响。
限制对 EWS 批处理请求的影响
EWS 使你能够将多个项请求批处理到由客户端访问服务器执行的单个请求中。 这样可以提高效率和性能。 当 Exchange 服务器执行批处理请求时,它会在执行批处理中的每个项后检查用户的预算。 如果应用程序超出预算,则批处理中下一项的处理将延迟到该用户的预算已充值为止。 若要确保使用批处理操作的应用程序成功运行,请限制单个批处理中可包含的项请求数,并将大批处理分成多个小批处理,以提高结果的可靠性。 批处理操作对特定限制阈值的影响取决于请求的类型,要处理的项目大小 (例如,在 UploadItems 或 ExportItems 操作) 和邮箱内容。 限制策略导致请求需要更长时间来处理,从而影响批处理操作。 因此,调用方必须等待更长的响应时间,并且由于 EWS 将批处理请求的执行时间限制为一分钟,因此调用可能会超时。
若要确定应用程序的最佳批大小,请使用各种输入集执行单元测试,以确保应用程序不会在生产环境中遇到任何错误。
影响 EWS 搜索操作的限制策略参数
EWS 中的搜索操作 可能需要大量时间和资源,具体取决于搜索的运行方式和请求的信息。 若要在搜索期间控制资源使用情况,请使用两个策略参数: EWSFastSearchTimeoutInSeconds 和 EWSFindCountLimit。
EWSFastSearchTimeoutInSeconds 策略参数指定 EWS 快速搜索 (也称为内容索引搜索) 在超时之前运行的时间 (以秒为单位)。快速搜索是使用 FindItem 操作 中的高级查询语法 (AQS) 查询字符串进行的搜索。
可以通过两种方式搜索 Exchange 邮箱文件夹:
通过使用 Exchange 存储搜索,该搜索对目标搜索范围中的所有邮件执行顺序扫描。
使用 Exchange 搜索服务 (内容索引)。
这两种类型的搜索都可能导致超时。 如果可能,请使用 Exchange 搜索服务,因为这些搜索通常针对邮箱索引并使用 AQS 查询。 以下示例演示如何使用 EWS 和 Exchange 搜索服务对收件箱执行 AQS 搜索。
ItemView iv = new ItemView(1000);
FindItemsResults<Item> fiitems = service.FindItems(WellKnownFolderName.Inbox, "subject:football", iv);
如果无法使用 AQS 搜索,请避免使用过于复杂的搜索筛选器。 如果查询涉及扩展的 MAPI 属性,请尝试避免基于计算值创建搜索筛选器。 Exchange 2010 中引入了 AQS 搜索。
注意
首次运行复杂的 Exchange 应用商店搜索查询时,它运行非常缓慢,可能会超时。之后,查询将更快地响应。 有关在 Exchange 存储搜索查询期间发生的后端 Exchange 服务器进程的详细信息,请参阅 TechNet 上 了解高项目计数和受限视图的性能影响。 使用 SearchFilter 创建一个动态限制,以帮助将来进行类似的查询,但由于这些限制本质上是动态的,因此它们不是永久性的或可靠的,并且会在最多三天后删除。
EWSFindCountLimit 策略参数指定了一个用户在客户端访问服务器上同时存在于内存中的 FindItem 或 FindFolder 操作结果的最大项目数量。 EWS 在 FindItem 或 FindFolder 请求中处理的每个项目或文件夹都根据 EWSFindCountLimit 元素中指定的预算进行计数。 将响应发送回请求者时,将释放当前调用的查找计数费用。 超出预算时,服务器返回给请求者的响应基于 RequestServerVersion 元素值以及请求者是否指定了分页。 当 RequestServerVersion 元素的值指示 Exchange 2010 或早期版本的 Exchange 时,服务器将发送错误代码为 ErrorServerBusy 的错误响应。 如果 RequestServerVersion 元素的值指示从 Exchange 2010 SP1 或 Exchange Online 开始的 Exchange 版本,并且客户端正在使用分页,则 EWS 可能会返回部分结果集,而不是错误。 应用程序应预计 EWS 可能不会返回所有项。 如果 IncludesLastItemInRange 元素的值为 false,则应用程序应使用新偏移量创建另一个 FindItem 或 FindFolder 请求并继续,直到 IncludesLastItemInRange 元素返回 true。
使用 FindItem 或 FindFolder 操作时,使用分页是非常重要的。 EWS 托管 API 强制使用分页,但如果使用其他方法 (如 EWS 代理对象或原始 SOAP),则需要显式设置分页。 以下示例演示如何在 EWS 托管 API 中使用分页。
ItemView iv = new ItemView(1000);
FindItemsResults<Item> fiFindItemResults = service.FindItems(WellKnownFolderName.Inbox, iv);
注意
Exchange 中的默认策略将页面大小限制为 1000 个项目。 将页面大小设置为大于此数字的值不会产生实际效果。
应用程序还应考虑到 EWSFindCountLimit 限制参数值可能会导致为发出并发请求的应用程序返回部分结果集。 下面的示例演示如何在 EWS 托管 API 中使用 MoreAvailable 属性来确保查询中包含所有结果。
ItemView iv = new ItemView(1000);
service.TraceEnabled = false;
FindItemsResults<Item> fiResults = null;
Do
{
fiResults = service.FindItems(WellKnownFolderName.Inbox, iv);
PropertySet itItemPropSet = new PropertySet(BasePropertySet.IdOnly) { EmailMessageSchema.Body };
//Process Items in Result Set
iv.Offset += fiResults.Items.Count;
}
while (fiResults.MoreAvailable == true);
限制策略和并发
并发是指来自特定用户的连接数。 从收到请求的那一刻起,一直保持连接,直到向请求者发送响应。 如果用户尝试提出的并发请求数超过其策略允许的范围,则新的连接尝试将失败。 但是,现有的连接仍然有效。 限制策略可以通过多种方式影响并发。
EWSMaxConcurrency 限制策略参数设置特定用户一次可以与 Exchange 服务器建立的并发连接数。 若要确定允许的最大并发连接数,请考虑 Outlook 客户端将使用的连接。 Outlook 2007 和 Outlook 2010 使用 EWS 访问可用性和外出 (OOF) 信息。 Mac Outlook 2011 将 EWS 用于所有客户端访问功能。 根据主动连接到用户邮箱的 Outlook 客户端数,用户可用的并发连接数可能会受到限制。 此外,如果应用程序在使用单个安全上下文时必须同时连接到多个邮箱,请务必考虑 EWSMaxConcurrency 策略的值。 有关将单个安全上下文与并发连接配合使用的详细信息,请参阅本文前面的 使用 EWS 模拟的应用程序的限制注意事项。
同时连接到多个邮箱的应用程序必须能够跟踪客户端上的资源使用情况。 由于 EWS 操作基于请求/响应,因此可以通过跟踪在请求开始和收到响应时发生的连接数并确保同时出现不超过 10 个打开的请求,以确保应用程序在 EWSMaxConcurrency 阈值内正常运行。
EWSFindCountLimit 策略参数指定 FindItem 或 FindFolder 操作可同时在客户端访问服务器上为一个用户使用的最大结果大小。 如果应用程序 (或可能多个应用程序) 发出两个并发 EWS FindItem 请求,每个请求为特定用户返回 100 个项目,则从该特定用户的预算中收取的 EWSFindCountLimit 费用为 200。 第一个请求返回时,预算将降至 100,第二个请求返回时,预算将降至零。 如果同一应用程序同时对 1000 个项目发出两个请求,则预算值为 2000 个项目,这超出了 EWSFindCountLimit 值。 如果用户的项目预算低于零,则下一个请求将出现错误,直到用户的预算充值为一个或多个。
EWS 通知应用程序的限制注意事项
如果要生成使用推送、拉取或流式处理通知的 EWS 通知应用程序,应考虑 EWSMaxSubscriptions 和 EWSMaxConcurrency 的限制策略和 HangingConnectionLimit 的影响。
EWSMaxSubscriptions 策略参数指定用户可以同时在特定客户端访问服务器上拥有的活动推送、拉取和流式处理订阅的最大数量。 不同版本的 Exchange 具有不同的参数默认值。 用户可以使用SubscribeToAllFolders 属性订阅邮箱中的所有文件夹 - 这会对 EWSMaxSubscriptions 预算使用单个订阅。 用户可以订阅单个文件夹,每个文件夹订阅都计入 EWSMaxSubscriptions 预算,最多可达到 EWSMaxSubscriptions 参数值设置的限制 (例如,如果EWSMaxSubscriptions设置为 20,用户可以在不同邮箱中订阅 20 个日历文件夹)。
有关模拟和 EWSMaxSubscriptions 参数的信息,请参阅本文前面的 使用 EWS 模拟的应用程序的限制注意事项。
EWSMaxConcurrency 策略参数也可能是 EWS 通知的问题; 例如:
当 EWS 在推送订阅生成通知时增加订阅所有者的连接计数。
当应用程序设计为侦听多个用户的邮箱,并且用户同时收到发送到通讯组列表邮件实例的通知时。
如果通知应用程序是多线程的,并同时发出连接请求以获取有关用户帐户接收的特定消息的详细信息,则可以超出 EWSMaxConcurrency 策略限制。 为此,请考虑监视应用程序中的并发连接,包括服务器可能使用的连接,并在客户端上实现请求队列。
HangingConnectionLimit 仅适用于流式处理通知。 此限制在 web.config 文件中设置,这意味着 Exchange 管理员可以在本地 Exchange 服务器上设置此值,但 Exchange Online 邮箱必须对使用此限制的默认值,对于 Exchange Online、Exchange 2019、Exchange 2016 的默认值为 10,而对于 Exchange 2013 的默认值为 3。 若要了解详细信息,请参阅 需要考虑什么限制值?。
限制策略和应用程序性能
PercentTimeIn 限制策略的以下三个参数会影响 EWS 应用程序在客户端访问服务器上可使用的时间量:
- EWSPercentTimeInAD
- EWSPercentTimeInCAS
- EWSPercentTimeInMailboxRPC
PercentTimeIn 策略参数中指定的值指示分配一个发出请求的线程的时间量。 例如,假定EWSPercentTimeInCAS 值为 90,如果进程发出两个并发请求,且每个请求在客户端访问服务器上每个运行代码花费 54 秒,则该进程在 60 秒的窗口中使用 108 秒。 这表示 EWSPercentTimeInCAS 参数值为 180%。
注意
EWSPercentTimeInCAS 参数值是 EWSPercentTimeInAD 和 EWSPercentTimeInMailboxRPC 参数值的重叠超集。。 这意味着客户端访问服务器处理时间的支出将始终大于 EWSPercentTimeInAD 和 EWSPercentTimeInMailboxRPC 中的支出。 这是因为 Exchange 组件要进行 Active Directory 或 RPC 调用,它必须已经在运行客户端访问服务器代码。 此外,在进行 LDAP 或 RPC 调用时,EWSPercentTimeInCAS 的处理时间支出不会停止。 尽管请求可能正在同步等待来自Active Directory 域服务 (AD DS) 或 Exchange 存储的响应,但该进程仍在服务器上使用线程,因此应继续为该使用量收取线程费用。
应用程序在 60 秒期间可能需要的 CPU 时间量可能会超过这些限制限制; 因此,请务必考虑正在发出的请求的数量和类型。 例如,同时进行的大量 ResolveNames 操作可能超过 EWSPercentTimeInAD 策略参数值。 默认限制策略中包含的策略值旨在允许大多数 EWS 应用程序顺利运行; 但是,当多线程大容量应用程序在一个特定的客户端访问服务器上放置大量请求时,这可能会造成问题。 若要避免这种情况,请考虑限制要对服务器执行的批处理大小。
发送大量电子邮件的限制策略和应用程序
默认限制策略包括三个速率限制策略参数,这些参数可能会影响使用 EWS 在短时间内发送大量消息或批量发送消息的应用程序。
注意
通常,建议不要使用 EWS 发送批量电子邮件。 使用专用于批量邮件服务的 SMTP 主机提交频繁的大批量电子邮件。
MessageRateLimit 策略参数指定任何 Exchange 客户端 (包括 EWS) 每分钟可提交的邮件数。 默认情况下,此策略在 Exchange Online 中设置为每分钟 30 条邮件 (在 Exchange Server 中不受限制)。 对于 Exchange Online 中的普通用户,此速率限制通常已足够。 但是,发送大量电子邮件的应用程序 (例如作为发票程序的一部分) 可能会遇到问题。 超过此策略限制后,邮箱的邮件传递将延迟。 具体而言,当用户或应用程序提交的邮件数超过 MessageRateLimit 参数指定的值时,邮件将长时间出现在发件箱或草稿文件夹中。 在开发传递跟踪系统时,请务必考虑这一点,尤其是在应用程序使用用户通过 Outlook 连接到的邮箱时。 当延迟的项目存储在发件箱或草稿文件夹中时,用户可能会将其解释为错误。
RecipientRateLimit 策略参数指定用户在 24 小时内可以发送到的收件人数量限制。 例如,如果此值设置为 500,则表示单个 Exchange 邮箱帐户每天可向不超过 500 个收件人发送邮件。 此限制适用于组织内部和外部的收件人的邮件。 此默认限制可能会导致某些业务线应用程序出现问题,这些应用程序执行月末发票运行,并且需要向超过此数量的收件人发送邮件。 可以使用外部服务来启用消息的批处理或单独的本地出站中继解决方案来解决此限制。
ForwardeeLimit 策略参数指定可通过收件箱规则将邮件转发或重定向到的最大收件人数。 此参数不限制可转发或重定向到收件人的邮件数量。
超出引擎限制限制时生成的错误
超出限制策略时,EWS 将生成下表中列出的错误之一。
表 3: 引擎限制限制错误
错误 | 限制策略参数 | 说明 |
---|---|---|
ErrorExceededConnectionCount | EWSMaxConcurrency | 指示对服务器的并发请求数超过了用户策略允许的数目。 |
ErrorExceededSubscriptionCount | EWSMaxSubscriptions | 指示已超过用户的限制策略最大订阅计数。 |
ErrorExceededFindCountLimit | EWSFindCountLimit | 指示搜索操作调用已超出可返回的项总数。 |
ErrorServerBusy | EWSPercentTimeInMailboxRPC EWSPercentTimeInCAS EWSPercentTimeInAD |
在服务器繁忙时发生。 与 ErrorServerBusy 错误一起返回的 BackOffMilliseconds 值指示客户端应等待的时间,直到它重新提交导致返回此错误代码响应的请求。 |
下表列出了限制错误返回的 HTTP 状态代码。
表 4: 限制错误返回的 HTTP 状态代码
HTTP 状态代码 | 说明 |
---|---|
HTTP 503 | 指示 EWS 请求正在使用 IIS 排队。 客户端应延迟发送其他请求,直到稍后再发送。 |
HTTP 500 | 指示具有 ErrorServerBusy 错误代码的内部服务器错误。 这指示客户端应延迟发送其他请求,直到稍后再发送。 响应可能包含名为 BackOffMilliseconds 的回避提示。 如果存在,BackOffMilliseconds 的值应用作客户端重新提交请求之前的持续时间。 |
HTTP 200 | 包含带有 ErrorInternalServerError 错误代码的基于 EWS 架构的错误响应。 可能存在内部 ErrorServerBusy 错误代码。 这指示客户端应延迟发送其他请求,直到稍后再发送。 |