【发布时间】:2010-07-29 22:11:55
【问题描述】:
我最初问过这个问题here,但我意识到我的问题不是关于 while-true 循环。我想知道的是,在 Java 中进行高性能异步消息传递的正确方法是什么?
我要做什么......
我有大约 10,000 个消费者,每个消费者都从他们的私有队列中消费消息。我有一个线程一一生成消息并将它们放入正确的消费者队列中。每个消费者无限循环,检查消息是否出现在其队列中并处理它。
我相信这个术语是“单一生产者/单一消费者”,因为有一个生产者,每个消费者只在他们的私有队列上工作(多个消费者从不从同一个队列中读取)。
Consumer.java 内部:
@Override
public void run() {
while (true) {
Message msg = messageQueue.poll();
if (msg != null) {
... // do something with the message
}
}
}
生产者正在快速将消息放入消费者消息队列中(每秒数百万条消息)。消费者应该尽快处理这些消息!
注意:while (true) { ... } 被 Producer 作为其最后一条消息发送的 KILL 消息终止。
但是,我的问题是关于设计此消息传递的正确方法。我应该为 messageQueue 使用哪种队列?它应该是同步的还是异步的? Message应该如何设计?我应该使用 while-true 循环吗?消费者应该是一个线程还是其他什么? 10,000 个线程会慢到爬行吗?线程的替代方法是什么?
那么,在 Java 中进行高性能消息传递的正确方法是什么?
【问题讨论】:
-
为什么你有 10k 个线程?线程切换会有很多开销,除非您有非常多的内核或任务,每个线程都需要大量等待。
-
10k线程离高性能还很远
-
@Mike:有 10,000 个不同的符号,每个消费者处理一个符号的消息。我不知道它是否应该被实现为线程,但是消费者之间不共享任何东西,并且是演员模型的一个很好的候选者。 -
@Willi Schönborn:我的问题是,如果不是线程,那是什么?我想在没有库/框架的情况下做到这一点;比如,什么是合适的设计? -
要知道什么是合适的设计,我们必须知道你在做什么。消息来自哪里?它们代表什么,等等。
标签: java asynchronous producer-consumer message-passing