Проблема с высокой производительностью потоковой обработки данных - PullRequest
2 голосов
/ 17 июня 2011

У меня есть сокетное соединение, которое принимает потоковые данные. Каждый день количество сообщений составляет около 150 мил. После того как я получу сообщение, мне нужно обработать их. Так как номер сообщения довольно большой. Я многопоточность кода обработки сообщений. Прямо сейчас у меня 8 потоков, с 8 очередями сообщений. Процесс сокета поместит сообщение в эти очереди последовательно. Каждому процессу просто нужно обрабатывать сообщения в своей очереди.

Моя проблема сейчас в том, что моя очередь переполнена.

Должен ли я иметь больше очередей? Все потоки собираются писать в общий объект, используя синхронизированный метод. Будут ли другие очереди влиять друг на друга и ухудшать ситуацию?

Должен ли я иметь больший буфер? Это кажется безопасным, но я действительно хочу обрабатывать сообщения быстрее.

Должен ли я изменить свой дизайн? Есть ли хорошая рекомендация? Руководства для подражания?

Любые комментарии приветствуются.

Ответы [ 2 ]

3 голосов
/ 17 июня 2011

почему вы используете отдельные очереди?Обычный способ распределить работу - это иметь одну общую очередь, из которой все рабочие читают.в Java вы можете легко сделать это, используя общий BlockingQueue.таким образом, задания могут распределяться более равномерно (работник не будет вытягивать задания из очереди, если он занят).в вашей стратегии очередь медленного работника может в конечном итоге создать отставание.чтобы избежать переполнения очереди, вы можете установить в нее максимальный размер, и тогда производитель сделает паузу, когда ваше отставание станет слишком большим.

вы упоминаете, что хотите, чтобы все происходило быстрее.Хотя приведенные выше рекомендации могут помочь, а могут и не помочь, единственный способ действительно решить проблему - запустить систему под профилировщиком и посмотреть, где находится узкое место (часто это не то, что вы думаете),в противном случае вы можете потратить много времени на оптимизацию кода, который не поможет.Есть много хороших бесплатных профилировщиков для java (netbeans, jvisualvm, eclipse) и c ++ (valgrind).отличным несвободным для java является yourkit java profiler.

0 голосов
/ 17 июня 2011

Пишет ли каждый поток обработки в общий объект после того, как обработал только одно сообщение? Это может создать узкое место. Попробуйте накопить некоторые временные результаты в каждом потоке перед записью в общий объект.

...