Azure 搜索分页导致限制
Azure Search paging causes throttling
我来自运行 nuget.org 的团队,这是 .NET 的包生态系统。我们使用 Azure 搜索来支持我们的搜索 API。我们的 API 是 public,因此第三方客户可以使用它们来分析我们的生态系统或制作应用程序。
我们最近遇到了一次中断,原因是单个客户使用 the $skip and $top query parameters 一次分批 200 个文档来翻阅我们的搜索文档。这导致 Azure 搜索限制:
Failed to execute request because the request rate has caused your service to exceed the limits of its provisioned capacity. Reduce the rate of requests, or adjust the number of replicas/partitions. See http://aka.ms/azure-search-throttling for more information.
Azure 搜索的限制影响了该地区的所有客户 10 分钟,而不仅仅是正在寻呼的单个客户。我们通读了 Azure Search's throttling documentation,但有以下问题:
- 具有高 $skip 值的客户寻呼对于 Azure 搜索来说是否特别昂贵?
- 我们可以做些什么来降低 Azure 搜索在分页场景中受到限制的可能性?
- 我们是否应该添加自己的限制以确保单个客户的搜索不会影响所有其他客户的搜索? Azure 搜索是否有这方面的指导?
关于我们服务的更多信息:
- 索引中的文档数:~950K
- 请求量:约 10 分钟内 1.3K 分页请求。峰值每秒 125 个请求,平均每秒 6 个请求
- 规模:标准SKU,1个分区,3个副本(这是我们的次要区域,因此规模较小以节省资金)
深度分页确实是一个代价高昂的操作。由于 Azure 搜索设计为分布式,所有索引都分为多个分片,以允许快速扩展操作。这样做的缺点是需要合并每个分片的排名结果并进行排名以创建最终的结果列表。要合并的结果数随 skip 值线性增加,因此当对结果进行非常深的分页时,该步骤可能会变得昂贵。
作为一种搜索服务,Azure 搜索针对基于文本相关性的热门文档的快速检索进行了优化。不幸的是,对于客户只想 return 数据源中所有文档的列表的情况,它不是最好的工具。
根据我在您的 post 中的理解,有 2 个限制的原因
- 高跳过值
- QPS大幅提升
我们鼓励您同时控制两者。我们的客户实施自己的节流逻辑以防止他们自己的客户发出异常大量的请求的情况并不少见。即使没有跳过值,让单个客户发送足够多的查询以成倍增加流量也会导致节流(我不确定这里是否是这种情况)。没有关于如何处理来自客户端应用程序的查询的官方指南。在我看来,最好的方法可能是让您的团队 运行 使用实际工作负载进行性能测试,以尝试了解您的搜索服务的限制(这取决于索引模式、文档数量、发出的查询类型, ETC。)。一旦您很好地了解您的服务可以为您的场景处理多少 QPS,那么您可以决定您愿意一次将多少 QPS 分配给单个客户,并基于此实施限制。
关于深度分页成本:如果这是您的客户的常见场景(对搜索索引的所有文档进行分页),我建议您公开一种直接从数据源对所有文档进行分页的方法(假设Azure 搜索不是文档的主要数据存储),并且主要将 Azure 搜索用于相关性相关的检索场景。
我来自运行 nuget.org 的团队,这是 .NET 的包生态系统。我们使用 Azure 搜索来支持我们的搜索 API。我们的 API 是 public,因此第三方客户可以使用它们来分析我们的生态系统或制作应用程序。
我们最近遇到了一次中断,原因是单个客户使用 the $skip and $top query parameters 一次分批 200 个文档来翻阅我们的搜索文档。这导致 Azure 搜索限制:
Failed to execute request because the request rate has caused your service to exceed the limits of its provisioned capacity. Reduce the rate of requests, or adjust the number of replicas/partitions. See http://aka.ms/azure-search-throttling for more information.
Azure 搜索的限制影响了该地区的所有客户 10 分钟,而不仅仅是正在寻呼的单个客户。我们通读了 Azure Search's throttling documentation,但有以下问题:
- 具有高 $skip 值的客户寻呼对于 Azure 搜索来说是否特别昂贵?
- 我们可以做些什么来降低 Azure 搜索在分页场景中受到限制的可能性?
- 我们是否应该添加自己的限制以确保单个客户的搜索不会影响所有其他客户的搜索? Azure 搜索是否有这方面的指导?
关于我们服务的更多信息:
- 索引中的文档数:~950K
- 请求量:约 10 分钟内 1.3K 分页请求。峰值每秒 125 个请求,平均每秒 6 个请求
- 规模:标准SKU,1个分区,3个副本(这是我们的次要区域,因此规模较小以节省资金)
深度分页确实是一个代价高昂的操作。由于 Azure 搜索设计为分布式,所有索引都分为多个分片,以允许快速扩展操作。这样做的缺点是需要合并每个分片的排名结果并进行排名以创建最终的结果列表。要合并的结果数随 skip 值线性增加,因此当对结果进行非常深的分页时,该步骤可能会变得昂贵。
作为一种搜索服务,Azure 搜索针对基于文本相关性的热门文档的快速检索进行了优化。不幸的是,对于客户只想 return 数据源中所有文档的列表的情况,它不是最好的工具。
根据我在您的 post 中的理解,有 2 个限制的原因
- 高跳过值
- QPS大幅提升
我们鼓励您同时控制两者。我们的客户实施自己的节流逻辑以防止他们自己的客户发出异常大量的请求的情况并不少见。即使没有跳过值,让单个客户发送足够多的查询以成倍增加流量也会导致节流(我不确定这里是否是这种情况)。没有关于如何处理来自客户端应用程序的查询的官方指南。在我看来,最好的方法可能是让您的团队 运行 使用实际工作负载进行性能测试,以尝试了解您的搜索服务的限制(这取决于索引模式、文档数量、发出的查询类型, ETC。)。一旦您很好地了解您的服务可以为您的场景处理多少 QPS,那么您可以决定您愿意一次将多少 QPS 分配给单个客户,并基于此实施限制。
关于深度分页成本:如果这是您的客户的常见场景(对搜索索引的所有文档进行分页),我建议您公开一种直接从数据源对所有文档进行分页的方法(假设Azure 搜索不是文档的主要数据存储),并且主要将 Azure 搜索用于相关性相关的检索场景。