一个完善的 IM 系统中通常充斥着大量的图片内容,包括:用户头像、图片消息、相册、图片表情等等,那么在做服务端架构设计时该如何存储这些图片呢?
本文分享的是典型 Web 应用中大量图片的服务端存储加构的演进过程,但基本的技术原理和架构思路对于 IM 系统而言同样适用,所以在阅读时可以根据自已 IM 的实际架构情况,酌情吸取适合您的内容即可。文中部分观点可作抛砖引玉之用,可能并非最佳实践,请勿迷信之。
实际上:旧式的 PC 端 IM 中,诸如图片消息这种业务形态,可能是通过长连接直接推送过去(所谓的实时图片传输嘛),这种情况理论上是不需要服务端存储的。但现今的主流移动端 IM,基于移动网络抖动大、 不稳定的特性和随时随地社交分享的现实,已很少使用实时传输这种技术手段。现在主流 IM 都是本文所述的这种:通过 Http 短连接从云(也就是服务端)“拉取”,这种方式的好处是:随时随地分享、对网络稳定性要求低(只要上传者一次上传,服务端可长时间存储,下一个阅读者通过 URL 按需随读随取即可,再次分享时只要分享 URL 而无需再次完整传输整个图片)。
以此类推:IM 系统中,实际上还存在其它类似于图片的小文件存储需求,比如:语音留言消息中的 AMR 短音频文件(有些 IM 中为了音质可能使用的是 AAC 音频格式,比如易信)、短视频功能中的小视频文件等,这些文件的存储和使用跟图片文件基本类似,所以考虑到通用性,如果能把这些小文件存储也纳入到图片的存储架构中,对于整体系统架构来说(尤其存储部分)就显的更通用。所以本文中虽然以图片存储为切入点,但您实际上完全可以套用到基它小文件的存储上哦。
单机时代的图片服务器架构(集中式)
初创时期由于时间紧迫,开发人员水平很有限。
所以通常就直接在 website 文件