Mantener conexiones con muchos dispositivos en tiempo real

Estoy escribiendo un programa en Linux para controlar alrededor de 1000 monitores de pacientes al mismo tiempo a través de conectores UDP. He escrito con éxito una biblioteca para analizar y enviar mensajes para recopilar los datos de un solo dispositivo de monitor de paciente. Existen varias restricciones de programación en el dispositivo, que se enumeran a continuación:

  • Cada dispositivo debe recibir constantemente una solicitud activa del cliente de la computadora dentro de un período de tiempo máximo de 300 milisegundos (puede diferir para diferentes dispositivos), de lo contrario, se pierde la conexión.
  • El cliente de la computadora debe enviar una solicitud de sondeo a un dispositivo para obtener los datos dentro de un período de tiempo. Estoy encuestando durante aproximadamente 5 segundos de datos promediados del monitor del paciente, por lo tanto, debo enviar una solicitud de encuesta cada 5 * 3 = 15 segundos. Si no puedo enviar la solicitud en un plazo de 15 segundos, pierdo la conexión del dispositivo.

Ahora, estoy tratando de extender mi programa actual para que sea capaz de manejar más de 1000 dispositivos al mismo tiempo. En este momento, mi programa puede manejar y analizar de manera eficiente la respuesta desde un solo dispositivo. En caso de manejar múltiples dispositivos, es necesario sincronizar múltiples respuestas de diferentes dispositivos y serializarlas y transmitirlas a través del socket TCP, para que las computadoras remotas también puedan analizar los datos. Bueno, eso no es un problema porque es un problema bien conocido de múltiples productores y un solo consumidor. Mi principal preocupación es qué enfoque debo usar para mantener más de 1000 dispositivos con conexión activa.

Después de leer en Internet y buscar preguntas similares en este sitio web, estoy considerando principalmente dos opciones:

  • Utilice un subproceso por dispositivo. Para controlar más de 1000 dispositivos, terminaría creando más de 1000 subprocesos, lo que no me parece factible.
  • Utilice el enfoque de multiplexación, seleccionando FD que requiera atención y trátelos uno a la vez. No estoy seguro de cómo lo haría y si el enfoque de multiplexación podría mantener una conexión viva con todos los dispositivos considerando las dos constantes anteriores.

Necesito algunas sugerencias y consejos sobre cómo lidiar con esta situación en la que necesita controlar más de 1000 dispositivos en tiempo real a través de sockets UDP. Cada dispositivo requiere una señal activa cada 300 milisegundos (diferente para diferentes dispositivos) y requieren una solicitud de sondeo en aproximadamente 3 veces el intervalo de tiempo mencionado durante la fase de asociación. Por ejemplo, los monitores de pacientes en la UCI pueden requerir datos en tiempo real (promedio de 1 segundo) mientras que los monitores de pacientes en salas generales pueden requerir datos promediados de 10 segundos, por lo tanto, el período de sondeo para dos dispositivos sería 3*1 (3 segundos) y 3*10 (30 segundos) respectivamente.

Gracias Shivam Kalra

preguntado el 23 de mayo de 12 a las 07:05

No estoy seguro si Windows tiene algo mejor o más efectivo que select/poll pero debería haberlo hecho. En Linux puedes usar, por ejemplo epoll, y los sistemas BSD tienen métodos similares. -

@User-104: puede ayudarme en esta pregunta. Creo que se resolvió en función de esta pregunta: tinyurl.com/jnoekwf -

1 Respuestas

en su mayor parte, cualquiera de los enfoques es al menos funcionalmente capaz de manejar la funcionalidad que describe, pero por lo que parece, el rendimiento será un problema crucial. Según las cifras que ha proporcionado, parece que la aplicación podría ser CPU-buond.

Un enfoque de subprocesos múltiples tiene la ventaja de utilizar todos los núcleos de CPU disponibles en la máquina, pero los programas de subprocesos múltiples son conocidos por ser difíciles de hacer confiables y robustos.

También podría usar el antiguo modelo de trabajador bifurcado probado y verdadero de Apache: cree, digamos, un proceso separado para manejar un máximo de 100 dispositivos. Entonces podría necesitar escribir código para administrar el mapeo de conexiones a procesos.

También puede utilizar varios anfitriones y algún mecanismo para distribuir dispositivos entre ellos. Esto tendría la ventaja de facilitar el manejo de las situaciones de recuperación. Parece que su aplicación podría ser de misión crítica, y es posible que deba diseñarse de manera que si una pieza de hardware se rompe, otro hardware se haga cargo automáticamente.

contestado el 23 de mayo de 12 a las 07:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.