【发布时间】: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