在线咨询
专属客服在线解答,提供专业解决方案
声网 AI 助手
您的专属 AI 伙伴,开启全新搜索体验

云端录制异常:如何解决服务器断网、进程被杀问题?

实时音视频通信中,服务器断网或进程被杀是常见的故障情况,这些故障可能会导致录制服务中断,从而影响用户体验。声网的云端录制功能通过高可用机制来确保录制服务的连续性和稳定性。

本文将详细介绍云端录制在处理服务器断网和进程被杀问题时的具体机制和流程。

 

1. 高可用机制

当出现服务器断网或进程被杀的情况时,云端录制会自动切换到新的服务器,并在90秒内恢复录制服务。具体步骤如下:

1.1 故障检测

云端录制系统会持续监控服务器的状态。一旦检测到服务器断网或进程被杀,系统会立即启动故障处理机制。故障检测是高可用机制的第一步,它确保了系统能够及时发现并响应故障。

  • 监测方式:系统通过心跳检测、网络连接状态检查等手段,实时监控服务器的运行状况。
  • 响应时间:一旦检测到故障,系统会在几秒钟内启动故障处理流程。

1.2 自动迁移

系统会在90秒内将录制任务迁移到新的服务器上,以确保录制服务的连续性。自动迁移是高可用机制的核心部分,它确保了即使在服务器发生故障的情况下,录制服务也能继续进行。

  • 迁移过程
    • 选择新服务器:系统会根据当前资源情况,选择一个合适的备用服务器。
    • 数据同步:将当前录制任务的数据(如 M3U8 文件、TS/WebM 文件等)同步到新的服务器。
    • 任务迁移:将录制任务从旧服务器迁移到新服务器,并重新启动录制服务。
  • 迁移时间:整个迁移过程通常在90秒内完成,确保了录制服务的快速恢复。

1.3 生成新的 M3U8 文件

迁移后的录制任务会生成新的 M3U8 文件,包含录制服务恢复之后的切片文件索引信息。新生成的 M3U8 文件名会增加 bak 和 <n> 前缀,其中 n 表示高可用自动迁移的次数(从0开始)。

  • 文件名变化
    • 初始 M3U8 文件名:在合流模式下,M3U8 文件的文件名为 <sid>_<cname>.m3u8
    • 迁移后的 M3U8 文件名:第一次启用高可用机制后,会生成新的 M3U8 文件,文件名为 bak0_<sid>_<cname>.m3u8。如果再次发生迁移,文件名会依次变为 bak1_<sid>_<cname>.m3u8bak2_<sid>_<cname>.m3u8 等。
  • 文件内容:新的 M3U8 文件包含了录制服务恢复之后的切片文件索引信息,确保播放器能够正确地获取并播放最新的录制内容。

 

2. M3U8 文件名变化

M3U8 文件名的变化是高可用机制的重要组成部分,它确保了每次迁移后的录制文件可以被正确识别和播放。

2.1 初始 M3U8 文件名

在合流模式下,M3U8 文件的文件名为 <sid>_<cname>.m3u8,其中:

  • <sid>:录制 ID
  • <cname>:频道名

例如,初始 M3U8 文件名为 123456_channel.m3u8

2.2 迁移后的 M3U8 文件名

第一次启用高可用机制后,会生成新的 M3U8 文件,文件名为 bak0_<sid>_<cname>.m3u8。如果再次发生迁移,文件名会依次变为 bak1_<sid>_<cname>.m3u8bak2_<sid>_<cname>.m3u8 等。

例如,假设一个录制任务的初始 M3U8 文件名为 123456_channel.m3u8

  • 第一次迁移后,新的 M3U8 文件名为 bak0_123456_channel.m3u8
  • 第二次迁移后,新的 M3U8 文件名为 bak1_123456_channel.m3u8
  • 第三次迁移后,新的 M3U8 文件名为 bak2_123456_channel.m3u8

这种命名规则确保了每次迁移后的 M3U8 文件可以被正确识别和使用。

 

3. TS/WebM 文件名变化

除了 M3U8 文件名的变化外,每次高可用机制启用后,生成的 TS/WebM 文件名也会发生变化。具体变化如下:

3.1 初始 TS/WebM 文件名

在正常情况下,TS/WebM 文件的文件名为 <sid>_<cname>_<uid>_video_<timestamp>.ts 或 <sid>_<cname>_<uid>_video_<timestamp>.webm,其中:

  • <sid>:录制 ID
  • <cname>:频道名
  • <uid>:用户 ID
  • <timestamp>:时间戳

