关于高性能流式数据处理的问题



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

我现在的问题是我的队伍已经满员了。

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

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

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

欢迎任何意见。

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

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

是否每个处理线程只处理了一条消息就写入共享对象?这可能会造成一个瓶颈。在写入共享对象之前,请尝试在每个线程中累积一些临时结果。

最新更新