Búsqueda de sitios web

javascript - Compartir objetos en nodejs entre diferentes instancias


Necesito compartir algunos objetos o módulos completos entre diferentes procesos o clústeres de Node, busqué en muchos blogs sin obtener una respuesta satisfactoria.

Si eso es imposible de hacer, ¿alguna idea de cómo cubrir eso?

Respuesta #1

Dependiendo de la configuración, puedo pensar en tres formas.

  1. si los servicios son clústeres de nodos, una base de datos rápida como leveldb o redis.
  2. si los servicios están en la misma máquina pero se ejecutan como procesos separados, entonces redis o los sockets unix funcionan bien.
  3. si los servicios están distribuidos en varias máquinas, entonces scuttlebutt proporciona una buena solución.

redis: Usar una base de datos local rápida como redis para compartir objetos entre procesos en la misma máquina implica usar un simple put(key, data) y get(key), pero tienes que serializar y deserializar, probablemente usando JSON. No hay control formal de concurrencia, por lo que debes asegurarte de que cualquier cambio en los objetos esté disponible para todos los clientes. Una forma es usar el pub/sub incorporado de redis para activar cuando se realicen cambios. Otra forma es usar bloqueo optimista.

Sockets Unix Para proyectos que necesitan compartir objetos entre diferentes tecnologías, digamos entre una aplicación en C++ y Node, los sockets Unix proporcionan una solución muy rápida. Todavía tienes que serializar/deserializar y controlar la concurrencia, pero es más rápido que la solución basada en base de datos y funciona entre diferentes tecnologías. Hay un proyecto de Node que ayuda con algunos de los detalles.

scuttlebutt Probablemente la mejor manera de compartir datos entre procesos en máquinas separadas. Desde el sitio de scuttlebutt:

Se pretende que Scuttlebutt se subclasifique en una variedad de modelos de datos. Se proporcionan dos implementaciones como ejemplos scuttlebutt/model y scuttlebutt/events...

También hay un buen documento técnico que aborda la ciencia detrás del uso de la replicación para compartir datos de objetos.

Espero que esto te dé algunas alternativas viables.

Respuesta #2

Vi tu respuesta hace unos 4 o 5 días y decidí hacer algo para HACER JUSTO eso

https://npmjs.com/package/webject
Este paquete permite el intercambio de objetos a través de la web
Un objeto puede ser alojado mediante serve o conectado mediante connect

Obteniendo las 2 funciones como

let {serve,connect}=require('webject')

Alguien sirviendo puede ser como

let myWebject=serve(myObj) //object myObj gets shared, myObj could even be cyclic
let clientToken=myWebject.addToken(1) //level 1 is view only(edits won't edit your server side object)

Alguien conectándose puede ser como

let myClientObj=await connect('wss://example.com:8009',clientToken) //assuming you shared a client token with someone to connect
//this is an asynchronous promise that if you have a valid location and token, you would connect to an object hosted(by that location)