V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ch2
V2EX  ›  问与答

使用多台小带宽的服务器共同传输一个大文件的方案?

  •  
  •   ch2 · 2022-03-20 20:59:00 +08:00 · 1376 次点击
    这是一个创建于 977 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景:买了很多台带宽不到 1M/s 的服务器,想利用它们搭建一个视频网站
    但是目前 H5 上的视频播放只实装了直链播放这种方式,这意味着任意时刻只能利用上其中一台服务器的带宽
    请问有没有类似的技术可以实现按不同的 range 从多台服务器上共同取回一个视频片段然后合成给前端播放?
    因为是网页不是客户端,没看到类似的解决方案,webrtc 能不能实现这种功能?

    15 条回复    2022-03-21 19:50:58 +08:00
    ruxuan1306
        1
    ruxuan1306  
       2022-03-20 21:14:41 +08:00
    现在视频大都是 m3u8 分段列表,切细点,不同的端放在不同服务器可能可以。
    ch2
        2
    ch2  
    OP
       2022-03-20 21:24:44 +08:00
    @ruxuan1306 #1 也考虑过 m3u8 ,不过这样太死板了,每一个切片只能固定由一台服务器提供
    anubu
        3
    anubu  
       2022-03-20 22:54:46 +08:00   ❤️ 1
    记得有一个基于 bt 的播放器,可以考虑类似的实现。
    anubu
        4
    anubu  
       2022-03-20 22:56:02 +08:00
    ch2
        5
    ch2  
    OP
       2022-03-21 00:13:53 +08:00
    @anubu #3 感谢,可是这个不是前端的,是个客户端。客户端的方案确实多,但是前端的难找
    LifStge
        6
    LifStge  
       2022-03-21 07:15:17 +08:00   ❤️ 1
    webrtc 不太现实 这个要同时使用相同资源多的...
    m3u8 没啥问题啊 自己通过域名做下负载 然后再把 m3u8 做成动态接口 自己服务器间用算法再做一下动态的负载 就是一个 m3u8 N 个切片 做个规则 把切片动态的分布在不同的子域名下(服务器间闲忙状态维护下) 均匀的分布下 也就可以了吧...

    ...多说一句 现在那种小站 不都是 套了一层 cf 本站就维护了 html... 什么图片 切片 统统都是薅的羊毛 分布在各个不同的免费站 或 上传漏洞上....
    cpstar
        7
    cpstar  
       2022-03-21 08:54:27 +08:00   ❤️ 1
    OP 2# 你把 M3U8 动态生成不就得了。每次随机出不同的列表,所有服务器保存所有切片,或者排列出所有可能,然后依次提供给不同的用户,n 台服务器、m 个切片,n*m 个 m3u8 随机提供给用户。
    okakuyang
        8
    okakuyang  
       2022-03-21 09:29:41 +08:00
    webrtc 是用来实时通信的,传输速率没有直接 http 那么高。
    ch2
        9
    ch2  
    OP
       2022-03-21 10:41:06 +08:00 via iPhone
    @cpstar 现在发现瓶颈出在播放器用的 hls.js 上,这个库下载 m3u8 的 ts 切片是按顺序来的,不能并行下载,即使做了切片的负载均衡,任意时刻也只会下载其中一个
    cpstar
        10
    cpstar  
       2022-03-21 11:04:20 +08:00
    OP 9# 不不不,我的意思是“伪”动态生成 m3u8 ,比如 n=3 ,m=3 ,先伪动态生成 9 个 m3u8 ,然后用户请求的时候从 9 个里边返回一个给用户。而每个 m3u8 的内容,都含有域名区分的,比如
    list_1.m3u8 是
    http://a.example.com/1.ts
    http://b.example.com/2.ts
    http://c.example.com/3.ts

    而 list_2.m3u8 是
    http://b.example.com/1.ts
    http://c.example.com/2.ts
    http://a.example.com/3.ts

    以此类推
    ch2
        11
    ch2  
    OP
       2022-03-21 11:15:25 +08:00 via iPhone
    @cpstar 现在又出现一个新问题,由于播放器播放视频的时候默认会缓冲 3 个 ts ,但是这三个 ts 是串行缓存的。这就导致了把这三个 ts 存在三个不同的服务器上跟在一台上实际上效果是等同的(只针对一个人看视频而言)。我去查了 hls.js 的 issue ,发现他们并没有打算做并行缓存这个特性
    cpstar
        12
    cpstar  
       2022-03-21 11:24:31 +08:00
    这你就没办法控制了,本身 M3U8 就是个顺序执行机制,m3u 就是个顺序播放列表么,你永远无法知道用户什么时候播放下一个视频(因为可以播放可以暂停,除非你不提供暂停机制)。
    除非你上负载均衡做运行时均衡,nginx upstream 各类机制,或者 SRS 边缘节点之类的。

    相比较,这就是成本问题,你不能既要熊掌又要鱼。
    LifStge
        13
    LifStge  
       2022-03-21 19:08:26 +08:00   ❤️ 1
    @ch2 #11 服务端其实能做的也就这么多了(针对现在特定要求的情况下) 剩下的就是客户端再做优化了 库不支持并行没有关系 客户端现有代码不变 加上一层 拦截请求 自己来做并行缓存下来就可以了
    ch2
        14
    ch2  
    OP
       2022-03-21 19:43:06 +08:00
    @LifStge #13 用 PWA 的拦截 api ?这或许是个好办法,可以尝试一下
    LifStge
        15
    LifStge  
       2022-03-21 19:50:58 +08:00
    @ch2 具体自己可以搜搜 javascript 拦截请求啥的 核心就是做 hook 那些 添加自定义请求头啥 添加 token 啥的 也都是 hook 直接来做的 统一处理就很方便了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5892 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 02:09 · PVG 10:09 · LAX 18:09 · JFK 21:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.