导言
本文将主要介绍如何通过腾讯云下的对象存储 COS, 数据万象 CI, 视频处理 MPS,CMQ 和 CDN 等服务来一招解决社区功能中图文音视频方案.
从早期的门户网站, 到后面的 feeds 流, 再到如今的各种垂直行业的社区分享, 一次次变更成就了近几年行业中的领跑者. 从行业领先的微博, 再看头部公司产品从头条到手百, 中间各路小红书, 陌陌, B 站等等, 绝对都是可以看到 feeds 和社区的影子. 而其中跑不掉的原始素材便是基础的图片, 音频和视频等. 今天就来介绍基于腾讯云如何解决这些社区方案中原始基础素材的问题.
问题分析
在介绍方案之前, 我们先要来分析看下, 当我们需要做 feeds, 做社区的时候, 针对这些原始素材会遇到哪些典型的问题:
类型兼容
从类型来看, 在做当前的社区功能或者 feeds 流时, 主要还是在文本, 图片, 音频和视频这四类素材, 当然我们的产品角度对这四类基本素材是可以相互结合的, 如图文, 多图, 文本 + 视频等等. 因此基本看下来, 我们会需要对这些基本素材有支持存储, 读取的功能等等.
数据安全
从数据安全角度, 素材会分公有和私有, 排列组合下来也就是需要有: 公有读公有写, 公有读私有写, 私有读公有写和私有读私有写. 不过其中的私有读公有写显然是没有该场景的, 那么看下来就是需要支持: 公有度私有写, 公有读写和私有读写这三种读写操作.
数据量
从数据存储量角度, 无论我们预估自己的产品会到什么量级, 在后端架构设计上, 存储是一定要做到可以水平扩展的, 不然就是一个不合格的高可用产品, 因此我们的素材在做存储方案时, 也需要考虑到存储的扩展能力.
访问性能
从性能角度来看, 这个问题比较清晰, 因为无论是 feeds 流或社区产品, 这些都是 ToC 类产品一定是需要高 qps 的, 也就是我们肯定是需要 CDN 相关能力支持的.
版权所有
从版权角度, 如防盗链功能, 可以防止不良网站盗用开发者的图片链接, 盗取图片流量, 给开发者带来经济损失; 同时用户也会需要有对图片做一些水印保护的需求等等.
加载速度
从用户体验来看, 更快的打开一个页面其实很重要, 而现在所有的图片和视频都是高清, 720P 起步, 那么我们就需要满足不同带宽下的不同分辨率视频流切换, 同时对于图片或者视频封面图等, 都是需要做预览功能, 这样才可以显著提升页面加载速度和改善用户体验.
安全合规
从安全合规角度, 也就是鉴黄, 涉政等能力, 在互联网行业诸如这几天爱奇艺刚出来的 ghs 事件影响非常之大, 这种事在国内是绝对需要杜绝的, 否则会带来毁灭性的打击.
其实上面列出的这些待解决的问题还不是包括全部的, 但是仅这些功能如果全部做出来的话就需要巨资打造一个上百人的团队花费上半年的时间(可能还 bug 不断, 功能不止). 巨资还好, 因为互联网行业最重要不是钱, 但是时间, 却是致命的. 因此, 云服务就此而现, 腾讯云的诞生就是为互联网创业团队或者公司去解决这些棘手的问题, 让业务可以 focus 业务, 下面我们就基于腾讯云解决方案来逐一化解上述的一个个问题.
对象存储(COS)
COS, 对象存储 (Cloud Object Storage,COS) 是由腾讯云推出的无目录层次结构, 无数据格式限制, 可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务.
存储能力
也就是无论对于文本类文件, 抑或是图片, 音频和视频文件, 都是可以存储于 COS 中. 所以对于上面的第一个问题, 通过 COS 已经可以完美解决. 再来看 COS 生态, 从当下来看, COS 的读写支持已经到了十分变态的地步了, 各种开发语言的 API 且不说, 从 JS,java,go 到 iOS, 安卓和小程序等数十种 SDK(更多详细可以在 COS 的 SDK 支持), 同时也支持了大量的客户端工具(更多详细可以在 COS 的客户端工具支持), 甚至当前的 CosBrowser 工具都已经在 Linux 下可以界面化使用了, 如下图.
COSBrowser 可视化界面工具支持
我们这里不会详细的介绍 SDK 的使用方式, 也不会对这些工具做开箱介绍, 更多的是从解决方案的支持角度来讲解. 所以具体的使用大家去上面的链接里详细看下就有分寸了.
权限管理
下面让我们继续回到上面的第二个问题. 首先, COS 的存储是使用状态无关的分桶 (下称 bucket) 机制, 而针对于不同的 bucket 有不同的访问权限级别, 在 COS 中支持的访问权限共三种: 私有读写, 公有度私有写和公有读写. 这也就是说, 在 COS 之下我们通过对 bucket 设置不同的权限, 再将不同访问权限的文件存储于不同 bucket 之下, 就可以完美的实现对访问素材的不同权限管理, 如下图.
不同访问级别的分桶展示
访问性能
同时, 腾讯云 COS 的存储桶空间无容量上限, 无需分区管理, 这就是说明对于问题三的数据量问题, 我们通过一个 COS 的 bucket 就已经解决了. 不过, 一般我们对于数据存储量和访问的 qps, 也就是问题三和问题四总是同时考虑的. 在 COS 中, 单 bucket 的访问 qps 是有一定限制的, 从当下来看, 单 bucket 有 30000/s 的读写性能, 基本上在前期使用是完全 OK 的, 具体可以参看请求速率与性能优化. 如果需要考虑更高的性能场景, 可以在业务层做一下一致性哈希, 负载均衡的将数据存放到不同的 bucket, 如公有数据可以存放到 demo-public-1,demo-public-2,demo-public-N 等等, 从而将存储的 qps 能力可以水平扩展, 那么具体如何做负载均衡或者一致性哈希如何去做就不是本文讲解的重点了.
数据万象(CI)
介绍完基础读写能力后, 我们下面继续来看一些增值能力的支持. 在问题 5 中, 我们提到了图片的版权问题, 这也是当下社区产品必须支持的一个基础功能了. 这时候, 就需要引入腾讯云的第二套产品, 数据万象了.
能力开启
数据万象(Cloud Infinite,CI), 是腾讯云为客户提供的专业一体化的图片解决方案, 涵盖图片上传, 下载, 存储, 处理, 识别等功能, 将 QQ 空间相册积累的十年图片服务运作经验开放给开发者. 目前数据万象提供图片缩放, 裁剪, 水印, 转码, 内容审核等多种功能, 提供高效准确的图像识别及处理服务, 减少人力投入, 真正地实现人工智能.
看完上面这段介绍, 基本上 CI 的能力大家也都知道了, 这些功能极大的解放了我们的研发能力, 而更关键的是实用角度的便利性. 当下 CI 和 COS 早就已经完美打通, 我们只需要前往 CI 控制台下, 通过预设权限, 便可以在 CI 下直接绑定 COS 的 bucket, 而这些操作也十分方便, 全部都是点点就可以完成, 如下图.
CI 绑定 COS 的 bucket
CI 到 COS 的权限打通
一旦我们绑定完成后, 再来看看 CI 的能力. 其实 CI 的功能非常强大, 基本的图片处理如缩放, 裁剪, 增值操作如水印能力, 内容鉴别能力等等, 更多详细功能可以查看这里.
防盗链
那么, 我们上面遇到的问题也就迎刃而解了, 首先我们来看防盗链问题, 腾讯云 CI 推出的防盗链功能, 通过 HTTP 协议支持的 Referer 机制来进行相应的来源识别和管理, 如下图所示, 支持设置网站为黑名单或白名单, Referer 名单也支持多个域名. 回车换行, 一行输入一个, 同时支持通配符. 同时在开启防盗链设置后, 可根据策略限定服务来源.
CI 防盗链设置
水印能力
再来看水印能力, CI 同时支持可见水印和盲水印能力. 首先我们来说一说这两种场景.
可见水印, 就是我们社区图片中常见的场景了, CI 支持了文本水印和图片水印的能力, 文本水印比较好理解, 就是例如图片中的用户 ID, 从而可以标明所有权. 而图片水印, 可以理解为是图片上覆盖另一个图片, 在当下美图等产品中使用很多.
盲水印功能, 通过该功能, 可将水印图以不可见的形式添加到原图信息中, 并不会对原图质量产生太大影响. 在图片被盗取后, 可对疑似被盗取的资源进行盲水印提取, 验证图片归属. CI 提供的盲水印功能拥有半盲, 全盲和文字盲水印三种类型.
功能介绍完毕, 我们再来看 CI+COS 的结合所给开发者带来的解放是什么样的, 简单看下下面两个 url:
首先, 我们来看两张图, 视觉上看到的是, 前者是原图, 后者是加了水印的图片. 而从域名角度, 我们会发现两者依然是 COS 的域名, 且 url path 的前面都是一样的. 这说明了后面的? watermark 这一参数实现了水印能力, 也就是说, 只要打通了 CI 和 COS 之后, 代码无需任何改动, 只需要根据产品逻辑拼接参数即可实现各种水印需求! 这绝对是方便了我们的研发的很多时间, 具体的水印参数拼接逻辑可以看这里.
图片缩放
同样的道理, 我们再来看 CI 的图片缩放能力, 我们继续给出下面两个 url:
http://examples-1251000004.cos.ap-shanghai.myqcloud.com/sample.jpeg?imageMogr2/thumbnail/!50p
原图还是上面的图片, 而下面的缩略图也一样只需要通过? imageMogr2 参数来实现即可. 这个功能的意义是什么呢? 我们前端 App 或者页面在很多场景都需要展示图片列表, 这时候需要很快速的拉取一个个图片, 如果采用原图, 图片质量过高, 文件过大, 会导致加载速度很慢, 而如果只拉取缩略图列表, 可以大大的降低了带宽, 同时又提高了 App 或者页面加载速度.
当然了, CI 的能力强大的远不止这些, 还是建议大家多去看看, 用用, 一定可以极大的提升大家的研发效率.
视频处理(MPS)
从快手抖音开始, 视频流已经不是新鲜事了, 而前几天老罗也加入了直播带货, 直接让直播行业进入了另一个维度. 下面我们先来看一下腾讯云官网对于视频处理的介绍.
能力开启
视频处理 (Media Processing Service,MPS) 是针对海量多媒体数据, 提供的云端转码和音视频处理服务. 您可以按需将云存储中的视频文件转码为适合在 OTT,PC 或移动端播放的格式, 满足您在各类平台将视频文件转为不同码率和分辨率的需求. 此外, 还为您提供了叠加水印, 视频截图, 智能封面, 智能编辑等视频处理服务.
和上面说到的 CI 一样, MPS 和 COS 也是完全打通, 在开通的过程, 我们同样需要走一个授权的流程, 如下图. 不得不说, 腾讯云的角色管理架构设计的还是非常好的.
MPS 到 COS 的权限打通
工作流使用
在 MPS 中, 通过配置工作流的方式, 可以直接将存储于 COS 的 bucket 中某一目录下的视频, 进行各种花式操作. 下面用转码举例, 在下面的配置中, 我们将 demo-public 桶下的 / video / 目录下的所有文件, 转码为 480P 并存放于 / video/480 / 目录下.
MPS 工作流配置
当下 MPS 的视频转码支持数十种样式可选, 同时 MPS 还支持了截图, 转动图, 审核等等功能. 其中截图功能, 就可以完美的自动支持视频的预览图方案, 可以通过配置一个截图工作流来完成对视频的自动截取, 从而我们可以将视频中某个时间点的图片作为封面图. 而审核功能则可以开始涉黄, 涉政等审核能力, 不用过多解释, 也是当下社区所必备的基础能力了. 下面展示了这三种工作流的配置方式, 而在输出路径这一项, 我们可以预置目标文件名的格式, 这样极大的方便了前端同学对于诸如视频封面图的获取(甚至通过默认封面图 + 拼接名称可以让后端同学 0 代码改动就可以支持到产品角度视频封面图的功能).
MPS 更过工作流配置
对了, MPS 当下只会对 bucket 中增量数据进行处理, 也就是只有在任务流配置完之后的新存入到 COS 的 bucket 中指定目录的文件, 才会被处理. 当然, 其实这也是合理的操作, 毕竟万一存量视频有几百上千, 这么一配置, 不就亏本了么.
事件通知
有的同学可能会问, 那这个转码需要多久, 我怎么知道结果呢? 细心的同学可能已经看到, 在上面的工作流配置截图中有个[开启事件通知的选项] . 是的, MPS 的转码完成事件, 已经打通到腾讯云的 CMQ 消息队列! 我们只需要在 CMQ 中配置 topic, 并在业务代码中订阅该 topic, 那么当转码任务完成后, 就可以收到该事件通知了.
MPS 事件通知
内容分发网路(CDN)
最后一部分, 我们要说的就是 CDN 了, CDN 的功能其实不用多说了, 通过将站点内容发布至遍布全国的海量加速节点, 使其用户可就近获取所需内容, 避免网络拥堵, 地域, 运营商等因素带来的访问延迟问题, 有效提升下载速度, 降低响应时间, 提供流畅的用户体验.
这儿不会详细介绍 CDN 是什么, CDN 原理等等了, 还是要从解决方案的角度来说. 其实很简单, 一句话, 上面说的这些诸如 COS,CI 或者 MPS 等的数据早已经和腾讯云 CDN 打通了. 只需要通过简单的配置就可以完成 CDN 加速了, 如下图所示.
COS 的 CDN 加速配置
总结
通过上面的这些介绍, 我想大家基本上对于通过使用腾讯云中的诸如对象存储, 数据万象, 视频处理, CMQ 和 CDN 等这些服务如何构建基础的社区或 feeds 流的能力已经有所了解, 赶快动起手来快去试试吧.
来源: https://www.qcloud.com/developer/article/1613249