Gestione di massicci aggiornamenti con accesso alle risorse

3

Ho un certo numero di server dati che stanno trasferendo dati su un server principale come in questo tipo di architettura:

Questipuntidati(pointsinbreve)vengonoaggiornaticasualmentedaciascunserver.Sulservercisonoaltripuntidatidefinitidall'utente(chiamatiTags)chesonoespressionibasatesuunoopiùpoints.IlserverhapotenzialmentecentinaiadimigliaiadiquestiTags.

Adesempio:

Points={DataPointA,DataPointB,DataPointC}Tags={DataPointA*1.8+32,DataPointA*DataPointC/2,DataPointC*DataPointC}

Ilback-enddelserverèscrittoinC#ehodecisodiusareJavaScriptperconsentireall'utentedidefinireleespressionichecostituisconoivaloridiTag(principalmenteperchél'altrapartediquestoèunavisualizzazionebasatasulwebevogliosolounlinguaggiodiscripting).

problema

NondesiderocreareunsingolomotoreJavaScriptperogniTagpoichéciòrichiederebbeunusointensivodellamemoria.HoselezionatoJIntperilmotoreJavaScript(deveesseremono-compatibileinmodocheV8siafuori)epossocrearevariabili(Tags)eassegnarevalori(Points)manonthread-safe.QuindidovreiaspettarefinoalcompletamentodiunTagprimadiiniziarneunaltro.Questoèuncollodibottigliadelleprestazioni.

Quindihopensatodicreareunpooldimotoriepassareimotorinonappenasonodisponibili,ilTaglobloccamentreloutilizzaepoilorilasciaquandoèfinito.Nonsonosicurochequestosial'approcciomiglioreperchéduranteimieitesthoriscontratocheilsingolomotoreècircail25%piùveloce(oforseèlamiaimplementazione).

Comeaffronterestiquestoproblema?Nonèpossibiledelegareicalcoliaiserverdidatiperchéleespressionipossonoutilizzaretagdapiùservereciòrichiederebbecheiserversiparlinoreciprocamenteounoscambiobidirezionaleconunrepositorysulserverprincipale.

Eccoalcunicodicisedesideriguardarciattraverso:

Esempio minimo senza dipendenze

Esempio minimo con requisito JInt

Nota sul codice: qui c'è un livello di riferimento indiretto con l'uso di Variable , questo perché i "nomi" del punto di dati sono in realtà GUID e un GUID non lo rende un nome di variabile valido (o valido), quindi devono essere sottoposti a aliasing in qualcosa che è un nome di variabile valido.

    
posta Ron Beyer 16.06.2015 - 17:23
fonte

1 risposta

1

Vorrei seguire un percorso diverso:

  1. Imposta un servizio basato su Node.js sul mainframe.
  2. Sistema di accodamento della messa in servizio. (0MQ, RabbitMQ)
  3. Usa il tuo Node.js per leggere dalla coda ed elaborare.
  4. Restituisci i risultati al tuo processo principale anche attraverso la coda.

Sistema completamente asincrono e indipendente.

Vantaggi: Node.js può gestire simultaneamente milioni di connessioni. È single threaded ma asynchronious.

Per salire di livello, genera tutte le istanze di Node.js necessarie e mettile dietro un bilanciatore del carico (dubito che avrai comunque bisogno di questo).

    
risposta data 23.06.2015 - 01:22
fonte

Leggi altre domande sui tag