Concurrencia de Java / enfoque de red

Estoy desarrollando una aplicación Java independiente que recopila datos de alrededor de 1000 dispositivos de medición a través de la red y los mantiene en una base de datos. La recopilación de datos puede tomar un par de minutos por dispositivo debido a la salida lenta del dispositivo y / o la velocidad de la red. La recopilación de datos debe tener lugar en un período de tiempo determinado, por lo que debo trabajar en paralelo.

Mi enfoque sería crear un subproceso por dispositivo de medición, poner los datos en una cola y tener uno o más subprocesos en el otro extremo de la cola transformar y persistir los datos.

¿Es este un enfoque viable? ¿Una máquina moderna podrá manejar tantos hilos y conexiones de red? ¿Cuán escalable es esto? ¿En qué punto necesitaría trabajar en varias máquinas?

También le agradecería que me diera sugerencias con respecto a las clases concurrentes que recomendaría (es decir, qué tipo de cola, ThreadPoolExecutor, etc. - todavía no he usado java.util.concurrent, el libro está en el correo).

¿Hay mejores enfoques?

ACTUALIZAR:

Gracias por las respuestas hasta ahora, aquí hay más información solicitada por algunos de ustedes.

Los datos que recibo de los dispositivos están en forma de archivos de menos de 1 kb. Es posible que obtenga algo así como 25,000 archivos durante una transferencia, aunque generalmente es mucho menos.

La transformación de datos no requiere mucha CPU, básicamente analiza el archivo y lo convierte a tipos de datos java (el archivo contiene tipos de datos c como marcas de tiempo sin signo char y unix), más un cálculo CRC. Creo un objeto que contiene el contenido de un archivo que persisto en la base de datos usando JPA (supongo que también podría usar JDBC simple para este caso). No hay orden en los archivos de medidas, ya que contienen el dispositivo s / ny una marca de tiempo.

En un momento posterior, tendré que agregar algún tipo de alerta cuando se cumplan ciertos criterios, pero nuevamente esto no debería ser intensivo en CPU.

De las respuestas hasta ahora, deduzco las conexiones de red y el número de hilos no debería ser un problema.

Lo único que me pregunto es sobre el enfoque con la cola. Una alternativa sería dejar que los hilos de recolección de datos también llamen al método DAO para conservar el archivo. Supongo que de todos modos tengo que hacer que los DAO sean seguros para subprocesos, pero creo que algunos subprocesos también podrían hacer el trabajo, ya que la mayor parte del tiempo se pasará transfiriendo datos de red.

También analizaré las E / S asíncronas y algunos marcos que lo proporcionan.

Gracias de nuevo, elegiré una respuesta un poco más tarde, tal vez obtenga más información :)

Respuesta 1

Con la configuración predeterminada, terminará usando alrededor de 1 Gb de memoria para las pilas de subprocesos, dado que está ejecutando en Linux de 64 bits, Oracle jdk (el tamaño de subproceso predeterminado es 1Mb en dicha plataforma). Creo que para OpenJDK es lo mismo. Sin contar los buffers asignados por el sistema operativo. . .

Si esto es demasiado para sus requisitos, puede visitar http://netty.io . Este marco utiliza java nio debajo del capó (se puede configurar para usar bio, por cierto). De esta manera, solo necesitaría un puñado de subprocesos para realizar el io real (realizar operaciones de lectura / escritura en una conexión tcp determinada). Su lógica de negocio (actualizar db, calcular algunas mediciones) debería descargarse en un conjunto de subprocesos separado. Netty también incluye soporte para esto.

Si desea utilizar 1 subproceso por conexión (¿por dispositivo de medición?), Entonces probablemente no tenga ningún beneficio tener otro grupo de subprocesos que realicen el trabajo comercial real. Asumo un hilo por dispositivo, porque usted dijo que el dispositivo puede ser lento y / o la red puede ser lenta. Ambos cuellos de botella (red y dispositivo) no se eliminarán si está utilizando múltiples hilos (uno puede esperar lo contrario).

Clases de concurrencia en general: java.util.concurrent. * Sí, ambos pulgares arriba

Respuesta: 2

Para un sistema operativo y hardware modernos, manejar más de 1000 hilos de cambio y conexión de red no debería ser un problema. La verdadera pregunta es cuántos datos está recopilando y cuán complejas son las transformaciones; eso probablemente determinará cuánto puede manejar una máquina.

Respuesta: 3

Quiero tener una clase de búsqueda con varias opciones diferentes, mi clase de búsqueda debería poder filtrar los resultados de diferentes maneras, tales como: getX () getY () getZ () getK () por encima de X, Y, Z, K son mi ...

Tengo un edificio de aplicaciones web de módulos múltiples con maven. Construimos la guerra como de costumbre y la implementamos y ejecutamos en máquinas de desarrollo y servidores de prueba locales utilizando Tomcat. Entonces queremos implementar la aplicación ...

Tengo un servicio CRUD basado en Java que permite la creación, recuperación, actualización y eliminación de archivos en / desde el sistema de archivos. Este servicio se puede implementar en un entorno en clúster. ¿Hay algún diseño ...

estoy usando el código en la documentación del MediaPlayer; String url = "http: // ........"; // su URL aquí MediaPlayer mediaPlayer = new MediaPlayer (); mediaPlayer.setAudioStreamType (AudioManager ....