Das Problem
Mehrmals am Tag kommt es bei etwa 50 von etwa 130 Online-Benutzern zu unerwarteten Verbindungsabbrüchen von Twilio. Die Verbindungsabbrüche treten plötzlich auf und Benutzer verlieren ihre Verbindung über das Twilio Voice SDK. Diese Unterbrechungen dauern etwa eine Minute und hören dann auf, ohne dass ein erkennbares Zeitmuster erkennbar ist. Sie treten morgens tendenziell häufiger auf.
Zwei andere parallele Websocket-Verbindungen bleiben jedoch stabil:
Eine SignalR-Verbindung, die unsere Geschäftslogik verwaltet .
Eine Verbindung zu Twilio TaskRouter.
Keine dieser Verbindungen ist betroffen, wenn das Voice SDK getrennt wird.
Wir verwenden diese Methoden und Konfigurationen seit über drei Jahren, ohne dass ihnen etwas begegnet ist so ein ernstes Problem mit Verbindungsabbrüchen. Vor kurzem haben wir viele Benutzer von Twilio Voice SDK V1 auf V2 migriert, aber das Problem besteht weiterhin für beide Versionen.
Jeder Benutzer arbeitet von seinem eigenen PC und Arbeitsgerät aus. Während sie bei 99 % ihrer Anrufe keine Probleme haben, treten diese Verbindungsabbrüche bei bestimmten Anrufen auf.
Hier ist der Code:
Code: Select all
let deviceParams = {
codecPreferences: ["opus", "pcmu"],
closeProtection: false,
fakeLocalDTMF: true,
audioConstraints: {
mandatory: {
googAutoGainControl: false
}
},
};
if ($scope.model.isUsingNewTwilioLibraryVersion) {
deviceParams.enableImprovedSignalingErrorPrecision = true;
deviceParams.maxCallSignalingTimeoutMs = 6000;
}
$scope.model.phoneCapabilityToken = '' // this comes from the backend
// V1 implementation
$scope.twilio.device = twilioDeviceManager.getDeviceV1();
$scope.twilio.device.on("ready", deviceOnReady);
$scope.twilio.device.on("error", deviceOnError);
$scope.twilio.device.on("connect", deviceOnConnect);
$scope.twilio.device.on("disconnect", deviceOnDisconnect);
$scope.twilio.device.on("cancel", deviceOnCancel);
$scope.twilio.device.on("offline", deviceOnOffline);
$scope.twilio.device.on("incoming", deviceOnIncoming);
$scope.twilio.device.setup($scope.model.phoneCapabilityToken, deviceParams);
// V2 implementation
$scope.twilio.device = twilioDeviceManager.getDeviceV2($scope.model.phoneCapabilityToken, deviceParams);
$scope.twilio.device.on("registered", deviceOnRegistered);
$scope.twilio.device.on("registering", deviceOnRegistering);
$scope.twilio.device.on("unregistered", deviceOnUnregistered);
$scope.twilio.device.on("error", deviceOnError);
$scope.twilio.device.on("destroyed", deviceOnDestroyed);
$scope.twilio.device.on("incoming", deviceOnIncoming);
$scope.twilio.device.on('tokenWillExpire', deviceOnTokenWillExpire)
$scope.twilio.device.register();
// making a call
let targetPhoneNumber = '1231233441'
let connectParams = { targetPhoneNumber: '' };
// V1
$scope.twilio.device.connect(connectParams);
// V2
this.twilioDevice.connect({ params: connectParams })
.then((call) => {
call.on('accept', c => {
$scope.deviceOnConnectCommon(c)
})
})
.catch((error) => {
console.log(error);
})
Hier sind die Protokolle, die wir während der Verbindungsabbrüche vom Twilio Voice SDK erfasst haben:< /p>
Code: Select all
[2025-01-10 09:43:56.667] [info] device.on.connect
[2025-01-10 09:44:00.683] [info] connection.warning high-packet-loss
[2025-01-10 09:44:03.679] [info] connection.warning high-packets-lost-fraction
[2025-01-10 09:44:08.688] [info] connection.warning low-bytes-received
[2025-01-10 09:44:11.974] [info] connection.warning ice-connectivity-lost
[2025-01-10 09:44:11.982] [info] connection.reconnecting ConnectionError: ConnectionError (53405): Media connection failed.
at ConnectionError.TwilioError [as constructor] (:1:158062)
at new ConnectionError (:1:150484)
at Call._this._onMediaFailure (:1:46317)
at Call._this._mediaHandler.ondisconnected (:1:56684)
at PeerConnection._onMediaConnectionStateChange (:1:216760)
at pc.oniceconnectionstatechange (:1:224502)
[2025-01-10 09:44:12.679] [info] connection.warning-cleared high-packets-lost-fraction
[2025-01-10 09:44:13.460] [info] connection.reconnecting ConnectionDisconnected: ConnectionDisconnected (53001): Raised whenever the signaling connection is unexpectedly disconnected.
at ConnectionDisconnected.TwilioError [as constructor] (:1:158062)
at new ConnectionDisconnected (:1:146883)
at Call._this._onTransportClose (:1:50890)
at emitNone (:1:282216)
at PStream.emit (:1:283662)
at PStream._handleTransportClose (:1:185601)
at emitNone (:1:282216)
at WSTransport.emit (:1:283662)
at WSTransport._closeSocket (:1:275290)
at :1:277053
[2025-01-10 09:44:13.462] [info] device.on.unregistered
[2025-01-10 09:44:15.680] [info] connection.warning-cleared high-packet-loss
[2025-01-10 09:44:18.557] [info] connection.reconnecting ConnectionDisconnected: ConnectionDisconnected (53001): Raised whenever the signaling connection is unexpectedly disconnected.
at ConnectionDisconnected.TwilioError [as constructor] (:1:158062)
at new ConnectionDisconnected (:1:146883)
at Call._this._onTransportClose (:1:50890)
at emitNone (:1:282216)
at PStream.emit (:1:283662)
at PStream._handleTransportClose (:1:185601)
at emitNone (:1:282216)
at WSTransport.emit (:1:283662)
at WSTransport._closeSocket (:1:275290)
at :1:276292
[2025-01-10 09:44:18.748] [info] workerOnActivityUpdate Offline
[2025-01-10 09:44:23.679] [info] connection.warning constant-audio-input-level
[2025-01-10 09:44:23.763] [info] connection.reconnecting ConnectionDisconnected: ConnectionDisconnected (53001): Raised whenever the signaling connection is unexpectedly disconnected.
at ConnectionDisconnected.TwilioError [as constructor] (:1:158062)
at new ConnectionDisconnected (:1:146883)
at Call._this._onTransportClose (:1:50890)
at emitNone (:1:282216)
at PStream.emit (:1:283662)
at PStream._handleTransportClose (:1:185601)
at emitNone (:1:282216)
at WSTransport.emit (:1:283662)
at WSTransport._closeSocket (:1:275290)
at :1:276292
[2025-01-10 09:44:23.810] [info] device.on.error {
code: 31009,
message: 'TransportError (31009): No transport available to send or receive messages'
}
[2025-01-10 09:44:27.061] [info] device.on.error {
code: 31009,
message: 'TransportError (31009): No transport available to send or receive messages'
}
[2025-01-10 09:44:27.066] [info] connection.warning ice-connectivity-lost
[2025-01-10 09:44:28.681] [info] connection.warning-cleared constant-audio-input-level
[2025-01-10 09:44:29.302] [info] connection.reconnecting ConnectionDisconnected: ConnectionDisconnected (53001): Raised whenever the signaling connection is unexpectedly disconnected.
at ConnectionDisconnected.TwilioError [as constructor] (:1:158062)
at new ConnectionDisconnected (:1:146883)
at Call._this._onTransportClose (:1:50890)
at emitNone (:1:282216)
at PStream.emit (:1:283662)
at PStream._handleTransportClose (:1:185601)
at emitNone (:1:282216)
at WSTransport.emit (:1:283662)
at WSTransport._closeSocket (:1:275290)
at :1:276292
[2025-01-10 09:44:34.567] [info] connection.reconnecting ConnectionDisconnected: ConnectionDisconnected (53001): Raised whenever the signaling connection is unexpectedly disconnected.
at ConnectionDisconnected.TwilioError [as constructor] (:1:158062)
at new ConnectionDisconnected (:1:146883)
at Call._this._onTransportClose (:1:50890)
at emitNone (:1:282216)
at PStream.emit (:1:283662)
at PStream._handleTransportClose (:1:185601)
at emitNone (:1:282216)
at WSTransport.emit (:1:283662)
at WSTransport._closeSocket (:1:275290)
at :1:276292
[2025-01-10 09:44:38.799] [info] device.on.error {
code: 20101,
message: 'AccessTokenInvalid (20101): Twilio was unable to validate your Access Token'
}
Wir glauben, dass der AccessTokenInvalid-Fehler nicht korrekt ist. Wir generieren Token mit einer Gültigkeit von 10 Stunden und diese Verbindungsabbrüche erfolgen innerhalb einer Stunde nach Beginn der Sitzung.
Benutzer verlieren während dieser Verbindungsabbrüche nicht ihre Verbindung zu unserem Server oder dem Twilio TaskRouter .
Die Servermetriken zeigen keine Leistungsprobleme (CPU, Speicher, Datenbankleistung usw.).
Benutzerdemografie
Alle betroffenen Benutzer sind von den Philippinen.
Sie stellen eine Verbindung zum Twilio-Edge in Singapur her.
Soweit wir wissen, teilen sie sich alle denselben ISP (allerdings wir sind nicht 100 % sicher).
Die Anrufe werden mit Twilio-Konferenzen verbunden, die in der Region US1 erstellt wurden.
Umgebungsdetails< /strong>
Die Anwendung läuft sowohl als ausführbare Datei, erstellt mit Electron und in Webbrowsern. Das Problem tritt in beiden Umgebungen auf.
Vor dem Auftreten dieses Problems wurden keine Änderungen an der Infrastruktur oder am Code vorgenommen.
Das Problem tritt seit etwa einem Jahr auf Woche.
Frage
Hat jemand ein ähnliches Problem mit der Trennung des Twilio Voice SDK in Massenwellen erlebt? Könnte dies mit Twilio-Edge-Standorten oder ISP-bezogenen Problemen zusammenhängen? Für Hinweise zur Diagnose und Lösung dieses Problems wären wir sehr dankbar.
Wir haben unsere Infrastruktur, Serverleistung und Twilio-Einrichtung überprüft. Es wurden keine aktuellen Änderungen vorgenommen und alle Messwerte sind stabil. Wir haben erwartet, dass Benutzer ohne Unterbrechungen mit dem Twilio Voice SDK verbunden bleiben. Wir haben jedoch häufig Massenabbrüche festgestellt, auch wenn andere Verbindungen (SignalR, TaskRouter) davon nicht betroffen sind. Wir erwarteten eine ähnliche Stabilität wie seit über drei Jahren.
Wir sind auch von Twilio Voice SDK V1 auf V2 migriert, aber das Problem blieb bestehen.
Kann ich etwas tun? Änderungen an meinem Code vornehmen, um dies zu verbessern?