javascript - Zdieľať objekty v Node.js medzi rôznymi inštanciami


Potrebujem zdieľať niektoré objekty alebo kompletné moduly medzi rôznymi procesmi Node alebo klastrami, hľadal som na mnohých blogoch, ale nenašiel som uspokojivú odpoveď.

Ak je to nemožné urobiť, máš nejaké nápady, ako to zvládnuť?

Odpoveď č. 1

V závislosti od konfigurácie ma napadajú tri spôsoby.

  1. ak sú služby uzlové klastre, rýchla databáza ako leveldb alebo redis.
  2. Ak sú služby na rovnakom počítači, ale bežia ako samostatné procesy, potom Redis alebo Unixové sokety fungujú dobre.
  3. ak sú služby rozložené na viacerých strojoch, potom scuttlebutt poskytuje dobré riešenie.

redis: Používanie rýchlej lokálnej databázy ako redis na zdieľanie objektov medzi procesmi na rovnakom stroji zahŕňa použitie jednoduchých príkazov put( key, data ) a get( key ), ale musíte ich serializovať a deserializovať, pravdepodobne pomocou JSON. Neexistuje žiadna formálna kontrola súbežnosti, takže musíte zabezpečiť, aby boli všetky zmeny objektov dostupné pre všetkých klientov. Jedným spôsobom je použiť vstavaný pub/sub mechanizmus redisu na spustenie udalostí, keď sa vykonajú zmeny. Ďalším spôsobom je použiť optimistické zámky.

Unixové sokety Pre projekty, ktoré potrebujú zdieľať objekty medzi rôznymi technológiami, napríklad medzi C++ aplikáciou a Node, unixové sokety poskytujú veľmi rýchle riešenie. Stále musíte serializovať/deserializovať a kontrolovať súbežnosť, ale je to rýchlejšie ako riešenie s databázou a funguje to naprieč rôznymi technológiami. Existuje Node projekt, ktorý pomáha s niektorými detailmi.

scuttlebutt Pravdepodobne najlepší spôsob, ako zdieľať dáta medzi procesmi na samostatných počítačoch. Z webu scuttlebutt:

Scuttlebutt je určený na to, aby bol podtriedou rôznych dátových modelov. Dve implementácie sú poskytnuté ako príklady scuttlebutt/model a scuttlebutt/events...

Existuje tiež dobrý biely dokument, ktorý sa zaoberá vedou za používaním replikácie na zdieľanie dát objektov.

Dúfam, že ti to poskytne niekoľko životaschopných alternatív.

Odpoveď č. 2

Videl som tvoju odpoveď asi pred 4 alebo 5 dňami a rozhodol som sa urobiť niečo, aby som presne to urobil

https://npmjs.com/package/webject
Tento balík umožňuje zdieľanie objektov cez internet
Objekt môže byť hosťovaný cez serve alebo k nemu môže byť pripojené cez connect

Získanie tých 2 funkcií ako

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

Niekto, kto slúži, môže byť ako

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)

Niekoho spojiť môže byť ako

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)