在一款高度可扩展的产品中,我使用 ScheduledThreadPoolExecutor 发送延迟事件,每条传入消息都有一个延迟事件。延迟大约1秒。 在非常高的 CPU 负载下,调度程序以非常低的速率发送事件。尽管每秒应该发送数百个事件,但它几乎只发送 10 个,有时 1 或 2 个。
这是配置
private final ScheduledThreadPoolExecutor deliveryReceiptExecutorService =
new ScheduledThreadPoolExecutor(50, threadFactory);
我的猜测是 CPU 太忙,以至于处理计划事件的线程没有机会运行。
问题:有人可以推荐一种更好的方法来保证传入事件和传出延迟事件之间至少有一定的平衡吗?根据调度程序类的日志,运行该进程一小时后,completedTaskCount 等于 300k,taskCount 等于 3M,增加了 10 倍。
如果您的 CPU 所有核心都以几乎 100% 的速度运行,并且工作没有完成,则您的计算机负担过重。要么减少工作量,要么购买具有更多内核的更强大的机器。确保您有足够的 RAM,并且不会出现抖动。
鉴于您只想在每个任务开始时延迟一秒,因此您实际上并不需要
ScheduledExecutorService
。只需在任务中的第一行代码中休眠一秒钟即可。然后使用虚拟线程来运行您的任务,以获得更好的整体性能。