【问题标题】:Signalling server performance issue: Python vs NodeJS信令服务器性能问题:Python vs NodeJS
【发布时间】:2019-01-09 15:11:14
【问题描述】:

我正在开发一个需要特定信令服务器实现的 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(Django 频道)结果:

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 Channels 中握手协商的持续时间比 NodeJS 慢得多,这让我重新考虑了 Python 的迁移。

那么这些结果正常吗?在这种情况下使用 NodeJS 会更好吗?

【问题讨论】:

  • 我也在使用 django 频道,我对这些结果很感兴趣。差异看起来很大,我也会寻找社区反馈。
  • 您能否详细说明“这需要特定的信令服务器实现”。您是否正在寻找一些特殊的特征?
  • 嗨@yumoji,服务器除了在WebRTC交互式连接建立期间充当中间通道外,还必须实现一些特定的业务逻辑。例如,此业务逻辑包括根据专有证书对客户端进行身份验证,并确定给定客户端可以访问哪些客户端。
  • 为什么两个实现之间传输的数据量会如此不同?另外,关闭套接字后不要忘记clearInterval(pingInterval)
  • 我不知道,这真的很奇怪,但是两个实现的雷神测试是相同的:thor --amount 5000 --messages 1000 ws://localhost:8000我>

标签: python node.js django webrtc django-channels


【解决方案1】:

NodeJS 的非阻塞 I/O 水平非常低,并由 V8 提供支持,它可以很好地进行 JIT 优化。

Django 通道是一个更高级别的结构,性能也很大程度上取决于 Python 实现。除其他外,CPython 直接解释字节码并使用全局执行锁。

我希望 NodeJS 在 CPython 上的性能优于 Django。但是,如果您出于其他原因更喜欢 Django,则可能需要比较 PyPy、IronPython 和 Jython 的性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 2018-10-05
    • 2017-06-17
    • 1970-01-01
    • 2011-08-19
    • 2016-08-20
    • 2017-10-27
    相关资源
    最近更新 更多