Проблема производительности сервера сигнализации: Python против NodeJS
Я разрабатываю приложение WebRTC, которое требует конкретной реализации сервера сигнализации. Первоначально я разрабатывал сервер в NodeJS, но затем решил перейти на Python (используя Django Channels AsyncWebsocketConsumer для связи с клиентами через Websockets). После миграции я использовал инструмент для тестирования производительности WebSocket Thor, чтобы сравнить обе реализации, и вот результаты (5000 соединений websocket, каждое из которых отправляет 1000 сообщений):
Реализация Python (Django Channels):
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?
0 ответов
NodeJS выполняет неблокирующий ввод-вывод на довольно низком уровне и поддерживается V8, который обеспечивает довольно хорошую оптимизацию JIT.
Каналы Django - это конструкция более высокого уровня, и производительность также будет сильно зависеть от реализации Python. CPython, помимо прочего, напрямую интерпретирует байт-код и использует глобальную блокировку выполнения.
Я ожидал, что NodeJS будет работать лучше, чем Django на CPython. Однако, если вы предпочитаете Django по другим причинам, вы можете сравнить производительность PyPy, IronPython и Jython.