javascript - Dijeljenje objekata u nodejs između različitih instanci
Trebam dijeliti neke objekte ili kompletne module između različitih Node procesa ili klastera, pretražival sam mnoge blogove, ali nisam dobio zadovoljavajući odgovor.
Ako je to nemoguće učiniti, imate li ideja kako to nadgledati?
Odgovor #1
Ovisno o konfiguraciji, mogu smisliti tri načina.
- ako su usluge čvorni klasteri, brza baza podataka poput leveldb-a ili redis-a.
- ako su usluge na istom računalu, ali rade kao odvojeni procesi, onda redis ili unix socketi dobro rade.
- Ako su usluge raspoređene na više računala, tada scuttlebutt pruža dobro rješenje.
redis: Korištenje brze lokalne baze podataka poput redis-a za dijeljenje objekata između procesa na istom računalu uključuje korištenje jednostavnog put(key, data) i get(key), ali morate serijalizirati i deserializirati, vjerojatno koristeći JSON. Ne postoji formalna kontrola konkurentnosti, pa morate paziti da su sve promjene objekata dostupne svim klijentima. Jedan način je korištenje ugrađenog redis pub/sub za pokretanje kada se naprave promjene. Drugi način je korištenje optimističkog zaključavanja.
unix socketi Za projekte kojima je potrebno dijeliti objekte između različitih tehnologija, primjerice između C++ aplikacije i Nodea, unix socketi pružaju vrlo brzo rješenje. I dalje morate serijalizirati/deserijalizirati i kontrolirati konkurenciju, ali je brže od rješenja s bazom podataka i radi među različitim tehnologijama. Postoji Node projekt koji pomaže s nekim detaljima.
scuttlebutt Vjerojatno najbolji način za dijeljenje podataka između procesa na odvojenim računalima. Sa stranice scuttlebutt:
Scuttlebutt je namijenjen da se razgranava u razne modele podataka. Dva implementacije su pružena kao primjeri scuttlebutt/model i scuttlebutt/events...
Postoji i dobar bijeli papir koji se bavi znanošću iza korištenja replikacije za dijeljenje podataka o objektima.
Nadam se da vam ovo pruža neke izvedive alternative.
Odgovor #2
Vidio sam tvoj odgovor prije 4 ili 5 dana i odlučio sam napraviti nešto za upravo to
https://npmjs.com/package/webject
Ovaj paket omogućuje dijeljenje objekata preko weba
Objekt se može hostati putem serve ili povezati korištenjem connect
Dobivanje 2 funkcije poput
let {serve,connect}=require('webject')
Netko tko služi može biti poput
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)
Netko se povezuje može biti kao
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)
