El cliente emite newdataFromClient para cortar
servidor comienza a procesar nuevos datos:
socket.on('newdataFromClient', async(newdataFromClient) => { let result = await doSomething(newdataFromClient) socket.emit('response', result) }) El servidor eventualmente emitirá 2 resultados y los enviará de vuelta al cliente. Uno por cada newdataFromClient que recibió.
¿Se devolverán los resultados en orden o el que termine más rápido será el que se devolverá primero?
Estoy ejecutando un servidor de nodo básico en una Macbook Pro. Si el servidor comienza a obtener múltiples datos nuevos de newdataFromClient uno tras otro, ¿comenzará a manejar cada uno en subprocesos separados y cuando se quede sin subprocesos comenzará a apilarlos en orden?
Supongo que mi servidor fallará de todos modos si no puede manejar demasiadas llamadas, pero eso es un problema aparte.
Aquí solo me interesa el orden de las respuestas del servidor .
Los eventos de socket.io llegarán en el orden en que fueron enviados desde el servidor. El transporte subyacente aquí es TCP, que mantiene los paquetes en orden.
Ahora, si el propio servidor está manejando las solicitudes individuales que llegan y en su procesamiento para enviar un resultado, tiene operaciones asincrónicas, es posible que no haya garantía en el servidor en qué orden enviará las respuestas. De hecho, es probable que el orden de finalización en el servidor sea impredecible.
¿Se devolverán los resultados en orden o el que termine más rápido será el que se devolverá primero?
Cualquiera que termine primero en el servidor y envíe un mensaje de vuelta es el que se recibirá primero en el cliente. Estos son mensajes independientes que simplemente se transportan en ruta hacia el cliente cada vez que se emiten en el servidor. Y el transporte TCP que subyace al protocolo webSocket que subyace al motor socket.io mantendrá estos paquetes en el orden en que fueron enviados originalmente desde el servidor.
Función de reconocimiento en socket.io
socket.io tiene un medio para obtener un "reconocimiento" específico de un mensaje específico. Si observa el documento socket.emit() , verá que uno de los argumentos opcionales es una devolución de llamada ack. Eso se puede usar (junto con el servidor que envía una respuesta de acuse de recibo) para obtener una respuesta específica a este mensaje específico. Para obtener detalles sobre cómo implementar, consulte el documento del lado del cliente y del servidor para esa característica "ack".
En ausencia del uso de esa función incorporada, tendría que crear su propio sistema basado en ID de mensaje para que pueda hacer coincidir una respuesta dada que regresa del servidor con la solicitud original (eso es lo que hace la función "ack" internamente) porque socket.io es no es de forma nativa un protocolo de solicitud/respuesta (es un protocolo de mensajes).