例如,初始 TS 文件名为 123456_channel_123_video_1609459200000.ts

3.2 迁移后的 TS/WebM 文件名

第一次启用高可用机制后,生成的 TS/WebM 文件名会增加 bak0_ 前缀。如果再次发生迁移,文件名会依次变为 bak1_bak2_ 等。

例如,假设一个录制任务的初始 TS 文件名为 123456_channel_123_video_1609459200000.ts

  • 第一次迁移后,新的 TS 文件名为 bak0_123456_channel_123_video_1609459200000.ts
  • 第二次迁移后,新的 TS 文件名为 bak1_123456_channel_123_video_1609459200000.ts
  • 第三次迁移后,新的 TS 文件名为 bak2_123456_channel_123_video_1609459200000.ts

这种命名规则确保了每次迁移后的 TS/WebM 文件可以被正确识别和使用。

 

4. 迁移次数限制

每个录制任务的高可用自动迁移次数最多为3次。当第4次自动迁移发生时,该录制任务会被终止。这是为了防止因频繁迁移导致的录制服务不稳定。

  • 迁移次数:每次迁移都会生成一个新的 M3U8 文件和相应的 TS/WebM 文件。
  • 终止条件:当第4次迁移发生时,系统会终止该录制任务,并不再尝试恢复。

 

5. 具体示例

假设一个录制任务的初始 M3U8 文件名为 123456_channel.m3u8,初始 TS 文件名为 123456_channel_123_video_1609459200000.ts

  • 第一次迁移
    • 新的 M3U8 文件名为 bak0_123456_channel.m3u8
    • 新的 TS 文件名为 bak0_123456_channel_123_video_1609459200000.ts
  • 第二次迁移
    • 新的 M3U8 文件名为 bak1_123456_channel.m3u8
    • 新的 TS 文件名为 bak1_123456_channel_123_video_1609459200000.ts
  • 第三次迁移
    • 新的 M3U8 文件名为 bak2_123456_channel.m3u8
    • 新的 TS 文件名为 bak2_123456_channel_123_video_1609459200000.ts
  • 第四次迁移
    • 录制任务会被终止,不再生成新的 M3U8 和 TS 文件。

 

6. 故障处理中心

故障处理中心是云端录制系统中的一个重要组件,它负责在90秒内判断故障原因,并采取相应的应对措施。故障处理中心的主要功能包括:

  • 故障检测:实时监控服务器状态,检测断网或进程被杀等故障。
  • 自动迁移:在检测到故障后,自动将录制任务迁移到新的服务器。
  • 生成新文件:生成新的 M3U8 文件和相应的 TS/WebM 文件,确保录制服务的连续性。

 

7. API 调用

在高可用机制启动后,部分 API 调用可能会受到影响。以下是常见的 API 调用及其行为:

7.1 query 接口

通过调用 query 接口可以获取当前录制任务的状态,包括是否已经恢复。

  • 正常情况:如果录制任务正常运行,query 接口会返回当前录制任务的详细信息,包括录制状态、文件名等。
  • 迁移过程中:如果录制任务正在进行高可用迁移,query 接口可能会暂时返回错误或不完整的信息。在这种情况下,建议稍后重试 query 接口,直到迁移完成。
  • 迁移完成后:一旦迁移完成,query 接口会返回新的 M3U8 文件名和相应的 TS/WebM 文件名。你可以通过这些信息继续访问和播放最新的录制内容。

示例响应:

{
"sid": "123456",
"cname": "channel",
"status": "running",
"m3u8_url": "https://example.com/bak0_123456_channel.m3u8",
"file_list": [
{
"name": "bak0_123456_channel_123_video_1609459200000.ts",
"url": "https://example.com/bak0_123456_channel_123_video_1609459200000.ts"
}
]
}

7.2 start 接口

start 接口用于启动一个新的录制任务。在高可用机制启动后,start 接口的行为不会受到直接影响,但需要注意以下几点:

  • 重复启动:如果在高可用迁移过程中尝试重新启动同一个录制任务,系统会返回错误提示,因为该录制任务已经在运行中。
  • 新任务启动:如果需要启动一个新的录制任务,可以正常使用 start 接口。系统会为新的录制任务分配新的资源,并生成新的 M3U8 和 TS/WebM 文件。

示例请求:

{
"mode": "mix",
"storageConfig": {
"accessKey": "your_access_key",
"secretKey": "your_secret_key",
"bucket": "your_bucket",
"region": "your_region"
},
"recordingFileConfig": {
"avFileType": ["hls"]
}
}

示例响应:

