java - 高性能流数据处理问题

标签 java c++ multithreading stream parallel-processing

我有一个接收流数据的套接字连接。每天的消息数量约为 1.5 亿条。收到消息后,我需要处理它们。由于消息数量相当大。我正在对消息处理代码进行多线程处理。现在我有 8 个线程,有 8 个消息队列。套接字进程会将消息依次放入这些队列中。每个进程只需要处理自己队列中的消息。

我现在的问题是我的队列溢出。

我应该多排队吗? 所有线程都将使用同步方法写入共享对象。更多的队列会互相影响并使事情变得更糟吗?

我应该有更大的缓冲区吗? 这些似乎是安全的,但我真的想更快地处理消息。

我应该改变我的设计吗? 有什么好的推荐吗?要遵循的指南?

欢迎任何意见。

最佳答案

为什么要使用单独的队列?分配工作的常用方法是拥有 1 个共享队列,所有工作人员都从中读取数据。在java中你可以使用共享的BlockingQueue轻松地做到这一点。这样,作业可以更均匀地分配(如果工作线程繁忙,则不会将作业从队列中拉出)。在您的策略中,缓慢的工作人员队列最终可能会导致积压。为了防止队列溢出,您可以在队列上设置最大大小,然后当您的积压太大时,生产者将暂停。

你提到你希望整个事情进展得更快。虽然上述建议可能有帮助,也可能没有帮助,但真正解决问题的唯一方法是在分析器下运行系统并查看瓶颈在哪里(很多时候,它并不是您想象的那样) )。否则,您可能会花费大量时间来优化代码,但最终却无济于事。有很多适用于 java(netbeans、jvisualvm、eclipse)和 c++(valgrind)的优秀免费分析器。 yourkit java profiler 是一款很棒的非免费 Java 分析器。

关于java - 高性能流数据处理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6385029/

相关文章:

c++ - shared_timed_mutex 在 OS X 10.11.2 上不可用?

c++ - 为什么没有数据竞赛?

c# - 异步运行两个任务

java - 如果线程 B 希望看到线程 A 所做的更改,是否只能将最后的更改更改为 volatile 变量而不是全部?

java - 迭代 Team Drive 文件 Google Drive API JAVA

java - 我在开展运营时遇到问题

java - Spring + hibernate +Maven : jCannot create JDBC driver of class 'com.mysql.jdbc.Driver' for connect URL 'jdbc:mysql//localhost:3306/test'

java - Groovy 2.5.0 为方法调用转换提供 noclassdefounderror

c++ - 测试输入缓冲区溢出

c++ - Boost.Regex 解析