关于高性能流数据处理的问题
Posted
技术标签:
【中文标题】关于高性能流数据处理的问题【英文标题】:Problem about high performance streaming data process 【发布时间】:2011-06-17 11:23:33 【问题描述】:我有一个接收流数据的套接字连接。每天的消息数约为 1.5 亿条。收到消息后,我需要处理它们。由于消息数量很大。我正在对消息处理代码进行多线程处理。现在我有 8 个线程,有 8 个消息队列。套接字进程会将消息按顺序放入这些队列中。每个进程只需要处理自己队列中的消息。
我现在的问题是我的队列已满。
我应该有更多的队列吗? 所有线程都将使用同步方法写入共享对象。更多的队列是否会相互影响并使事情变得更糟?
我应该有更大的缓冲区吗? 这些似乎是安全的,但我真的想更快地处理消息。
我应该改变我的设计吗? 有什么好的推荐吗?要遵循的指南?
欢迎任何cmets。
【问题讨论】:
知道该做什么的关键是找出时间花在哪里:调度消息、处理消息和写入共享对象的同步方法。只有在大部分时间都花在处理消息上时,更多线程才会起作用。你能做一些分析吗? 我会考虑有多个消费者的单个队列。消费者将是一个线程,然后您将调整线程数以有效地使用。我看不到多队列,循环给你什么...... 【参考方案1】:为什么要使用单独的队列?分配工作的常用方法是拥有 1 个共享队列,所有工作人员都从中读取。在 java 中,您可以使用共享的 BlockingQueue 轻松完成此操作。这样,可以更均匀地分配作业(如果工作人员忙,则不会将作业从队列中拉出)。在您的策略中,缓慢的工作人员队列最终可能会积压。为了防止队列溢出,你可以在队列上设置一个最大大小,然后当你的积压太多时生产者会暂停。
你提到你希望整个事情进展得更快。虽然上述建议可能会或可能不会有帮助,但真正解决问题的唯一方法是在分析器下运行系统并查看瓶颈在哪里(很多时候,这不是您认为的那样)。否则,您可能会花费大量时间优化最终无济于事的代码。 java(netbeans、jvisualvm、eclipse)和c++(valgrind)有很多不错的免费分析器。对于 java 来说,一个很棒的非免费工具是 yourkit java profiler。
【讨论】:
【参考方案2】:是否每个处理线程在处理完一条消息后都会写入共享对象?这可能会造成瓶颈。在写入共享对象之前,尝试在每个线程中累积一些临时结果。
【讨论】:
以上是关于关于高性能流数据处理的问题的主要内容,如果未能解决你的问题,请参考以下文章