{
"resourceId": "resource_id",
"sid": "123456",
"cname": "channel",
"m3u8_url": "https://example.com/123456_channel.m3u8"
}

7.3 update 接口

update 接口用于更新录制任务的配置,例如更新订阅的用户列表。在高可用机制启动后,update 接口的行为如下:

  • 正常情况:如果录制任务正常运行,update 接口可以正常使用,更新后的配置会立即生效。
  • 迁移过程中:如果录制任务正在进行高可用迁移,update 接口可能会暂时不可用。在这种情况下,建议稍后重试 update 接口,直到迁移完成。
  • 迁移完成后:一旦迁移完成,update 接口可以正常使用,更新后的配置会立即生效。

示例请求:
{
“uidList”: [“user1”, “user2”]
}

示例响应:
{
“success”: true
}

7.4 stop 接口

stop 接口用于停止当前的录制任务。在高可用机制启动后,stop 接口的行为如下:

  • 正常情况:如果录制任务正常运行,stop 接口可以正常使用,录制任务会被立即停止。
  • 迁移过程中:如果录制任务正在进行高可用迁移,stop 接口可能会暂时不可用。在这种情况下,建议稍后重试 stop 接口,直到迁移完成。
  • 迁移完成后:一旦迁移完成,stop 接口可以正常使用,录制任务会被立即停止。

示例请求:

{
"sid": "123456",
"cname": "channel"
}

示例响应:

{
"success": true
}

7.5 acquire 接口

acquire 接口用于获取录制资源。在高可用机制启动后,acquire 接口的行为如下:

  • 正常情况:如果录制任务正常运行,acquire 接口可以正常使用,返回录制所需的资源 ID。
  • 迁移过程中:如果录制任务正在进行高可用迁移,acquire 接口可能会暂时不可用或返回错误。在这种情况下,建议稍后重试 acquire 接口,直到迁移完成。
  • 迁移完成后:一旦迁移完成,acquire 接口可以正常使用,返回新的资源 ID。

示例请求

以下是使用不同编程语言调用 acquire 接口的示例:

Java 示例
import com.agora.recording.RecordingClient;
import com.agora.recording.model.AcquireResourceRes;
import com.agora.recording.model.AcquireWebRecordingResourceClientReq;

public class AcquireExample {
public static void main(String[] args) {
String cname = "your_channel_name";
String uid = "your_uid";
AcquireWebRecordingResourceClientReq clientRequest = new AcquireWebRecordingResourceClientReq();

// 创建 RecordingClient 实例
RecordingClient recordingClient = new RecordingClient("your_app_id", "your_customer_id", "your_secret_key");

// 调用 acquire 方法
AcquireResourceRes acquireResponse = recordingClient.acquire(cname, uid, clientRequest);

if (acquireResponse.isSuccess()) {
System.out.println("acquire resource success: " + acquireResponse.getResourceId());
} else {
System.out.println("acquire resource failed: " + acquireResponse.getMessage());
}
}
}
Go 示例
package main

import (
"context"
"fmt"
"log"

"github.com/your-package/cloud-recording-go-sdk/recording"
"github.com/your-package/cloud-recording-go-sdk/recording/req"
)

func main() {
clientId := "your_client_id"
secretKey := "your_secret_key"
appId := "your_app_id"
cname := "your_channel_name"
uid := "your_uid"

// 创建 RecordingClient 实例
cloudRecordingClient := recording.NewCloudRecordingClient(clientId, secretKey, appId)

// 调用 acquire 方法
acquireResp, err := cloudRecordingClient.WebRecording().Acquire(context.TODO(), cname, uid, &req.AcquireWebRecodingClientRequest{})
if err != nil {
log.Fatal(err)
}

if acquireResp.IsSuccess() {
fmt.Printf("acquire success: %+v\n", acquireResp)
} else {
log.Fatalf("acquire failed: %+v\n", acquireResp)
}
}

示例响应

{
"resourceId": "resource_id",
"sid": "123456",
"cname": "channel",
"uid": "user123",
"serverUrl": "https://example.com",
"status": "success"
}

注意事项

  • 资源 ID 的存储:获取到的 resourceId 需要妥善存储,以便后续调用 start 接口时使用。
  • 错误处理:在调用 acquire 接口时,需要处理可能的错误情况,例如网络问题、权限问题等。

通过以上接口和示例,你可以更好地理解和使用声网的云端录制功能,并在高可用机制启动时确保录制任务的连续性和稳定性。

在声网,连接无限可能

想进一步了解「对话式 AI 与 实时互动」?欢迎注册,开启探索之旅。