Эффективное использование WebSocket и DataTables - PullRequest
0 голосов
/ 14 января 2019

У меня запущен клиент WebSocket, который получает потоки данных из Binance WebSocket API. Клиент получает доступ к потоку и обновляет Datatable с данными потока. Но из-за большого объема данных, обновляемых в таблицу, DataTable очень медленно работает. И из-за объема памяти, используемой WebSocket, он вызывает перезагрузку страницы, если она остается открытой слишком долго

let trackedStreams = [];
var table = $('#example').DataTable( {
                            columns: [
                                { title: "Pair", data: "pair"  },
                                { title: "Last Price", data: "lprice" },
                                { title: "24h Change", data: "24change" },
                                { title: "24h High", data: "24high" },
                                { title: "24h Low", data: "24low" }
                            ]
                            });

let ws = new WebSocket("wss://stream.binance.com:9443/ws/!ticker@arr");

ws.onopen = function() {
    console.log("Binance connected...");
};

ws.onmessage = function(evt) {
    try {
        let msgs = JSON.parse(evt.data);
        if (Array.isArray(msgs)) {
            for (let msg of msgs) {
                handleMessage(msg);
            }
        } else {
            handleMessage(msgs)
        }
    } catch (e) {
        console.log('Unknown message: ', e);
    }
}
ws.onclose = function() {
    console.log("Binance disconnected");
}

function handleMessage(msg) {
    const stream = msg.s;
    if (trackedStreams.indexOf(stream) === -1) {
    //if symbol doesnt exist in array
        var tmpArray = [msg.s, msg.c, msg.P, msg.h, msg.l];
        trackedStreams.push(stream);

        table.rows.add([ {
            "pair":         msg.s,
            "lprice":       msg.c,
            "24change":     msg.P,
            "24high":       msg.h,
            "24low":        msg.l
        } ])
        .draw()
        .nodes()
        .to$()
        .addClass( msg.s );

} else {
    var selectedRow = table.rows('.' + msg.s);
    console.log(selectedRow);
    table.row( selectedRow ).data( {
        "pair":         msg.s,
        "lprice":       msg.c,
        "24change":     msg.P,
        "24high":       msg.h,
        "24low":        msg.l
    } ).draw();  
}

У меня вопрос: есть ли лучший подход к этому методу, чтобы сделать его более эффективным, сделать DataTables более отзывчивыми и убедиться, что WebSocket не использует слишком много памяти?

...