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

Best Practices for serving dynamic files in a backend

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

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

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

如果能提供有关这些主题的参考资料或专业词汇,我将不胜感激。

提前致谢。

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

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

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

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

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

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

根据需要对图像进行缩减采样并将结果存储在磁盘上以供 nginx/CDN 再次提供服务是有意义的。 在视频的情况下,对于慢 link 的情况,制作具有大压缩(质量损失)的 "bad" 版本是有意义的 - 设备将在播放过程中自行降低采样率。 您可以保留客户端统计信息(屏幕 sizes/downlink 速度)并在稍后看到此类视频文件 "popular".

时生成优化版本

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