socket node example node.js sockets nonblocking near-real-time

node.js - node - socket io example



¿Cómo son realmente asincrónicas las aplicaciones web de Node.js+Socket.io+MongoDB? (6)

¿Has descubierto a Chole ? Funciona por separado desde su servidor web e interactúa con él mediante HTTP POST. De esta forma, puede codificar su aplicación web de la forma que desee.

Tengo una buena aplicación web LAMP. Hace una semana necesité agregarle un mecanismo de notificación de inserción.
Por lo tanto, lo que hice fue agregar node.js + socket.io en el servidor y sondear la base de datos MySQL cada 10 segundos usando node.js para verificar si había nuevos elementos: de ser así, los habría enviado al cliente ( s) con socket.io.
Estaba muy contento con el resultado, incluso si esa no es una notificación correcta en tiempo real (ya que hay un retraso de hasta 10 segundos).

Ahora, estoy a punto de crear una nueva aplicación web que también necesitará notificaciones push. Me pregunto si seguiré con el mismo enfoque que el primero (que creo que es más estable y maduro) o para ir totalmente a Node.js, sin PHP y Apache. En cuanto a la base de datos, ya he decidido ir a MongoDB.

Finalmente, mi pregunta es: si utilizo Node.js + Socket.io + MongoDB ¿obtendré una aplicación web near-real-time ? Quiero decir, tan pronto como se inserte un nuevo registro en MongoDB, ¿habrá algún tipo de evento desencadenado que pueda detectar a través de node.js, verifique algo y, si corresponde, envíe la notificación al cliente? ¿O habrá algún tipo de sondeo en el lado del servidor db y retraso, como con mi primera aplicación web LAMP?

Una pregunta relacionada: ¿puedes construir una aplicación web en tiempo real en MySQL sin hacer ninguna encuesta como lo hice con mi primera aplicación? ¿O necesitas MongoDB (o Redis)?

Espero que esta pregunta no sea demasiado tonta, lo siento, estoy empezando con Node.js y co.

Gracias.


En realidad, el uso de la tecnología Push como Socket.IO te ayuda a usar

el recurso del servidor de manera eficiente y también le ayuda a aprovechar los navegadores antiguos para navegadores modernos que hacen una conexión tipo websocket o websocket.

El sondeo de 10 segundos es una solicitud HTTP que es costosa, especialmente cuando hay muchos usuarios presentes.

A diferencia de la tecnología de votación, la tecnología de inserción es relativamente barata. El cliente de los usuarios está abriendo un socket dedicado (es decir, websocket) para escuchar la notificación de inserción del servidor.

Y generalmente, el JavaScript del lado del cliente realiza algunas acciones cuando se recibe la notificación push.

Usar su pila LAMP y Socket.IO con un puerto diferente (distinto de 80) será suficiente para implementar lo que necesita.

Pero el uso de Node.js + MongoDB + Socket.IO realmente te ayuda a administrar los recursos de tu servidor de manera muy eficiente.

Porque esos tres tienen naturaleza no bloqueante.

Si comprende correctamente el concepto de no bloqueo e implementa su aplicación de forma adecuada,

su aplicación idéntica, una aplicación con la misma característica pero con un idioma diferente y una base de datos diferente, podría manejar muchas más solicitudes que la pila general de LAMP.

La imagen de arriba es una famosa tabla de comparación de la forma de no bloqueo versus hilo para manejar la concurrencia

Apache (hilo) vs Nginx (sin bloqueo)

MySQL es una gran base de datos. Creo que no necesitarás join y transactions para notificaciones en tiempo real.

MongoDB no tiene esas dos características a menos que implemente funciones similares por usted mismo.

Debido a que no tiene esas dos y algunas características propias, MongoDB puede almacenar y recuperar datos mucho más rápido que las bases de datos SQL tradicionales.

Cambiar de MySQL a MongoDB reducirá el tiempo necesario para insertar y recuperar datos.


