Pull to refresh
5
0
Send message

Интересно, а при партиционировании тостинг только для основной таблицы будет или для каждой партиции отдельно?

Я, вообще, раньше думал, что Javascript хорошо знаю.

Но нет. Message приходит в виде незнакомого мне ReadableStream

Это сразу вылет в список недобросовестных исполнителей (или как он там правильно называется) и запрет на участие в тендерах, насколько я знаю. Ничего хорошего.

Особенно смешно читать по причине того, что nest использует как раз express.

кому «велосипед», а кому успешно и понятно уже год работающий компонент в составе продукта используемого ведущими сотовыми операторами.

я не пионер и не склонен писать «велосипеды», это была осознанная необходимость, в том числе и по безопасности.
незачем. ui, comet и различные сишные демоны — это отдельные распределенные компоненты продукта.
Released: Jun 26, 2012

по-моему наши как раз его и использовали (ребята тогда нашли только одну либу для этого), но автор на него давно забил. либа работает только с версией socket.io 0.9 и младше, а в 1.x они уже сильно поменяли протокол. поэтому и решили нативный брать, без наворотов.

я когда писал comet-сервер перебрал много разных компонентов — у каких-то на тот момент wss был криво реализован, кто-то не мог проксировать запросы по части урла на одном ip на upgrade

var httpProxy = require('http-proxy');
var proxy = httpProxy.createProxyServer({});

function proxyWebsocketResponse(req, res, head) {
    try {

        var pathname = url.parse(req.url).pathname;

        if ( (config.comet.websocket.proxy) && (pathname === config.comet.websocket.path) ) {
            var options = {
                target: 'ws://' + config.comet.websocket.host + ':' + config.comet.websocket.port + '/',
                ws: true
            };

            proxy.ws(req, res, head, options);

            proxy.on('error', function(e) {
                console.error('WebSocket error: ' + e.message);
                res.end();
            });

        } else {
            res.statusCode = 501;
            res.end('Not Implemented');
        }
    } catch (e) {
        console.error('Error: ' + e.message);
    }
}

httpServer.addListener('upgrade', proxyWebsocketResponse);


поэтому был выбран ws
у socket.io навернуто сверх нативного websocket очень много. мы его не используем по этой причине — есть сервисы на C#, которым тоже нужно общаться с сервером сообщений, и придется эмулировать «протокол» socket.io, и если они что-то поменяют — все просто может перестать работать. erinarios ws — это нативный websocket.

а так конечно socket.io очень удобный и в нем много чего из коробки есть.
я правильно понимаю, что вы на пыхпыхе написали именно ws-сервер?
По полученному классу «my-user__my-block-compact» сразу видно, что он склеен из двух кусков

это не то, о чем я написал.
да заради бога. это не отменяет смысла моей ремарки.
«Не сваливать все яйца (код) в одну корзину (файл/директорию).»

для хайлоада не очень здорово куча мелких файлов. на продакшне тогда лучше писать компилятор .js и .css в один файл.
бинго! вариант с прокси на Node.JS все-таки получился! надо было действительно проксировать на upgrade, а не на непосредственно запрос, спасибо.

а здесь принято поправить пост и дописать некий Update про третий вариант с кодом?

вот код прокси, если интересно:

app.js

var
    http = require('https'),
    https = require('https'),
    url = require('url'),
    httpProxy = require('http-proxy'),
    fs = require('fs');

var config = require('./config/config.json');

var proxy = httpProxy.createProxyServer({});

function proxyHttpResponse(req, res) {
    var hostname = req.headers.host.split(":")[0];
    var pathname = url.parse(req.url).pathname;

    try {
        var options = {
            target: 'http://' + config.http.host + ':' + config.http.port + '/'
        };
        proxy.web(req, res, options);
    } catch (e) {
        console.log('Error: ' + e.message);
    }
}

