排查用于 .NET 的 Azure Cosmos DB SDK 中的“请求标头过大”或“请求错误”消息的问题

适用于: NoSQL

“请求标头太大”消息会引发 HTTP 错误代码 400。 如果请求标头的大小增大到超过允许的最大大小,则会发生此错误。

建议使用适用于 .NET 的 Azure Cosmos DB SDK 的最新版本。 应使用版本 3.x,因为此主要版本会将标头大小跟踪添加到异常消息。

故障排除步骤

如果会话或延续标记太大,则会出现“请求标头过大”消息。 以下各节介绍问题的原因及其解决方案在每个类别中。

会话令牌太大

本部分介绍会话令牌太大的情况。

原因

400 错误的请求很可能发生,因为会话令牌太大。 如果以下语句为 true,则会话令牌太大:

  • 错误发生在点作(如创建、读取和更新),其中没有继续标记。
  • 异常在未对应用程序进行任何更改的情况下启动。 会话令牌随着容器中的分区数的增加而增长。 随着数据量的增加或吞吐量的增加,分区数也会增加。

临时缓解

重启客户端应用程序以重置所有会话令牌。 最终,会话令牌会增长回导致问题的以前大小。 若要完全避免此问题,请使用下一部分中的解决方案。

解决方案

重要

升级到至少 .NET v3.20.1v2.16.1。 这些次要版本包含优化,以减少会话令牌大小,以防止标头增长并达到大小限制。

  1. 按照 .NET v3.NET v2 性能提示文章中的指南进行作。 将应用程序转换为将直接连接模式与传输控制协议(TCP)配合使用。 具有 TCP 协议的直接连接模式没有标头大小限制(如 HTTP 协议),因此可避免此问题。 请确保使用最新版本的 SDK,该 SDK 在服务互作不可用时修复了查询作。
  2. 如果具有 TCP 协议的直接连接模式不是工作负荷的选项,请通过更改 客户端一致性级别来缓解它。 会话令牌仅用于会话一致性,这是 Azure Cosmos DB 的默认一致性级别。 其他一致性级别不使用会话令牌。

延续标记太大

本部分介绍延续令牌过大的情况。

原因

如果令牌增长过大,则会在查询作上使用延续令牌的 400 错误请求。 如果不同的查询具有不同的继续标记大小,则也会发生此错误。

解决方案

  1. 按照 .NET v3.NET v2 性能提示文章中的指南进行作。 将应用程序转换为将直接连接模式与 TCP 协议配合使用。 具有 TCP 协议的直接连接模式没有标头大小限制(如 HTTP 协议),因此可避免此问题。
  2. 如果具有 TCP 协议的直接连接模式不是工作负荷的选项,请设置该 ResponseContinuationTokenLimitInKb 选项。 可以在 v2 或 QueryRequestOptions v3 中找到此选项FeedOptions

后续步骤