- Notifications
You must be signed in to change notification settings - Fork230
Long polling#354
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Merged
Uh oh!
There was an error while loading.Please reload this page.
Merged
Long polling#354
Changes fromall commits
Commits
Show all changes
11 commits Select commitHold shift + click to select a range
a77934d Long polling
omero329810391b Merge branch 'master' into Long-polling
omero329a00d708 Update 5-network/10-long-polling/article.md
omero32930108fa Update 5-network/10-long-polling/article.md
omero329dae638f Update 5-network/10-long-polling/article.md
omero32903a0d17 Update 5-network/10-long-polling/article.md
omero3291372c70 Update 5-network/10-long-polling/longpoll.view/browser.js
omero3298355a92 Update 5-network/10-long-polling/longpoll.view/server.js
omero3297510557 Update 5-network/10-long-polling/article.md
omero3292f4d805 error 502: tiempo de espera agotado
omero329882a263 cerró la conexión
omero329File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Uh oh!
There was an error while loading.Please reload this page.
Jump to
Jump to file
Failed to load files.
Loading
Uh oh!
There was an error while loading.Please reload this page.
Diff view
Diff view
There are no files selected for viewing
86 changes: 43 additions & 43 deletions5-network/10-long-polling/article.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,96 +1,96 @@ | ||
| #Sondeo largo | ||
| Sondeo largo es la forma más sencilla de tener una conexión persistente con el servidor, que no utiliza ningún protocolo específico como WebSocketo Eventos enviados por el servidor. | ||
| Al ser muy fácil de implementar, también es suficientemente bueno en muchos casos. | ||
| ##Sondeo regular | ||
| La forma más sencilla de obtener nueva información del servidor es un sondeo periódico. Es decir, solicitudes regulares al servidor: "Hola, estoy aquí, ¿tienes información para mí?".Por ejemplo, una vez cada10segundos. | ||
| En respuesta, el servidor primero se da cuenta de que el cliente está en línea, y segundo, envía un paquete de mensajes que recibió hasta ese momento. | ||
| Eso funciona, pero hay desventajas: | ||
| 1.Los mensajes se transmiten con un retraso de hasta10segundos (entre solicitudes). | ||
| 2.Incluso sinohay mensajes, el servidor se bombardea con solicitudes cada 10segundos, aunque el usuario haya cambiado a otro lugar o esté dormido. Eso es bastante difícil de manejar, hablando en términos de rendimiento. | ||
| Entonces, si hablamos de un servicio muy pequeño, el enfoque puede ser viable,pero en general, necesita una mejora. | ||
| ##Sondeo largo | ||
| El llamado "sondeo largo" es una forma mucho mejor de sondear el servidor. | ||
| También es muy fácil de implementar y envía mensajes sin demoras. | ||
| El flujo: | ||
| 1.Se envía una solicitud al servidor. | ||
| 2.El servidor no cierra la conexión hasta que tiene un mensaje para enviar. | ||
| 3.Cuando aparece un mensaje, el servidor responde a la solicitud con él. | ||
| 4.El navegador realiza una nueva solicitud de inmediato. | ||
| La situación en la que el navegador envió una solicitud y tiene una conexión pendiente con el servidor, es estándar para este método. Solo cuando se entrega un mensaje, se restablece la conexión. | ||
|  | ||
| Si se pierde la conexión, por ejemplo, debido aun error de red, el navegador envía inmediatamente una nueva solicitud. | ||
| Un esquema de la función de suscripción del lado del cliente que realiza solicitudes largas: | ||
| ```js | ||
| async function subscribe() { | ||
| let response = await fetch("/subscribe"); | ||
| if (response.status == 502) { | ||
| //El estado502es un error de "tiempo de espera agotado" en la conexión, | ||
| //puede suceder cuando la conexión estuvo pendiente durante demasiado tiempo, | ||
| //y el servidor remoto o un proxyla cerró | ||
| //vamos a reconectarnos | ||
| await subscribe(); | ||
| } else if (response.status != 200) { | ||
| //Un error: vamos a mostrarlo | ||
| showMessage(response.statusText); | ||
| //Vuelve a conectar en un segundo | ||
| await new Promise(resolve => setTimeout(resolve, 1000)); | ||
| await subscribe(); | ||
| } else { | ||
| //Recibe y muestra el mensaje | ||
| let message = await response.text(); | ||
| showMessage(message); | ||
| //Llama asubscribe()nuevamente para obtener el siguiente mensaje | ||
| await subscribe(); | ||
| } | ||
| } | ||
| subscribe(); | ||
| ``` | ||
| Como puedes ver, la función`subscribe`realiza una búsqueda, luego espera la respuesta, la maneja y se llama a sí misma nuevamente. | ||
| ```warn header="El servidor debería estar bien aún con muchas conexiones pendientes" | ||
| La arquitectura del servidor debe poder funcionar con muchas conexiones pendientes. | ||
| Algunas arquitecturas de servidor ejecutan un proceso por conexión. Habrá tantos procesos como conexiones y cada proceso requiere mucha memoria. Demasiadas conexiones la consumirán toda. | ||
| Este suele ser el caso de losbackendsescritos en lenguajesPHP, Ruby, pero técnicamente no es un problema del lenguaje sino de implementación. La mayoría de los lenguajes modernos permiten implementar unbackend adecuado, pero algunos lo hacen más fácil que otros. | ||
| Los backends escritos conNode.jsgeneralmente no tienen estos problemas. | ||
| ``` | ||
| ##Demostración: un chat | ||
| Aquí hay un chat de demostración, también puedes descargarlo y ejecutarlo localmente (si estás familiarizado con Node.jsy puedes instalar módulos): | ||
| [codetabs src="longpoll" height=500] | ||
| El código del navegador está en `browser.js`. | ||
| ##Área de uso | ||
| El sondeo largo funciona muy bien en situaciones en las que es raro recibir mensajes. | ||
| Si los mensajes llegan con mucha frecuencia, entonces el gráfico de mensajes solicitados vs recibidos, pintado arriba, se vuelve en forma de sierra. | ||
| Cada mensaje es una solicitud separada, provista de encabezados, sobrecarga de autenticación, etc. | ||
| Entonces, en este caso, se prefiere otro método, como[Websocket](info:websocket)o [Eventos enviados por el servidor](info:server-sent-events). |
16 changes: 8 additions & 8 deletions5-network/10-long-polling/longpoll.view/browser.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
6 changes: 3 additions & 3 deletions5-network/10-long-polling/longpoll.view/index.html
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,18 +1,18 @@ | ||
| <!DOCTYPE html> | ||
| <script src="browser.js"></script> | ||
| Todos los visitantes de esta página verán mensajes entre ellos. | ||
| <form name="publish"> | ||
| <input type="text" name="message" /> | ||
| <input type="submit" value="Enviar" /> | ||
| </form> | ||
| <div id="subscribe"> | ||
| </div> | ||
| <script> | ||
| new PublishForm(document.forms.publish, 'publish'); | ||
| //parámetro deurlaleatorio para evitar problemas de almacenamiento en caché | ||
| new SubscribePane(document.getElementById('subscribe'), 'subscribe?random=' + Math.random()); | ||
| </script> |
12 changes: 6 additions & 6 deletions5-network/10-long-polling/longpoll.view/server.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.