#做了一个快速(300M+)、不贵($1/TB)的文件下载分发服务

由于复杂的网络环境,分发大文件即痛苦又昂贵。因此做了一个快速、不贵的文件下载分发服务: FastBlob,目前速度可达 300M+。

📚 原理

服务端有多个遍布世界各地的节点,对源站的文件进行反向代理。客户端将下载进行分片,利用多线程进行同时下载,再通过现代浏览器的 stream 组合成一个 Response ,从而实现和 fetch 同样的接口。

✨ 特点

  • 用的是你自己的域名,支持 HTTPS ,后期会支持 SNIProxy
  • 目前提供了 JavaScript SDK ,可以直接替换 fetch ,无需修改代码
  • 适应电信、联通、移动等不同运营商的网络环境
  • 设置简单,只需要将域名 CNAME 一下即可
  • 修改 Request 和 Response 的 Header 设置
  • 没有单点故障,一个节点挂掉了也没关系
  • 可以快速的扩容,不用担心用的人多了导致速度变慢
  • IPv4 + IPv6

⚡ 性能

试运行阶段目前只有 6 个节点,在电信测试下载速度达到了 300M+,后期会继续增加节点,提高下载速度。

💸 价格

目前试运行期间 $1/TB ,后期会根据运行情况进行调整。注册提供 50GB 的免费流量供尝试。

📝 备注

建议使用 Cloudflare R2 来作为源站,因为 Cloudflare 不收流量费,且 R2 在全球进行分发。

🏖️ 尝试一下

https://zh.fastblob.com/try

Answer

ui 挺好看的

确实速度很快啊,赞

思路很好,国外的机器都能多线程到这个速度,确实让人眼前一亮。
搭车宣传下,如果有需求国内网络的便宜 cdn 需求可以看看这个 https://www.dfyun.com.cn
速度没有 lz 的文件下载分发快,不适合大型文件。但是国内线路稳定可靠,可用作各种小文件加速。

我再看了下,你这个仅仅做反向代理,不做内容缓存或者托管啊。这样算下来,源服务器的成本和带宽都可能成为瓶颈了。
你多进程反向代理我源站,速度也是取决我的源站速度。而且流量层面都是要走一遍我的源站,我得付两次流量费用。
再者,下载文件不能直接弹出来,需要等然后再点击一下,用户体验没那么友好。

"注册提供 50GB 的免费流量供尝试。"

为什么我只有 5G 呢

没有中文为啥网址用 zh 开头

@"hccsoul"#p648965 因为 Cloudflare 速度太慢了,所以用 hk 的机器反代了

稳不稳, 会不会接受大陆机关审查......要是已经润了当我没说

@"star7th"#p648963 所以建议使用 Cloudflare R2 或者 Cloudflare over B2 ,或者找个流量联盟的机器套上 CF ,也都不收流量费用。做内容缓存和托管的话,因为服务器数量多,很容易碰到缓存不一致的问题。下载可以直接弹出来,新建 atag 并 atag.click 就可以。

@"ClarkAbe"#p648967 稳定性方面,这个项目脱胎于我自己其他项目的需求,所以不会随便放弃,其他项目也还需要这个项目。另外一个节点挂掉了也没关系,其他节点可以无缝顶上。隐私方面,之后会加上 SNIProxy 模式,这样的话 FastBlob 只是一个 TCP 的 relay ,不负责 TLS 。

测试下载直连无法下载.似乎挂梯子也不行.

@"hteen"#p648964 修复了

@"yehoshua"#p648970 系统和网络环境是啥?我这没问题

@"hzcer"#p648972 Mozilla/5.0 (X11; Linux x86_64; rv:106.0) Gecko/20100101 Firefox/106.0 错误好像是 CORS Failed 网络是广东移动

思路不错 有同样的开源实现可以自己搭的那种吗

@"yehoshua"#p648973 Firefox 对 CORS 的处理确实和其他浏览器不太一样,我需要再修改下源站的 CORS header 设置

@"yehoshua"#p648973 我也是这样的问题。无法下载。

系统是 macos 10.15.7 浏览器 firefox 广州电信。

@"xdeng"#p648974 随便使用一个 web server 反代就可以了

@"hzcer"#p648977 这么一说,我换 chrome 确实是好的.

@"yanwen"#p648976
@"yehoshua"#p648978
你们可以先用 Chrome 测试一下,这个是背后源站的设置问题,跟 FastBlob 中间层没啥关系。