function proxyWebsocketResponse(req, res) {
    var hostname = req.headers.host.split(":")[0];
    var pathname = url.parse(req.url).pathname;

    if (pathname === '/ws/') {
        try {
            var options = {
                target: 'ws://' + config.websocket.host + ':' + config.websocket.port + '/',
                ws: true
            };
            proxy.ws(req, res, options);
        } catch (e) {
            console.log('Error: ' + e.message);
        }
    } else {
        res.statusCode = 501;
        res.end('Not Implemented');
    }
}


if (config.server.ssl) {
    var options = {
        port: config.server.sslPort,
        key: fs.readFileSync(config.server.sslKey),
        cert: fs.readFileSync(config.server.sslCert)
    };

    var server = https.createServer(options, proxyHttpResponse).listen(config.server.sslPort, function () {
        console.log('Proxy server (SSL) started on *:' + config.server.sslPort);
    });
} else {
    var server = http.createServer(proxyHttpResponse).listen(config.server.port, function () {
        console.log('Proxy server started on *:' + config.server.port);
    });
}

server.addListener('upgrade', proxyWebsocketResponse);

config.json

{
    "debug": true,

    "server": {
        "ssl": true,
        "port": 80,
        "sslPort": 443,
        "sslKey"  : "cert/server.key",
        "sslCert" : "cert/server.pem"
    },

    "http": {
        "port": 8080,
        "host": "127.0.0.1"
    },

    "websocket": {
        "port": 8095,
        "host": "127.0.0.1"
    }
}
я не совсем корректный пример кода привел в прокси-сервере, не до конца инвестигировал. у нас все-таки https-сервер, завтра попробую еще раз помучать тему прокси на Node.JS.

я видимо с http еще плюнул на эту идею и не стал дальше смотреть.
именно.

http-сервер его просто не обрабатывает (не ловит) почему-то.
в socket.io клиент стучится на http://address:port/socket.io

тут я должен бы пояснить, что в javascript инициализация вида

var ws = new Websocket('http://address:port/'); 

свалится с ошибкой, потому что надо делать

var ws = new Websocket('ws://address:port/);

а последнее не стартанет из-за того, что с секурной странички открытой по https нельзя открывать подключение к несекурному узлу с незащищенным протоколом, т.е.

var ws = new Websocket('wss://address:port/');

на момент апгрейда протокола, безопасное соединение уже установлено

я так понимаю, мы все-таки про прокси? так вот смотрите, если я основную страницу открыл грубо говоря https://127.0.0.1/ и стучусь в wss://127.0.0.1/wss/, то в бэкенде код прокси вида

var proxy = httpProxy.createProxyServer({});

http.createServer(function(req, res) {
    var hostname = req.headers.host.split(":")[0];
    var pathname = url.parse(req.url).pathname;

    var options = {};

    if (pathname == '/wss/') {
        options.target = 'ws://' + httpHost + ':' + wsPort + '/';
        options.ws = true;
        proxy.ws(req, res, options);
    } else {
        options.target = 'http://' + httpHost + ':' + httpPort + '/';
        proxy.web(req, res, options);

    }

}).listen(proxyPort);

в упор не видит WS запроса, потому что это все-таки не HTTP запрос, я так понимаю:

    GET /demo HTTP/1.1
    Upgrade: WebSocket
    Connection: Upgrade
    Sec-WebSocket-Key2: 4 @1 46546xW%0l 1 5
    Host: example.com
    Sec-WebSocket-Key1: 12998 5 Y3 1 .P00
    Origin: http://example.com
    WebSocket-Protocol: sample

я об этом вобщем и написал в статье…
а чем это изменит запрос подтверждения сертификата в нашем случае?

браузер молча срубит запрос, и все. или я чего не понимаю опять.

да, и по-моему есть некое недопонимание архитектуры. компонентов два.

первый — бэкенд Web UI (443)

второй — WSS Comet-сервер (4433) + HTTP сервер (8090) для внутренних запросов

и никак их на один порт не повесишь
кстати да. а сертификат собственного такого же CA прокатит в этом случае?
я его года четыре назад пробовал — падал постоянно и глючило его. может конечно что и изменилось.
1

Information

Rating
Does not participate
Registered
Activity