2011-08-16 26 views
5

Actualmente estoy desarrollando un servidor de socket C# que necesita enviar y recibir comandos para un proceso en tiempo real. El cliente es un dispositivo Android. Actualmente, los requisitos en tiempo real son "suaves", sin embargo, en el futuro pueden surgir requisitos de temporización más estrictos. Digamos que en el futuro podría ser enviar comandos a una grúa que podría ser potencialmente peligrosa.Servidor de socket asíncrono frente a síncrono para la aplicación en tiempo real

El servidor está funcionando, y aparentemente muy bien con mi diseño actual servidor de socket sincrónico. Tengo hilos separados para recibir y enviar datos. Me pregunto si habría alguna razón para intentar un enfoque de socket de servidor asíncrono. ¿Podría proporcionar más estabilidad y/o un rendimiento más rápido?

+1

async design only beneficail SI usted tiene más de un cliente y/o múltiples mensajes/conexiones en paralelo para manejar ... en esos casos, el diseño asincrónico hace que su servidor sea mucho más escalable – Yahia

Respuesta

6

voy a pasar por alto la definición de tiempo real y dicen que tomas asíncronos no hará que el cuerpo del proceso de solicitud más rápido, pero aumentará la concurrencia (el número de solicitudes se puede tomar en cualquier momento). Si todos los procesadores están ocupados procesando algo, no obtendrás ninguna ganancia. Esto solo le da ganancia en la situación en la que un procesador se habría sentado esperando que un socket reciba algo.

Sólo una nota en tiempo real, si sus requerimientos de tiempo real son algo como la necesidad de garantizar una respuesta en tiempo x, entonces C# y .NET no le dará esas garantías. Esto, sin embargo, depende de sus definiciones actuales y futuras de "soft". Puede ocurrir que ocurra obteniendo buenos tiempos de respuesta, pero no lo confunda con sistemas reales en tiempo real.

+1

Gracias por la respuesta Adam! Supongo que estaba confundido por todas las publicaciones sobre servidores de socket asíncrono que son más rápidos, pero ahora sé en qué situaciones se encuentran. Y estoy totalmente de acuerdo con su nota, C# no es una buena opción para los requisitos de tiempo real. Probablemente voy a hacer un servidor en C si se trata de requisitos más difíciles. Otra cosa, ¿son las tomas TCP alguna vez una opción viable para la comunicación en tiempo real, o debería considerar algo más? – Cartaya

+1

Si está haciendo C sincrónico en comparación con C# asincrónico, se está haciendo un gran mal imo. – Henrik

+0

Cualquier tipo de comunicación a través de un medio latente (es decir, una red) no será brillante para los sistemas en tiempo real. Sin embargo, TCP es una buena opción si se quiere confiabilidad. –

1

Si va a dudar de la utilidad de algo asíncrona en sus aplicaciones, entonces definitivamente debe leer sobre this. Se le da una idea clara de lo que las soluciones asíncronas podrían agregar a sus aplicaciones

+0

Gracias por publicar la referencia de LMAX. Muy interesante. – kakridge

+0

http://disruptor.googlecode.com/files/Disruptor-1.0.pdf - ese es el papel que debe leer, no la simplificación de corte copia-n-goma de Fowler;) – Henrik

0

No creo que se va a conseguir más estabilidad o rendimiento más rápido. Si realmente es un sistema en "tiempo real", entonces debería ser sincrónico. Si puede tolerar "casi en tiempo real" y hay operaciones de computación costosas o de larga ejecución, entonces podría considerar un enfoque asincrónico. Sin embargo, no agregaría la complejidad si no fuera necesario.

0

Si es en tiempo real, a continuación, a pesar de todo quiere que sus comunicaciones a ser respaldados por una cola para que pueda demostrar lógica temporal en esa cola. Esto es lo que le proporciona nio/io-completion-ports/async. Si está utilizando una programación sincrónica, está desperdiciando su CPU al copiar datos de la RAM a la tarjeta de red.

Además, significa que su servidor es absolutamente único subproceso. Puede tener un solo hilo incluso con asincronización, pero aún así poder atender miles de solicitudes.

Digamos, por ejemplo, que un cliente quería realizar un ataque de DOS. Se conectaría y enviaría un byte de datos. Su aplicación ahora no podrá recibir más comandos por el tiempo de espera de esa conexión, que podría ser bastante grande. Con la función asincrónica, ACK devolverá el paquete SYN, pero su código no estaría esperando la transmisión completa.

+0

Está usando UDP. Los ataques de ACK no se aplican. Su consejo no refuerza la naturaleza en tiempo real de su aplicación; mejora el rendimiento de la CPU y la seguridad de la red. Ser capaz de escribir en términos de lógica temporal en una cola de mensajes asíncrona solo es práctico si luego tiene la libertad de manipular el contenido de la cola para "ponerse al día" si su tasa de servicio se está rezagando; e introduce una fluctuación pseudoaleatoria en la tasa de servicio que una solución sincrónica podría evitar (aunque esto solo es realmente relevante si el enlace a la 'grúa' está totalmente dedicado/previsiblemente latente). –

+0

¿Dónde dice que está usando UDP? No puedo encontrar una mención de eso. No estoy seguro estoy de acuerdo con usted, pero utilizando asíncrono en lugar de tomas de sincronización, teniendo en cuenta más de una conexión, disminuirá la latencia y que es el asesino a través de Internet - y el Internet no envía paquetes de esperar latentes a su proceso - - entonces no veo cómo se aplica lo que estás hablando. Además, ¿qué importa si hay fluctuaciones, y qué significa eso? - adivinando aquí - los paquetes pueden llegar a ser desordenados y arbitrariamente retrasados ​​de todos modos. – Henrik

+0

Tiene razón en que no menciona UDP. No sé por qué lo asumí, tal vez la referencia a una aplicación industrial (grúa) lo puso en mi cabeza. –

Cuestiones relacionadas