有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

我现在的问题是我的队列已满

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

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

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

欢迎提出任何意见


共 (2) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

    为什么要使用单独的队列?分配工作的通常方法是使用一个共享队列,所有工作人员都从中读取数据。在java中,您可以使用共享BlockingQueue轻松地完成这项工作。通过这种方式,作业可以更均匀地分布(如果工作人员很忙,就不会从队列中拉出作业)。在你的策略中,一个缓慢的工人队列可能最终会积压工作。为了防止队列溢出,您可以在队列上设置一个最大大小,然后当您的待办事项太多时,制作人将暂停

    你说你想让整个过程进行得更快。虽然上述建议可能有帮助,也可能没有帮助,但真正解决问题的唯一方法是在探查器下运行系统,看看瓶颈在哪里(很多时候,它不是你认为的那样)。否则,您可能会花费大量时间优化最终没有帮助的代码。java有很多免费的剖析器(NETBeaS,JVisualVM,Eclipse)和C++(ValGRIN)。yourkit java profiler是一款非常适合java的非免费软件