要科学才能访问么

@"suyuyu"#p648980 不需要

使用境外服务器总是会遇到,某些城市的某个运营商的网络下无法访问。

@"maggch97"#p648982 所以使用了多个不同地点不同服务商的服务器同时提供服务,这样就不会出现在某些城市的某个运营商的网络下无法访问的情况

@"hzcer"#p648983 你提供的 sdk 总是需要去读 server list 的

我还以为是类似 115 / 6 盘之类的工具...细看才知道是分发...

@"maggch97"#p648984 提供的 SDK 不需要读 Server List 的,靠的是 DNS CNAME 运行的。全程与用户交互的都是你自己的域名,没有涉及到 FastBlob 的 API 。

@"hzcer"#p648986 好吧...但还是希望能有一份 TOS 文件来列出服务范围......看了下支付是加密货币....感觉挺适合用来做资源分发的.....

明明支持 h2 ,为什么会有这么多连接,有必要吗?

感觉挺有意思的,mega.nz 的下载也是类似的玩法,不过 mega 的服务器似乎都在欧洲,而且感觉有限速。

马克一下,最近可能有需要

@"1423"#p648989 支持 H2 的,这个应该是 Surge 的显示问题?或者 Chrome 的调度问题?理论上 Chrome 应该会自动复用同一个 H2 链接的。

@"hzcer"#p648991 看起来是 7.proxy.fastblob-endpoint.com. 这些没有 A 记录,所以在重试

未来的 SNIProxy 模式难道不会被用于翻墙吗
这个服务目标是作为 cf 或其他 cos 的前端,但 cf 本身就可以这么玩吧
尤其 cf 的 ip 们虽在海外很容易都 anycast 到同临近地域,但在国内往往是不同的海外地域
是不是可以直接用本项目的思路直接给 cf 做加速

@"1423"#p648993 sniproxy 确实有这样的问题,至于怎么防止这个问题要再考虑考虑。
应该可以,不同的域名 CF 优选不同 IP 。

测试文件 firefox 无法下载 edge 可以

请教下适用场景是什么,跟 cdn 有啥区别呢?

不了解前端,请教一下,SDK 的示例是不是有问题
```
const url = "https://example.website.fastblob.com/big-buck-bunny/Big%20Buck%20Bunny_1080p_30fps.mp4";

const response = await fetch(url);
const blob = await response.blob();
const newURL = URL.createObjectURL(blob);
console.log(newURL);
```
上面会报错,改成 const url = "https://3.example.website.fastblob.com/big-buck-bunny/Big%20Buck%20Bunny_1080p_30fps.mp4"; 这样才可以,但下载源就只有一个了

@"1423"#p648997 前面还有
import fetch from "@fastblob/fastblob-fetch";

确实比较容易让人误解以为和 window.fetch 是同一个 fetch

@"tftk"#p648996 比国内 CDN 便宜,比国外 CDN 快且便宜

厉害啊

卡一个

1 刀 1t ,这个定价 cover 得住吗

360 极速无法下载,Chrome 可以

@"whileFalse"#p649002 用的都是比较便宜的大流量服务器,成本上还是 cover 得住的。不过这只是试运行的优惠价,后续还是要根据具体的运行成本进行重新定价的

@"whileFalse"#p649002 目前这个定价确实有点慈善定价了,为了后期的可持续发展以及人力开发成本还是要调整定价的,目前更多的还是看看这个的市场需求有多大以及进行一下 Alpha 测试。

我为什么不用免费不限速的 wetransfer 呢,盈利方式是网页背景图广告,公司规模还不小,基本不用担心文件被篡改或不稳定,随时满速

@"edis0n0"#p649006 文件分享服务现在市面上很多了,这个更多是分发服务。FastBlob 的受众更多是网站站长,是类似 CDN 的一个服务。

有开源的分发么

支持网站反代吗

用不了阿 不支持国内付款吗

除了网页端,能用命令行下载么?

做的很好,唯一问题就是害怕跑路

UI 这边捉个虫:

https://hk.dash.fastblob.com/billing 的 Add Bandwidth 可输入负数。。

@"macy"#p649011 目前没法,但你可以用 Node.js 封装一个。之后应该会出 Golang SDK ,这样就可以编译成命令行了。

@"haoxuexiaoyao"#p649008 目前没有开源的,你可以直接用 webserver 反代