gpt4 book ai didi

azure - 在 Azure API Manager 中仅允许单个后端调用

转载 作者:行者123 更新时间:2023-12-03 02:58:41 25 4
gpt4 key购买 nike

我们有一个旧的 Web 服务,它通过 API 返回一些数据。该服务非常慢,并且不应同时通过 API 执行大量问题。现在,公司的另一个部门已经开发了一个新的 Azure Web 应用程序。他们正在调用这个缓慢的 API,并且没有意识到它有多糟糕,直到我们召开了一次 session 讨论数据库服务器几乎崩溃的原因。该 API 有时需要 4-8 秒的响应时间,如果被大量消费者调用 50 次,这并不是最佳选择。

我在旧 API 和新 Azure Web 应用之间添加了 Azure API Manager。我的希望是能够限制对后端的调用,然后使用缓存来减少调用次数。然而,这个新服务需要“快速数据”,并且希望至少每 10 秒调用一次后端。我希望避免让 Azure API Manager 调用后端的次数超过所需的次数,这意味着 - 相同的问题 = 缓存 10 秒,然后从后端获取,新参数 = 从后端获取,然后缓存 10 秒。

缓存可以工作,但每隔 10 秒我就会通过 Azure API 管理器进行大量“同时”调用,这使得旧 API 的生活变得困难。

是否可以只允许对 API 进行一次调用(每个授权和参数),然后缓存结果?这意味着,如果 5 个用户同时向 API 管理器询问相同的问题,第一个用户会发送到后端,返回缓存的响应,而其余 4 个用户会排队等待缓存的副本完成?我宁愿在重试循环中几秒钟,也不愿返回一个太大的调用错误。

例如。

  1. 5 位用户调用该服务。
  2. 第一个调用将转到后端 API,其他 4 个调用将被放入等待队列中。
  3. 当第一次调用的结果返回时,它就会被缓存。
  4. 其他 4 个调用现在可以获取缓存的副本并将其返回。

我尝试了一些不同的规则变体,例如在重试中尝试限制并发,但所有结果都会导致对后端的多次调用,直到第一个返回并被缓存。

<policies>
<inbound>
<base />
<cache-lookup vary-by-developer="false" vary-by-developer-groups="false" allow-private-response-caching="true" downstream-caching-type="none">
<vary-by-header>Accept</vary-by-header>
<vary-by-header>Accept-Charset</vary-by-header>
<vary-by-header>Authorization</vary-by-header>
</cache-lookup>
<retry condition="true" count="8" interval="1" first-fast-retry="false">
</retry>
</inbound>
<backend>
<limit-concurrency key="backend-server" max-count="1">
<forward-request timeout="60" />
</limit-concurrency>
</backend>
...
</policies>

最佳答案

目前限制并发仅在节点级别有效。因此,仅当您有 Dev APIM 实例时,才允许对后端进行一次调用。对于 Basic、Std 或 Prem,您至少有两个节点(1 个单元 = 2 个节点),因此此类配置最多允许在负载下进行两个并行调用。

现在,如果您在节点级别内部指定 max-count=X,我们将限制设置为 X/node_count。当然我们不能将其设置为0,所以1是最小值。因此,调用次数始终至少为 node_count 次。

我们将来会更新此策略以支持跨节点同步。

关于azure - 在 Azure API Manager 中仅允许单个后端调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51052053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com