【问题标题】:How to ensure an upper limit of service calls when client code runs on a number of machines?当客户端代码在多台机器上运行时,如何保证服务调用的上限?
【发布时间】:2017-05-15 19:34:29
【问题描述】:

假设我有一个带有 API getName(String id) 的宁静服务 X。我的代码部署到负载均衡器后面的 5 台机器上。相同的客户端代码在这些机器上运行,并且在某处它为 getName(String) api 调用服务 X。该服务设置了一个限制,即每秒最多处理 3 个调用。假设一个请求的周转时间是 200 毫秒,我如何确保我的客户端不超过服务器的 3 TPS 限制?我没有让我的客户相互交流的机制。如何避免服务器端的节流。如果我将机队规模从 5 个增加到 10 个或 15 个怎么办?有什么我可以做的吗?

截断指数退避对我有用吗?

【问题讨论】:

  • 指数退避确实适用于客户端重新尝试访问您的服务的情况......并防止频繁重试压倒您的服务......在您的情况下,您需要禁止更多比每秒调用数完全正确....每秒从任何 IP 接收的调用数不超过 3 次??
  • 我负责客户端。我将如何确保我每秒拨打的电话不超过 3 次是我的问题,你为什么要问它,哈哈。我不知道如何确保,这就是我要问的
  • 如果您每秒拨打超过 3 个电话会发生什么?您是否收到标识问题的错误,您可以稍后重试请求吗?失败的请求是否计入每秒 3 次调用?
  • 是请求在服务器端被限制/丢弃,我作为客户端得到一个异常。目前在我的客户端我有一个简单的try-catch,在catch中我使用指数退避策略再次重试调用。不确定这是否是唯一/正确的方法

标签: java rest service distributed-computing throttling


【解决方案1】:

您只需保存会话中最后 3 个请求的请求到达时间。然后检查第 4 个请求是否在 1 秒窗口内。

假设 t0 是此时间线中的第 4 个请求(时间以毫秒为单位),

...--t3-----t2-----t1----t0----

if ((t0 - 1000) > t3) {
    //4th req within 1 sec, so process the request
} else {
    //return HTTP status code 502(service temporarily overloaded)
}

如果您想限制负载均衡器:一种解决方案是使用所有 API 实例通用的一些 API/存储。

【讨论】:

    猜你喜欢
    • 2020-03-31
    • 2021-07-31
    • 2013-07-16
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多