Проблема производительности сервера сигнализации: Python против NodeJS - PullRequest
0 голосов
/ 09 января 2019

Я разрабатываю приложение WebRTC, которое требует конкретной реализации сервера сигнализации. Первоначально я разрабатывал сервер в NodeJS, но затем решил перейти на Python (используя Django Channels AsyncWebsocketConsumer для связи с клиентами через Websockets). После миграции я использовал инструмент для тестирования производительности WebSocket Thor, чтобы сравнить обе реализации, и вот результаты (5000 соединений websocket, каждое из которых отправляет 1000 сообщений):

Python (каналы Django) Реализация:

class SignallingConsumer(AsyncWebsocketConsumer):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.peer = None
        self.signal = None
        self.is_peer_registered = False

    async def connect(self):
        await self.accept()

    async def disconnect(self, close_code):
        pass

    async def receive(self, text_data=None, bytes_data=None):
        pass

Реализация NodeJS:

method.start = function () {
    this.webServer = this.createWebServer();

    this.webServer.listen(this.config.port, function (){
        console.log("Web server is listening");
    });

    this.socket = this.createWebSocket(this.webServer);
    this.socket.on('connection', function(ws) {

        var pingsCompleted = 0;

        ws.on('message', function(evt) {

        }.bind(this));

        // Set out ping/pong mechanism
        var pingInterval = setInterval(function() {
            if(pingsCompleted > 2) {
                ws.close();
            } 
            else {
                ws.ping();
                pingsCompleted++;
            }
        }.bind(this), config.pingPeriod);

        ws.on('pong', function(evt) {
            pingsCompleted = 0;
        }.bind(this));

        ws.on('close', function(evt) {

        }.bind(this));

Python (каналы Джанго) Результаты:

Online               30792 milliseconds
Time taken           30792 milliseconds
Connected            3714
Disconnected         0
Failed               1286
Total transferred    4.43MB
Total received       525.91kB

Durations (ms):
                     min     mean     stddev  median max
Handshaking          4795    11410      5517   10824 23923
Latency              NaN     NaN         NaN     NaN NaN

NodeJS Результаты:

Online               41307 milliseconds
Time taken           41307 milliseconds
Connected            4051
Disconnected         0
Failed               949
Total transferred    952.72kB
Total received       693.4kB

Durations (ms):
                     min     mean     stddev  median max
Handshaking          2       1124       1044     860 5200
Latency              NaN     NaN         NaN     NaN NaN

Так что, хотя количество неудачных соединений более или менее одинаково в обеих реализациях, продолжительность согласования рукопожатия в каналах Django намного медленнее, чем в NodeJS, что заставило меня пересмотреть миграцию для Python.

Так эти результаты нормальны? В таком случае лучше использовать NodeJS?

1 Ответ

0 голосов
/ 14 мая 2019

NodeJS выполняет неблокирующий ввод / вывод на довольно низком уровне и поддерживается V8, который выполняет довольно хорошую оптимизацию JIT.

Каналы Django - это высокоуровневая конструкция, и производительность также будет сильно зависеть от реализации Python. CPython, помимо прочего, напрямую интерпретирует байт-код и использует глобальную блокировку выполнения.

Я ожидаю, что NodeJS будет работать лучше, чем Django на CPython. Однако, если вы предпочитаете Django по другим причинам, вы можете сравнить производительность на PyPy, IronPython и Jython.

...