Java 从背景线程更均匀地分布负载
我有一个背景线程,每5分钟运行一次。我正在为此使用Java 从背景线程更均匀地分布负载,java,multithreading,scheduledexecutorservice,Java,Multithreading,Scheduledexecutorservice,我有一个背景线程,每5分钟运行一次。我正在为此使用ScheduledExecutorService。每五分钟,我就给我的一个服务打一个电话,并解析该服务返回的响应 public class ThreadScheduler { private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); public void startScheduleTask() {
ScheduledExecutorService
。每五分钟,我就给我的一个服务打一个电话,并解析该服务返回的响应
public class ThreadScheduler {
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
public void startScheduleTask() {
scheduler.scheduleAtFixedRate(new Runnable() {
public void run() {
try {
callService();
} catch (Exception ex) {
// log error
}
}
}, 0, 5L, TimeUnit.MINUTES);
}
public void callService() throws Exception {
// execute the service and parse the response
}
}
现在上面的代码在1000台机器上运行,它们都是同时启动的,这意味着它将每5分钟同时对我的服务进行所有1000次调用。我正试图在5分钟的时间内更均匀地分散负载。使用上述代码有可能做到这一点吗
我只是想在5分钟的时间内将负载更均匀地分布在我的服务上,这样它就不会同时影响我的服务,一旦所有系统同时启动,这将增加负载
我想出了以下代码,试图在五分钟的时间内更均匀地分配负载:
public class ThreadScheduler {
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
public void startScheduleTask() {
scheduler.scheduleAtFixedRate(new Runnable() {
public void run() {
try {
callService();
} catch (Exception ex) {
// log error
}
}
}, (int)(Math.random()*5*60), 5*60L, TimeUnit.SECONDS);
}
public void callService() throws Exception {
// execute the service and parse the response
}
}
这是否是在5分钟内均匀分配负荷的正确方法。这会有所帮助,但在第一次变化后,日程安排仍然是固定的。另一种更分散负载的方法是在每次执行中使用并放置一个短的、随机的暂停(例如,
Thread.sleep(Math.random()*5000L)
就在callService()
之前)。随着时间的推移,这将导致更多的变化
此外,为了测试可变性,您可以创建一个简单的测试程序来打印当前时间(以毫秒为单位),而不是调用实际的服务。使用不同的算法运行测试程序一小时,并将结果绘制成图表。选择能为您提供最佳传播效果的版本。谢谢您的建议。你能给我举一个“固定延迟时间表”的例子让我更好地理解吗?我不确定我是否理解正确。