Page 1 of 1

是否有专门的数据库来处理媒体文件存储?

Posted: Tue May 20, 2025 11:31 am
by muskanislam99
Yes, absolutely and definitively, WhatsApp (以及任何大规模的现代应用) 都有专门的系统来处理媒体文件的存储,而绝不是直接存储在关系型数据库或传统的 NoSQL 数据库中。

这是一种行业标准实践,称为对象存储(Object Storage)或分布式文件存储(Distributed File Storage)。

1. 为什么不能直接存储在数据库中?
正如之前提到的,将媒体文件(图片、视频、语音消息、文档等)直接存储在数据库中会带来灾难性的后果:

性能瓶颈: 数据库(无论是关系型还是大多数 NoSQL)的设计是为结构化数据和元数据优化的,而非二进制大对象(BLOB)。频繁的大文件读写会迅速耗尽数据库的 I/O、内存和 CPU 资源,导致整个数据库性能急剧下降。
存储成本高昂: 数据库存储通常比专门的对象存储服务昂贵得多,尤其是在需要高可用性和持久性的生产环境中。
可扩展性限制: 数据库的垂直扩展(增加单台服务器的硬件)能力有限,而媒体文件需要极强的水平扩展能力来处理 PB 级甚至 EB 级的数据量。
维护和操作复杂性: 包含大量媒体文件的数据库会变得极其庞大,导致备份、恢复、复制和维护操作变得异常缓慢和复杂。
功能缺失: 数据库不提供媒体文件所需的关键功能,如:
CDN 集成: 全球内容分发。
媒体转码: 转换文件格式或生成不同分辨率。
缩略图生成: 自动为图片和视频创建小尺寸预览。
流媒体传输: 高效地传输视频和音频流。
访问权限控制: 细粒度控制谁可以访问文件。
2. 专门的媒体文件存储方案:对象存储
WhatsApp 几乎肯定使用的是对象存储服务。

什么是对象存储?

对象存储是一种数据存储架构,将数据作为 加纳 whatsapp 数据库 对象(Object)来管理,每个对象都包含数据本身、可变数量的元数据以及一个全局唯一的标识符。
与文件系统(层次结构)或块存储(固定大小块)不同,对象存储是扁平的,所有对象都存储在一个大的、可扩展的池中。
主要特点:

极高的可扩展性: 可以轻松存储 PB 甚至 EB 级别的数据,通过添加更多节点实现线性扩展。
高持久性: 数据在多个节点和地理位置进行复制,通常提供 99.999999999%(11个9)的持久性。
高可用性: 数据在多个故障域中复制,确保即使部分组件故障也能持续访问。
低成本: 相对于数据库存储,单位存储成本更低。
API 访问: 通过 RESTful API 进行数据存取,易于集成。
与 CDN 集成: 能够与内容分发网络(CDN)无缝集成,将媒体内容缓存到全球各地的边缘节点,加速用户下载。
WhatsApp 可能使用的具体技术:

Amazon S3 (Simple Storage Service): 如果 WhatsApp 大量依赖 AWS 云服务,S3 是其最可能使用的对象存储。
自建大规模分布式对象存储: 考虑到 Facebook(Meta)的规模和对基础设施的控制,他们很可能拥有自己高度优化的、基于开源技术(如 Apache HDFS、Ceph、或者定制的存储系统)构建的私有云对象存储服务。这种自建方案可以提供更精细的控制、更低的成本和更高的定制化程度。
3. 数据库中如何引用媒体文件?
数据库(如 Messages 表)不会存储实际的媒体文件内容,而是存储指向这些文件的引用(URL)和相关元数据。

Messages 表中的字段:
media_url (VARCHAR/TEXT): 存储媒体文件在对象存储中的唯一 URL 或路径。这个 URL 可能是预签名的(带有过期时间的临时访问权限),以增加安全性。
media_metadata (JSONB/TEXT): 存储非敏感的、未加密的媒体元数据,例如:
file_size (文件大小)
mime_type (文件类型,如 image/jpeg)
dimensions (图片/视频尺寸)
duration (视频/音频时长)
thumbnail_url (缩略图的 URL,缩略图也是单独存储在对象存储中)
encryption_key (BLOB/VARCHAR): 这是非常关键的字段。由于媒体文件也是端到端加密的,数据库中存储的 encryption_key 是用于解密该媒体文件的密钥(通常是一个随机生成的对称密钥)。这个密钥在发送方加密媒体文件后,作为消息的一部分(可能被接收方的公钥加密)发送到接收方,服务器只负责传输和存储,不解密。
hash (文件内容的哈希值,用于完整性校验或去重)
4. 工作流程示例
上传: 用户在 WhatsApp 发送图片。客户端将图片加密并上传到对象存储服务。
获取引用: 对象存储返回一个唯一的 URL/ID。
发送消息: 客户端构建消息,包含加密后的文本(如果有),以及 media_url、media_metadata(含 encryption_key 和 thumbnail_url)。整个消息(包括这些元数据)再次进行端到端加密。
服务器存储: WhatsApp 服务器接收到加密消息,将其直接存储到 Messages 数据库的 BLOB 字段中。服务器不解密,不访问媒体文件内容。
接收: 接收方客户端收到加密消息,解密后获取 media_url、thumbnail_url 和 encryption_key。
下载: 客户端先显示缩略图。当用户点击查看时,客户端使用 media_url 从对象存储下载加密的媒体文件,然后使用 encryption_key 在本地解密并显示。
因此,WhatsApp 毫无疑问会使用专门的数据库(即对象存储服务)来处理媒体文件的存储,而核心数据库仅存储指向这些文件的引用和必要的元数据。