Entiendo tu problema porque también cambié a node.js desde php / apache / mysql .

  • En general, node.js es estable, los módulos y sus scripts son los motivos principales de los errores

  • El tiempo real no tiene nada que ver con la base de datos, todo se trata de cliente y servidor, puede consultar tantos datos como desee en sus solicitudes y enviarlos al otro cliente.

  • Elegir node.js es muy inteligente pero es más difícil de implementar.

  • Cuando inserta un nuevo registro en su base de datos, el evento es la solicitud en sí, hará un evento push junto con la consulta de la base de datos algo así como:

    // Please note this is not real code, just an example of the idea app.get(''/query'', function(request, response){ // Query your database db.query(''SELECT * FROM users'', function(rows){ // Push notification to dan socket.emit(''database_query_executed'', ''to_dan'', rows); // End request response.end(''success''); }) })

  • ¡Por supuesto que puedes usar MySQL! Y cualquier base de datos que desee, como dije en tiempo real, no tiene nada que ver con las bases de datos porque la base de datos está en el medio del proceso y es totalmente opcional.

  • Si desea utilizar node.js para notificaciones push y php / apache para mysql , deberá crear 2 solicitudes para cada servidor, como:

    // this is javascript ajax(''http://node.yoursite.com/push'', node_options) ajax(''http://php.yoursite.com/mysql_query'', php_options)

    o si solo desea una solicitud, o si desea utilizar un formulario, puede llamar a su php y dentro de php puede crear una solicitud http o net a node.js desde php, algo así como:

    // this is php new HttpRequest(''http://node.youtsite.com/push'', HttpRequest::METH_GET);


Re: disparadores en MongoDB - vea esta respuesta: https://.com/a/12405093/1651408

Hay disparadores mucho más convenientes en MySQL, pero llamar a Node.js desde ellos requeriría un poco de trabajo con las UDF de MySQL ( funciones definidas por el usuario ), por ejemplo, empujando datos a través de un socket Unix. Tenga en cuenta que esto es necesario solo cuando otras aplicaciones (además de su proceso Node.js) estén actualizando la base de datos, y asegúrese de elegir InnoDB como almacenamiento en este caso (bloqueo de filas vs. niveles de tablas).

Puede ver que no hay un gran problema con su elección de sockets.io de sockets.io , incluso si los sockets web del lado del cliente no son compatibles , usted retrocederá (graciosamente, espero) al sondeo.

Finalmente, su pregunta no es para nada tonta, ya que la tecnología de empuje es definitivamente superior a la avalancha de solicitudes de sondeo: se escala mejor. EDITAR: Sin embargo, no describiría ninguna tecnología como en tiempo real .

Otro EDIT: para una configuración bastante conocida y exitosa de este tipo, lea esto: http://blog.fogcreek.com/the-trello-tech-stack/


Utilizando:

  • Una colección regular de MongoDB como la tienda ,
  • Una colección MongoDB Capsulada con cursores de Tailable como la cola ,
  • Un trabajador de nodo con Socket.IO viendo la cola como el trabajador ,
  • Un servidor de nodo para servir la página con el cliente Socket.IO, y para recibir datos POSTed (o como se agreguen los datos) como el servidor

Es como:

  1. Los nuevos datos se envían al servidor,
  2. El servidor pone los datos en la tienda,
  3. El servidor agrega el ObjectID de datos a la cola,
  4. La Cola enviará el ObjectID recién llegado al Cursor de Tailable abierto en el Trabajador,
  5. El trabajador va y obtiene los datos reales en el ObjectID de la tienda,
  6. El trabajador emite los datos a través del socket,
  7. El cliente recibe los datos del socket.

Esto es ''push'' desde la adición inicial de los datos hasta la recepción en el cliente, sin votación, así como en tiempo real, dado que se puede obtener el tiempo de procesamiento en cada paso.


con JS puede abrir un socket en su servidor (no en el navegador anterior), el servidor tendrá un programa ah-hoc (en un puerto ad-hoc, por lo que necesita el permiso para abrir la puerta y ejecutar el programa en su servidor) que lo hará envíe datos (casi) en tiempo real desde y hacia el cliente, y sin el protocolo de HTTP overhead.old browser simplemente retrocederá al mecanismo de votación.

No puedo ver otra forma de hacer esto (probablemente ya hay un marco "coocked" que hace esto)