在后端提供动态文件的最佳实践

Wec*_*ski 3 architecture rest backend server-side file-management

有谁知道后端设计中向客户端应用程序提供动态图像和视频的最佳实践或常见策略?

背景:我目前正在构建一个应用程序,允许用户上传自己的图像和视频。我不太确定如何以最有效的方式将这些媒体文件返回给客户端。我是否将文件存储在运行应用程序服务器的同一 VPS 上?我是否需要以不同的质量/密度保存文件,以便更好地调整客户的屏幕分辨率?(我主要有移动客户端)

我尝试用谷歌搜索这些问题,但显然我问了错误的问题:-)

我真的很感激有关这些主题的参考资料或专业词汇。

提前致谢。

Max*_*hny 5

1)需要拆分Web服务器和应用服务器。

首先,不要尝试从后端流式传输媒体文件,除非您可以将低级内容卸载到操作系统 - 很可能您会做错。使用代理服务器作为 Web 服务器来提供此类文件。nginx 就可以了。

此外,您还需要像备份数据库一样备份媒体文件。将静态巨大媒体文件与应用程序服务器一起存储是错误的做法 - 它根本无法扩展。您可以添加 cron 任务以将文件移动到某个 CDN 服务器 - 移动完成后,您将替换数据库中的 URL 以匹配新位置。

因此,通过使用 nginx,当文件移动到外部服务器时,您将节省宝贵的 CPU 和 RAM。CDN 将帮助您将带宽和 CPU/RAM 资源分配给应用程序服务器。

2)关于图像分辨率和下采样:

与典型的办公室工作站相比,现代手机的屏幕具有相同甚至更好的分辨率。链接速度对用户体验有更大的影响。如果客户拥有大屏幕智能手机,但链接速度较慢,即使媒体质量与手机分辨率不匹配,您仍然必须尽可能快地传输图像或视频。

按需对图像进行下采样并将结果存储在磁盘上以便 nginx/CDN 再次提供服务是有意义的。对于视频,在链接速度慢的情况下,制作具有大压缩(质量损失)的“坏”版本是有意义的 - 设备会在播放过程中对其本身进行下采样。您可以保留客户端统计数据(屏幕尺寸/下行速度),并在稍后看到该视频文件“流行”时生成该视频文件的优化版本。

仅供参考:几年前,一些社交媒体巨头放弃了准备同一媒体文件的所有可能版本的想法,转而采用 FPGA 即时重采样器。我不记得公司名称和文章的 URL。可能是 Instagram。一些云提供商提供带有 FPGA 或 CUDA 的产品来完成繁重的工作。因此,在某些情况下,您可以用存储来换取重型马力,以便即时进行转换。