Распределение нагрузки по нескольким очередям, содержащим рабочие элементы, которые должны обрабатываться рабочими потоками, обращающимися к очередям - PullRequest
2 голосов
/ 02 апреля 2020

У меня есть требования к проекту, когда данные из разных источников должны обрабатываться несколькими потоками, но есть ограничение - поток, который обрабатывает данные из данного источника, всегда должен продолжать обрабатывать данные из этого источника.

Я использовал SingleThreadExecutor, который принимает Q, и использовал согласованный подход типа ha sh, когда источник ha sh% 10 сопоставлен с потоком, который обрабатывает данные.

Хэширование касается только здесь может быть неравномерным, и некоторые потоки могут быть загружены больше, чем другие. Есть ли лучшие способы или достижения этого? Кто-нибудь пробовал подобную проблему дизайна? Каковы некоторые из предложений, которые можно было бы использовать для равномерного распределения нагрузки данных по заданному набору очередей или потоков?

Заранее спасибо.

1 Ответ

0 голосов
/ 02 апреля 2020

Это online problem. Поскольку вы заранее не знаете, сколько потребуется обработки для каждого источника, вы не сможете добиться идеальной балансировки.

Я не уверен на 100%, что именно вы называете своим решением, поэтому мои следующие несколько строки могут быть дублированием того, что вы уже сказали:

В некоторой структуре данных я бы держал отображение источника / процесса, где я также сохранял бы количество текущих заданий, ожидающих этого процесса (от все источники).

Когда появляется новый источник, я назначаю его процессу, который имеет наименьшую нагрузку.

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

Надеюсь, что это делает смысл и полезно.

...