socket.io rethinkdb

socket.io vs RethinkDB changefeed



(1)

Primero, aclaremos la relación entre socket.io y RethinkDB changefeeds. Socket.io está destinado a la comunicación en tiempo real entre el cliente (el navegador) y el servidor (Node.js). Los changfeeds de RethinkDB son la forma en que su servidor (Node.js) escucha los cambios en la base de datos. El cliente no puede comunicarse con RethinkDB directamente.

Una arquitectura muy típica para una aplicación en tiempo real es que los cambios de alimentación de RethinkDB se suscriban a los cambios en la base de datos y luego usen socket.io para pasar esos cambios al cliente. El cliente generalmente también emite mensajes que pueden escribirse en su base de datos, dependiendo de la lógica de su aplicación.

Sí, podría simplemente emitir todos los mensajes a través de socket.io y luego pasar todos los mensajes a todos los clientes, y luego simplemente escribir esos mensajes en la base de datos para su persistencia. También es cierto que esto es más rápido, pero existen varias desventajas en este enfoque.

1. La base de datos como única fuente de verdad.

El problema más fácil de detectar es el siguiente:

  • ¿Qué sucede si tu aplicación no puede escribir algo en la base de datos?
  • ¿Qué sucede si los datos que intenta insertar en la base de datos no son válidos o están duplicados? ¿Escribes la lógica de la aplicación para manejar esto?
  • ¿Qué sucede si el servidor Node.js deja de funcionar antes de enviar la consulta de escritura?

Estos son solo algunos ejemplos rápidos en los que, debido a su arquitectura, perderá o tendrá datos desincronizados. Y solo para reiterar esto, perderá datos, porque su principal fuente de verdad es la memoria. También podría tener discrepancias entre los datos de su aplicación Node.js y su base de datos.

El punto es que la base de datos siempre debe ser su única fuente de verdad y solo debe reconocer los datos cuando se escriben en el disco. No estoy seguro de cómo alguien podría dormir por la noche de lo contrario.

2. Consultas avanzadas

Si acaba de pasar todos los mensajes nuevos de todos los clientes a todos los clientes a través de socket.io, ahora tiene que tener una lógica bastante compleja en su cliente para filtrar todos los datos que son realmente importantes. Tenga en cuenta que está pasando una gran cantidad de datos inútiles a través de la red que el cliente no usará realmente.

La alternativa es escribir un pub / subsistema en el que se suscriba a ciertos canales (o algo así) para filtrar los datos que son realmente importantes para el cliente.

RethinkDB resuelve esto al proporcionar su propio lenguaje de consulta que puede adjuntar a las fuentes de cambios. Si el cliente, por ejemplo, necesita que todos los usuarios de mi tabla de users entre 20 y 30 años, que viven en el estado de California, a 10 millas de San Francisco, y que han comprado un libro en los últimos 6 meses, este se puede expresar en ReQL (lenguaje de consulta de RethinkDB) y se puede configurar un feedfeed para esa consulta, de modo que el cliente solo reciba una notificación cuando haya cambios relevantes . Esto es mucho más difícil de hacer solo con Socket.io y Node.js.

3. escalabilidad

El último problema que resuelve RethinkDB es que es una solución mucho más escalable para simplemente almacenar todo en la memoria (a través de Socket.io y Node.js). Debido a que RethinkDB se ha creado desde cero para ser distribuido, puede tener un grupo de más de 20 nodos RethinkDB con fragmentos y réplicas. Cada consulta RethinkDB que escribe se distribuye de forma predeterminada. Ahora, puedes tener más de 20 nodos Node.js que no tienen estado y todos están escuchando changfeeds. Debido a que la base de datos es la fuente central de la verdad, esto no es un problema.

La alternativa sería limitarse a un servidor, tener algún otro pub / subsistema (basado en algo como Reddis, por ejemplo), tener solo una única base de datos que sondea ... Probablemente haya más ejemplos, pero puede ver dónde Me voy con esto.

Me encantaría saber si esto responde a tu pregunta y si llego a donde vienes. Es un poco difícil saber cómo estructurar sus aplicaciones al principio, pero realmente es una solución elegante para la mayoría de las arquitecturas en tiempo real.

Actualmente estoy usando socket.io sin RethinkDB como este:

Los clientes emiten eventos a socket.io, que los recibe, los emite a varios otros clientes y los guarda en la base de datos para su persistencia. Una nueva conexión de cliente obtendrá datos existentes de la base de datos y luego escuchará nuevos eventos a través de socket.io.

¿Cómo me ayudaría aquí el cambio a RethinkDB y el cambio de alimentación?

La forma en que veo el mismo trabajo con RethinkDB es que el cliente podría realizar una POST (que se inserta en RethinkDB) en lugar de emitir a socket.io, y luego socket.io está observando un cambio de alimentación RethinkDB y emitiendo a todos los clientes cuando recibe datos nuevos. .

¿Cómo es este método usando RethinkDB y el feedfeed mejor que mi método actual? Para mí, ambos sienten que logran lo mismo, pero no veo ninguna ventaja obvia en el método RethinkDB, y como me dirijo a db en lugar de emitir desde socket.io en el servidor de inmediato, lo hará. Seguramente será un poco más lento.