Я разрабатываю автономное приложение Java, которое собирает данные из примерно 1000 измерительных устройств по сети и сохраняет данные в базе данных. Сбор данных может занять пару минут на каждое устройство из-за медленного выхода устройства и/или скорости сети. Сбор данных должен происходить в определенном временном окне, поэтому мне нужно работать параллельно.Java параллелизм/сетевой подход
Моим подходом было бы создать один поток на измерительное устройство, поместить данные в очередь и иметь один или несколько других потоков на другом конце преобразования очереди и сохранять данные.
Это жизнеспособный подход? Будет ли современная машина иметь возможность обрабатывать многие потоки и сетевые соединения? Насколько это масштабируемо, в какой момент мне нужно будет работать на нескольких машинах?
Я также был бы признателен, если бы вы могли дать мне указания относительно классов concurreny, которые вы рекомендовали бы (например, какая очередь, ThreadPoolExecutor и т. Д. - i havent используется java.util.concurrent еще, книга по почте) ,
Есть ли лучшие подходы?
UPDATE:
Спасибо за ответы до сих пор, здесь больше информации, запрошенной некоторые из вас.
Данные, получаемые с устройств, представлены в виде файлов размером менее 1 КБ. Возможно, что я получаю что-то вроде 25.000 файлов во время одной передачи, хотя обычно это намного меньше.
Преобразование данных не имеет большого значения cpu, в основном анализирует файл и преобразует его в типы данных java (файл содержит c-типы данных, такие как unsigned char и unix timestamps), плюс расчет CRC. Я создаю объект, содержащий содержимое одного файла, который я сохраняю в datbase, используя JPA (я думаю, я мог бы использовать простой JDBC для этого случая). В файлах измерений нет порядка, так как они содержат устройство s/n и временную метку.
В более поздний момент времени мне нужно будет добавить какое-то предупреждение, когда будут выполнены определенные критерии, но опять же это не должно быть интенсивным.
Из ответов до сих пор я собираю сетевые подключения и количество потоков не должно быть проблемой.
Единственное, о чем я забыл, - это подход к очереди. Альтернативой было бы позволить потокам сбора данных также вызвать метод DAO для сохранения файла. Наверное, я должен сделать DAO потокобезопасными в любом случае, но я думаю, что несколько потоков могут выполнить эту работу, так как основная часть времени будет потрачена на передачу сетевых данных.
Также я рассмотрю асинхронный ввод-вывод и некоторые фреймворки, которые его предоставляют.
Еще раз спасибо, я выберу ответ чуть позже, может быть, я буду получать больше некоторый вклад :)
«положить данные в очереди» - какие данные вы собираетесь поместить в эту очередь.? –