Java 当客户端代码在多台机器上运行时,如何确保服务调用的上限?
假设我有一个带API getName(字符串id)的restful服务X。我的代码部署到负载平衡器后面的5台机器上。相同的客户端代码在这些机器上运行,并在某处为getName(String)api调用服务X。该服务限制每秒最多处理3个呼叫。假设请求的周转时间是200毫秒,我如何确保我的客户端不超过服务器的3 TPS限制?我没有让我的客户相互沟通的机制。如何避免服务器端的节流。如果我将车队规模从5个增加到10或15个呢?有什么我能做的吗Java 当客户端代码在多台机器上运行时,如何确保服务调用的上限?,java,rest,service,distributed-computing,throttling,Java,Rest,Service,Distributed Computing,Throttling,假设我有一个带API getName(字符串id)的restful服务X。我的代码部署到负载平衡器后面的5台机器上。相同的客户端代码在这些机器上运行,并在某处为getName(String)api调用服务X。该服务限制每秒最多处理3个呼叫。假设请求的周转时间是200毫秒,我如何确保我的客户端不超过服务器的3 TPS限制?我没有让我的客户相互沟通的机制。如何避免服务器端的节流。如果我将车队规模从5个增加到10或15个呢?有什么我能做的吗 是否需要截断指数退避对我有效?您只需保存会话中最后3个请求的
是否需要截断指数退避对我有效?您只需保存会话中最后3个请求的请求到达时间。然后检查第四个请求是否在该1秒窗口内 假设t0是此时间线中的第四个请求(时间单位为毫秒) …--t3--t2--t1--t0----
如果您想在负载平衡器中进行节流:一种解决方案是使用所有API实例通用的一些API/存储。您只需保存会话中最后3个请求的请求到达时间。然后检查第四个请求是否在该1秒窗口内 假设t0是此时间线中的第四个请求(时间单位为毫秒) …--t3--t2--t1--t0----
如果您想在负载平衡器上进行节流:一种解决方案是使用所有API实例所共有的一些API/存储。指数退避实际上适用于客户端试图访问您的服务的情况……并且为了防止频繁重试压倒您的服务……在您的情况下,您需要禁止每次调用超过个第二完全正确…每秒不接受任何ip的呼叫超过3次??我负责客户端。我的问题是如何确保我每秒拨打的电话不超过3个,你为什么要回复呢?哈哈,我不知道如何确保,这就是我要问的,如果你每秒拨打的电话超过3个会发生什么?您是否收到识别问题的错误,是否可以稍后重试该请求?失败的请求是否计入每秒3次调用?是,请求在服务器端被抛出/丢弃,而我作为客户机会收到一个异常。目前,在我的客户端,我有一个简单的try-catch,在catch中,我使用指数退避策略再次重试呼叫。不确定这是否是唯一/正确的方法。如果客户正在尝试访问您的服务,则说明性回退适用于这种情况……并且为了防止频繁的重试压倒您的服务……在您的情况下,您需要禁止每秒超过3个呼叫完全正确……不允许每秒从任何ip接听超过3个呼叫??我会小心的客户端的。我的问题是如何确保我每秒拨打的电话不超过3个,你为什么要回复呢?哈哈,我不知道如何确保,这就是我要问的,如果你每秒拨打的电话超过3个会发生什么?您是否收到识别问题的错误,是否可以稍后重试该请求?失败的请求是否计入每秒3次调用?是,请求在服务器端被抛出/丢弃,而我作为客户机会收到一个异常。目前,在我的客户端,我有一个简单的try-catch,在catch中,我使用指数退避策略再次重试呼叫。不确定这是否是唯一/正确的方法
if ((t0 - 1000) > t3) {
//4th req within 1 sec, so process the request
} else {
//return HTTP status code 502(service temporarily overloaded)
}