[nodejs] Data in het geheugen laden?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

- Ariën -
Beheerder

- Ariën -

17/02/2019 22:39:02
Quote Anchor link
Ik ben niet echt heel bekend met NodeJS, maar ik ben een poosje geleden een projectje gestart om een hoop treinlocaties via ZeroMQ uit een datastroom te halen.
Werkt goed!

Echter als ik het script aanroep op www.mijnsite.nl:8082, moet hij eerst wachten totdat er data binnenstroomt vanuit de stroom, dus maximaal elke tien seconden wachten voordat de site zich laadt.

Kort gezegd:
Kan dit niet eenvoudig in het geheugen worden bewaard bij het aanroepen van het script in de browser, zodat ik altijd de laatste versie heb, zonder wachttijden? Ik lees veel over caching i.c.m. nodejs maar weet niet wat nou de beste oplossing voor dit geval is.


Andere oplossingen die ik bedacht heb:
- Elke 10 seconden opslaan als bestand lijkt me ook een overdreven
- Redis kan mogelijk ook om het te cachen, maar als het simpel kan is het mooi meegenomen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
var http = require('http');
var zlib = require("zlib");
var zmq = require('zmq')
    , socket = zmq.socket('sub')
    , endpoint = 'tcp://www.server.nl:8765';

// create webserver
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/xml'});

// Add the event handler before we connect
socket.on('message', function () {
    msg = Array.prototype.slice.call(arguments)

    address = msg[0].toString()
    console.log(address)
    var contents = Buffer.concat(msg.slice(1));
    console.log(msg)
    console.log(msg.slice(1))
    console.log(contents)

// msg[1] i.p.v contents werkt wel
    zlib.gunzip(contents, (err, buffer) => {
        if (err) {
            console.error(err);
            return;
        }
        console.log(buffer.toString());
        res.end(buffer.toString());
    });

    });
socket.connect(endpoint);
// subscribe to all of the messages
socket.subscribe('/RIG/NStreinpositiesInterface5');

//socket.setsockopt(zmq.ZMQ_SUBSCRIBE, new Buffer(''));

}).listen(8082);


Voor wie interesse heeft, de data komt bij het NDOV-loket vandaan!
Gewijzigd op 17/02/2019 22:44:53 door - Ariën -
 
PHP hulp

PHP hulp

26/05/2019 16:17:00
 
- Ariën -
Beheerder

- Ariën -

22/02/2019 08:16:26
Quote Anchor link
Ik kreeg van een niet forumlid dit toegestuurd... ;)

Quote:
Afhankelijk van de hoeveelheid werkgeheugen die je toewijst aan je NodeJS proces, kan je data in je werkgeheugen zetten door gewoon een normale javascript object te maken boven aan je .js bestand door bijvoorbeeld dit te doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
var data = {};

gezien NDOV berichtjes niet heel groot zijn kan je deze gewoon in je werkgeheugen plaatsen, en dan eens in de zoveel tijd in een bestand op te slaan. Dit kan je bijvoorbeeld doen om bovenaan je script een variabele aan te maken met een INT erin, die INT op te laten tellen bij elk bericht en dan bijvoorbeeld bij elke 30 berichten het op te slaan in een bestand:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
var fs = require('fs');
fs.writeFile('data.json"', JSON.stringify(data), 'utf8');

(Wel even het bestand data.json maken)

en wanneer je via een HTTP request je data wil ophalen doe je dat zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
fs.readFile('data', 'utf8', function(err, data){
if (err){
console.log(err);
} else {
data = JSON.parse(data);
}
}});


En dat ga ik dus proberen, blijkbaar werkt het wel met caching met een bestand. Maar dat elke 10 seconden aanpassen lijkt wel mee te vallen.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.