Java:如何构建可扩展的Job处理机制

标签 java multithreading performance concurrency

我需要构建一个作业处理模块,其中作业的传入率约为数百万量级。我有一台多处理器机器来运行这些作业。在我当前的解决方案中 Java ,我用Java的ThreadPoolExecutor框架来创建作业队列、LinkedListBlockingQueue,并且线程数等于系统上的可用处理器。此设计无法维持传入速率,因为作业队列不断增长,并且在几秒钟内它会报告溢出,即使 CPU 利用率未达到最大。 CPU 利用率保持在 30-40% 的范围内。

这意味着大部分时间都在线程争用中消失,而其他 CPU 仍然空闲。有没有更好的方法来处理作业,以便更好地利用 CPU,从而作业队列不会溢出?

最佳答案

我建议你看看Disruptor第一的。这提供了内存环形缓冲区的高性能。如果消费者跟不上生产者的速度,那么这种方法效果最好。

如果您需要持久或无界队列,我建议使用 Chronicle (我写的)这样做的优点是生产者不会因生产者而减慢速度(并且队列完全脱离堆)

这两者都旨在每秒处理数百万条消息。

关于Java:如何构建可扩展的Job处理机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21728406/

相关文章:

Java 线程 - 按顺序调用线程

c# - 我可以加快我的特殊回合功能吗?

algorithm - 以不寻常但有效的方式做某事

java - 处理:获取PGraphics对象的位置

Java词库

java - 修改 SwingUtilities 中的 ClipString 行为

c# - 线程如何节省时间?

multithreading - 在 F# 中关闭多线程或限制核心使用?

java - 使用 Thymeleaf 从 Spring Boot 中的 Jar/war 文件访问 HTML/JavaScript 文件

C# 寻找一种线程安全且有效的方法来捕获跨多个命名空间的耗时