Pregunta

Mi clase de C# debe poder procesar un gran volumen de eventos recibidos a través de una conexión de socket estilo flujo tcp.El volumen de mensajes de eventos recibidos del servidor tcp por el socket de la clase es completamente variable.Por ejemplo, a veces solo recibirá un mensaje de evento en un período de diez segundos y otras veces recibirá sesenta mensajes de evento en un segundo.

Estoy usando Socket.ReceiveAsync para recibir mensajes.RecibirAsync devuelve verdadero si la operación de recepción está pendiente o falso si ya hay datos en el cable y la operación de recepción se completó sincrónicamente.Si la operación está pendiente, el Socket llamará a mi devolución de llamada en un subproceso de finalización de IO; de lo contrario, invoco mi propia devolución de llamada en el subproceso actual (IOC).Además, junto con los mensajes de eventos, también recibo respuestas a comandos que se enviaron a este servidor tcp.Los mensajes de respuesta se procesan de inmediato;individualmente, despidiendo a un trabajador del grupo de subprocesos.

Sin embargo, me gustaría poner en cola los mensajes de eventos hasta que tenga "suficientes" (N) de ellos O hasta que no haya más en el cable... y luego activar un trabajador del grupo de subprocesos para procesar un lote de mensajes de eventos.Además, quiero que todos los eventos se procesen secuencialmente, por lo que solo quiero que un trabajador del grupo de subprocesos trabaje en esto a la vez.

El procesador de mensajes de eventos solo necesita copiar el búfer de mensajes en un objeto, generar un evento y luego liberar el búfer de mensajes nuevamente en el grupo de búfer en anillo.Entonces mi pregunta es... ¿cuál crees que es la mejor estrategia para lograr esto?

¿Necesitas más información?Hágamelo saber.¡¡Gracias!!

¿Fue útil?

Solución

Yo no llamaría alto volumen a 60 eventos por segundo.A ese bajo nivel de actividad, cualquier método de procesamiento de sockets estará bien.He manejado 5000 eventos por segundo en un solo hilo usando hardware que es mucho menos capaz que las máquinas actuales, solo usando select.

Diré que si buscas escalar, entregar mensajes individualmente entre hilos será un desastre.Necesita realizar lotes o sus cambios de contexto acabarán con el rendimiento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top