Loading...

信令服务异常后如何检测和重新呼叫?

问题描述

小鱼易连Web SDK及UI MeetingKit具备强大的异常处理机制:

  1. 媒体服务异常无感迁会:保障音视频通话稳定性;
  2. TCP WebSocket异常重连:支持多次无感知重连,自动恢复;
  3. 媒体UDP服务异常重连:保障音视频数据正常传输,自动恢复;

但在分区云环境下,若信令服务器异常,SDK暂不支持无感重新呼叫,需业务集成侧进行处理以确保会议正常。

解决方法

通过监听关键事件和合理的重连逻辑,确保在信令服务器异常时正常退会并重新加入会议。

1、监听信令服务异常断开(新增)

通过监听 socket-close 事件,捕获SDK与信令服务异常断开的提醒并记录重连次数:

// 初始化重新呼叫的次数
let retryCountRef = 0;

client.on('socket-close', (e) => {
// 监听WebSocket异常断开,并开始缓存重新呼叫的次数
retryCountRef += 1;
})

2、监听退会消息(修改)

通过监听 disconnected 消息,获取强制退会的消息提醒,并判断是否因服务异常(code: XYSDK:950114)导致的退会;

提示

SDK上报退会消息先于Socket异常断开消息,此时socket-close监听事件已经被移除,因此延迟调用退会逻辑,保证消息正常处理;

// 退会消息监听,此消息很重要,内部的会议挂断都是通过此消息通知
client.on('disconnected', (e: IStatus) => {
console.log('demo get disconnected message: ', e);

const code = e?.code;
const showMessage = (e.detail && e.detail.message) || '呼叫异常,请稍后重试';

if (code === 'XYSDK:950114') {
// SDK上报退会消息先于Socket异常断开消息,此时socket-close监听事件已经被移除,因此延迟调用退会逻辑,保证消息正常处理;
setTimeout(() => {
disconnected(showMessage);
}, 200);
} else {
// 正常退会逻辑
disconnected(showMessage);
}
});

3、退会逻辑处理

退会时判断重连次数,限制最多尝试重连2次。每次重连前增加3秒延迟,确保提示信息显示完成后再重新呼叫;

// 挂断会议
const disconnected = (msg = '') => {
// 退会Message消息弹窗提醒
message.info(msg);

// 业务逻辑已有代码,执行退会的函数处理
stop();

// 新增逻辑:最多重连2次,超过后重置状态不再重连
if (retryCountRef > 0 && retryCountRef <= 2) {
message.info('异常退出,重新入会');

// 延迟3s后,重新发起呼叫
setTimeout(() => {
// 加入会议,业务侧已有逻辑
join();
}, 3000);
} else if (retryCountRef > 2) {
console.log('超过重试次数,直接退会即可');
retryCountRef = 0;
}
};

4、重置重连状态

通过监听 call-status 消息,获取是否正常加入会议,并重置重连次数状态;

// 呼叫状态
client.on('call-status', (e: IStatus) => {
// XYSDK:950518 入会成功
// XYSDK:950519 正在呼叫中
const { code, msg } = e || {};

if (code === 'XYSDK:950518') {
message.success(msg);

// 新增逻辑:呼叫成功后,重置重连的次数
retryCountRef = 0;
} else if (code === 'XYSDK:950519') {
message.info(msg);
} else {
disconnected(msg);
}
});

完成上述处理后,当信令服务器异常时,SDK将通过事件上报异常,业务侧可及时处理退会并重新呼叫,确保用户体验。

意见反馈