Estamos armando un sistema que lee ~ 32 señales de voltaje a través de una tarjeta convertidora de analógico a digital, hace un procesamiento preliminar en ellas, y pasa los resultados (aún separados en 32 canales) a la red como paquetes UDP, donde son recogidos por otra computadora y diversamente (a) se muestran, (b) se procesan más, (c) buscan criterios para cambiar el estado del sistema de adquisición, o (d) alguna combinación de AC. Simultáneamente, se está ejecutando un proceso GUI en la computadora que realiza estos últimos procesos (la computadora vis), que cambia el estado tanto en la computadora generadora de datos como en los procesos múltiples de la computadora vis, a través de mensajes de comando empaquetados por UDP.topología de red sugerida para esta aplicación de transmisión de datos/comando más bien pequeña?
Soy nuevo en la programación de redes y estoy luchando para elegir una topología de red. ¿Hay alguna heurística (o capítulos de libros, documentos) sobre la topología de red para aplicaciones relativamente pequeñas que la necesidad de pasar datos, comandos y acuses de recibo de forma flexible?
detalles del sistema:
adquisición de datos sin procesar que ocurre en una sola máquina Linux. Simplemente procesar los datos, guardarlos en el disco y enviarlos a la red utiliza aproximadamente el 25% de la capacidad de la CPU y una pequeña cantidad de memoria. Menos de 0.5 Mb/seg de datos van a la red. Todo el código para la generación de datos está en C++.
Otra máquina Linux ejecuta varios procesos de visualización/procesamiento/GUI. La GUI controla tanto la máquina de adquisición como los procesos en la computadora vis/processing/GUI misma. Este código se encuentra principalmente en C++, con un par de pequeñas utilidades en Python.
Vamos a escribir otras aplicaciones que deseen escuchar los datos sin procesar, los datos procesados y todos los comandos que se pasan; esas aplicaciones también querrán emitir comandos; no podemos anticipar cuántos de esos módulos queremos escribir, pero esperamos 3 o 4 procesos de datos pesados que transformen los 32 flujos de entrada en una sola salida; así como 3 o 4 pequeñas aplicaciones únicas como un "registrador de comandos". El requisito de modularidad significa que queremos que los viejos generadores de datos y emisores de comandos sean agnósticos sobre cuántos oyentes hay por ahí. También queremos que los comandos sean reconocidos por sus destinatarios.
Las dos máquinas están conectadas por un interruptor, y los paquetes (datos y comandos, y confirmaciones) se envían en UDP.
Los cinco posibilidades que estamos pensando:
flujos de datos, comandos y reconocimientos son el blanco de número de puerto. El generador de datos envía flujos de datos independientes como paquetes UDP a diferentes números de puerto vinculados por procesos de visualización independientes en la computadora de visualización. Cada proceso también vincula un puerto de escucha para los comandos entrantes, y otro puerto para los acuses de recibo entrantes a los comandos salientes. Esta opción parece buena porque el kernel hace el trabajo de traficar/filtrar los paquetes; pero malo porque es difícil ver cómo los procesos se dirigen entre sí frente a los módulos agregados imprevistos; también parece conducir a una explosión de puertos encuadernados.
Las secuencias de datos se dirigen a sus respectivos visualizadores por número de puerto, y cada proceso enlaza un puerto para escuchar los comandos. Pero todos los emisores de comandos envían sus comandos a un proceso de reenvío de paquetes que conoce los puertos de entrada de todos los procesos y reenvía cada comando a todos ellos. Los reconocimientos también se envían a este puerto universal de comando y se envían a todos los procesos.Embalamos información sobre el objetivo previsto de cada comando y cada confirmación en los paquetes de comando/ack, por lo que los procesos mismos tienen que examinar todos los comandos/acks para encontrar los que pertenecen a ellos.
El proceso de envío de paquetes también es el objetivo de todos los paquetes de datos. Todos los paquetes de datos y todos los paquetes de comandos se envían a quizás 40 procesos diferentes. Obviamente, esto genera mucho más tráfico en la subred; también limpia la explosión de puertos encuadernados.
Dos paquetes-distribuidores podrían funcionar en la computadora de vis - uno difunde comandos/ack a todos los puertos. El otro difunde datos solo a los puertos que posiblemente deseen datos.
Nuestros 32 procesos de visualización se pueden agrupar en 1 proceso que extrae datos para las 32 señales, lo que reduce en gran medida el tráfico adicional que causa la opción 3.
Si usted ha experimentado con los datos que pasan alrededor de entre múltiples procesos en un pequeño número de máquinas, y tienen algo de sabiduría o reglas generales sobre qué estrategias son robustos, lo agradecería enormemente el consejo! (las solicitudes de aclaración en las fotos son bienvenidas)
Descripción increíble! pero pertenece a programmers.stackexchange.com –
¡Gracias por la sugerencia! Soy un poco nuevo para SA: como el OP, la mejor manera de moverlo es para obtener una cuenta en la programación.SA, y luego marcar la Q, ¿y un moderador la mueve? ¡Gracias un montón! – ImAlsoGreg
Es un poco difícil leer lo que está buscando, parece que solo un middleware básico de mensajería podría limpiar las cosas, p. [0mq] (http://zero.mq). –