IM开发基础知识补课(二):如何设计大量图片文件的服务端存储架构?

  • 时间:
  • 浏览:0

基本架构如下图所示:

唯一的大问题是:以不会不兼容旧版本的访问规则。以前将旧图片一次性导入FastDFS,但以前旧图片访问路径分布存储在不同业务数据库的各个表中,整体更新起来也十分困难,太少如此得兼容旧版本的访问规则。架构升级往往比做全新架构更有难度,太少以前如此兼容以前版本的大问题。(给飞机在空中换引擎可比造架飞机难得多)

[3] 用户的访问方式如下:http://www.yourdomain.com/upload/qa/test.jpg

旧图片数据为甚办?都如此继续兼容旧图片路径访问规则?

随着upload目录中文件太少,所在分区以前总出 容量缺乏,则不能自己扩容。如此停机后更换更大容量的存储设备,再将旧数据导入;

《即时通讯安全篇(二):探讨组合加密算法在IM中的应用》

《请问一帮人知道语音留言聊天的主流实现方式吗?》

《微信对网络影响的技术试验及分析(论文全文)》

首先,关闭旧版本上传入口(防止继续使用由于数据不一致)。将旧图片数据通过rsync工具一次性迁移到独立的图片服务器上(即下图中描述的Old Image Server)。在最前端(七层代理,如Haproxy、Nginx)用ACL(访问规则控制),将旧图片对应URL规则的请求(正则)匹配到,只要将请求直接转发指定的web 服务器列表,在该列表中的服务器上配置好提供图片(以Web方式)访问的站点,并加入缓存策略。太少实现旧图片服务器的分离和缓存,兼容了旧图片的访问规则并提升旧图片访问数率,也防止了实时同步所带来的大问题。

实际上:旧式的PC端IM中,诸如图片消息并都有业务形状,以前是通过长连接直接推送过去(所谓的实时图片传输嘛),并都有情況理论上是不如此服务端存储的。但现今的主流移动端IM,基于移动网络抖动大、 不稳定的形状和随时随地社交分享的现实,已很少使用实时传输并都有技术手段。现在主流IM都有本文所述的并都有:通过Http短连接从云(也太少服务端)“拉取”,并都有方式的好处是:随时随地分享、对网络稳定性要求低(只要上传者一次上传,服务端可长时间存储,下一一一两个多阅读者通过URL按需随读随取即可,再次分享时只要分享URL而不需要再次删剪传输整个图片)。

多多应用程序 员B通过Server.MapPath等方式,根据相对路径获取物理目录  只要也通过stream的方式写入文件。

《17年的实践:腾讯海量产品的技术方式论》

基于FastDFS的独立图片服务器集群架构,随便说说以前非常的性成熟 期期 图片 图片 图片 图片 ,只要以前国内“南北互联”和IDC数率成本等大问题(图片是非常消耗流量的),一帮人最终还是取舍了商用的CDN技术,实现起来也非常容易,原理随便说说也很简单,我这里只做个简单的介绍。

《一套原创分布式即时通讯(IM)系统理论架构方案》

在部署新版本(部署新版本前通过如此备份)和日常备份website文件的以前,如此一起去操作upload目录中的文件,以前考虑到访问量上升,后面 部署由多台Web服务器组成的负载均衡集群,集群节点之间以前做好文件实时同步将是个大问题。

多多应用程序 上传和写入方式:

以此类推:IM系统中,实际上还地处其它类似于于图片的小文件存储需求,比如:语音留言消息中的AMR短音频文件(或多或少IM中为了音质以前使用的是AAC音频格式,比如易信)、短视频功能中的小视频文件等,并都有文件的存储和使用跟图片文件基本类似于,太少考虑到通用性,以前能把并都有小文件存储也纳入到图片的存储架构中,对于整体系统架构来说(尤其存储次要)就显的更通用。太少本文中随便说说以图片存储为切入点,但您实际上完太少如此套用到基它小文件的存储上哦。

缺点:上传方式混乱,严重不能助 网站的扩展。

同理,只要有多台独立图片服务器,是使用可扩展的共享存储方案,还是采用实时同步机制?

《传输层安全协议SSL/TLS的Java平台实现简介和Demo演示》

初创时期以前时间紧迫,开发人员水平很有限。

一帮人都如此使用Lighttpd以前Nginx等轻量级的web服务器来架构独立图片服务器。

《QQ音乐团队分享:Android中的图片压缩技术详解(下篇)》

一一一两个多完善的IM系统中通常充斥着几瓶的图片内容,包括:用户头像、图片消息、相册、图片表情等等,如此在做服务端派发时该怎么才能 才能 存储并都有图片呢?

早期的想法是,在应用多多应用程序 层面做控制,当用户请求在web1服务器进行上传写入的一起去,也同步去调用其它web服务器上的上传接口,这显然是得不偿失的。太少一帮人取舍使用Rsync类的软件来做定时文件同步的,从而省去了“重复造轮子”的成本,也降低了风险性。

《开源IM工程“蘑菇街TeamTalk”的现状:一场有始无终的开源秀》

《蘑菇街即时通讯/IM服务器开发之架构取舍》

《微信海量用户转过身的后台系统存储架构(视频+PPT) [附件下载]》

旧图片路径和访问规则的兼容性,应用多多应用程序 层面的可扩展,上传和访问的性能和安全性等。

在构建当前的图片服务器架构以前,都如此先彻底撇开web服务器,直接配置单独的图片服务器/域名。

结果太少:

《移动端IM中大规模群消息的推送怎么才能 才能 保证数率、实时性?》

《IM消息送达保证机制实现(一):保证在线实时消息的可靠投递》

《基于社交网络的Yelp是怎么才能 才能 实现海量用户图片的无损压缩的?》

后面 的整个集群架构,都如此很方便的做横向扩展,能满足一般垂直领域中大型网站的图片服务需求(当然,像taobao太少超大规模的以前另当别论)。经测试,提供图片访问的单台Nginx服务器(至强E5四核CPU、16G内存、SSD),对小静态页面(压缩不会花费如此10kb左右的)都如此扛住几千个并发且毫无压力。当然,以前图片并都有体积比纯文本的静态页面大太少,提供图片访问的服务器的抗并发能力,往往会受限于磁盘的I/O防止能力和IDC提供的数率。Nginx的抗并发能力还是非常强的,只要对资源占用很低,尤其是防止静态资源,似乎都有如此有太少担心了。都如此根据实际访问量的需求,通过调整Nginx的参数,对Linux内核做调优,加入分级缓存策略等手段不能做更大程度的优化,也都如此通过增加服务器以前升级服务器配置来做扩展,最直接的是通过购买更高级的存储设备和更大的数率,以满足更大访问量的需求。

《现代IM系统中聊天消息的同步和存储方案探讨》

图片的加速访问。采用商用CDN以前自建的代理缓存、web静态缓存架构;

《通俗易懂:基于集群的移动端IM接入层负载均衡方案分享》

《微信新一代通信安全防止方案:基于TLS1.3的MMTLS详解》

多多应用程序 员A通过在web.config中配置物理目录D:\Web\yourdomain\upload  只要通过stream的方式写入文件;

访问图片时,请求信息中总带cookie信息,也会造成性能损失;

《移动端安全通信的利器——端到端加密(E2EE)技术详解》

《移动端IM中大规模群消息的推送怎么才能 才能 保证数率、实时性?》

《移动端IM登录时拉取数据怎么才能 才能 作到省流量?》

http://www.yourdomain.com/upload/qa/test.jpg

在高并发写入的场景中,同步都有总出 数率和实时性大问题,只要几瓶文件同步也是很消耗系统和数率资源的(跨网段则更明显)。  

同步操作后面 ,一般有比较经典的并都有模型,即推拉模型:所谓“拉”,太少指轮询地去获取更新,所谓推,太少地处更改后主动的“推”给其它机器。当然,也都如此采用加高级的事件通知机制来完成此类动作。

太少通常就直接在website文件所在的目录下,建立一一一两个多upload子目录,用于保存用户上传的图片文件:

《删剪自已开发的IM该怎么才能 才能 设计“失败重试”机制?》

《一一一两个多低成本确保IM消息时序的方式探讨》

[1] 有关IM派发:

《开发IM是或多或少人设计协议用字节流好还是字符流好?》

《IM单聊和群聊中的在线情況同步应该用“推”还是“拉”?》

《Web端即时通讯安全:跨站点WebSocket劫持漏洞详解(含示例代码)》

《IM开发基础知识补课(二):怎么才能 才能 设计几瓶图片文件的服务端存储架构?》(本文)

《即时通讯安全篇(五):对称加密技术在Android平台上的应用实践》

《微信后台基于时间序的海量数据冷热分级派发实践》

直到应用级别的(非系统级) DFS(类似于FastDFS HDFS MogileFs MooseFS、TFS)的流行,复杂化了并都有大问题:执行冗余备份、支持自动同步、支持线性扩展、支持主流语言的客户端api上传/下载/删除等操作,次要支持文件索引,次要支持提供Web的方式来访问。

浏览器(相同域名下的)并发策略限制,性能损失;

《移动端IM登录时拉取数据怎么才能 才能 作到省流量?》

《腾讯原创分享(二):怎么才能 才能 大幅压缩移动网络下APP的流量消耗(上篇)》

《怎么才能 才能 保证IM实时消息的“时序性”与“一致性”?》

(本文同步发布于:http://www.52im.net/thread-1356-1-1.html)

用户的访问方式2(都如此配置独立域名):

《浅谈IM系统的派发》

(本文同步发布于:http://www.52im.net/thread-1356-1-1.html)

《来自阿里OpenIM:打造安全可靠即时通讯服务的技术实践分享》

http://img.yourdomain.com/upload/qa/test.jpg

......

《即时通讯安全篇(六):非对称加密技术的原理与应用实践》

上述架构中如此在这几台Web服务器上互相“增量同步”,太少一来,就不支持文件的“删除、更新”操作的同步了。

《腾讯原创分享(一):怎么才能 才能 大幅提升移动网络下手机QQ的图片传输数率和成功率》

《腾讯QQ1.4亿在线用户的技术挑战和架构演进之路PPT》

图片访问是很消耗服务器资源的(以不会涉及到操作系统的上下文切换和磁盘I/O操作)。分离出来后,Web/App服务器都如此更专注发挥动态防止的能力。

《怎么才能 才能 解读《微信技术总监谈架构:微信之道——大道至简》》

整体架构如图:

《快速裂变:见证微信强大后台架构从0到1的演进历程(一)》

本文分享的是典型Web应用中几瓶图片的服务端存储加构的演进过程,但基本的技术原理和架构思路对于IM系统而言同样适用,太少在阅读时都如此根据自已IM的实际架构情況,酌情吸取适合您的内容即可。文中次要观点可作抛砖引玉之用,以前之太少最佳实践,请勿迷信之。

《IM开发基础知识补课(一):正确理解前置HTTP SSO单点登陆接口的原理》

>> 更多类似于文章 ……

当前图片服务器架构采用分布式文件系统+CDN。

但面临如下的大问题:

《浅谈移动端IM的多点登陆和消息漫游原理》

后面 提到的几种架构,在上传/下载操作时,都经过了Web服务器(随便说说共享存储的并都有架构,也都如此配置独立域名和站点来提供图片访问,但上传写入仍然得经过Web服务器上的应用多多应用程序 来防止),这对Web服务器来讲无疑是造成巨大的压力。太少,更建议使用独立的图片服务器和独立的域名,来提供用户图片的上传和访问。

《IM群聊消息如此复杂化,怎么才能 才能 保证不丢不重?》

独立存储,更方便做扩容、容灾和数据迁移;

《如约而至:微信自用的移动端IM网络层跨平台组件库Mars已正式开源》

▼ 跟IM数据存储架构有关的文章,有如下几篇,或许对你有用:

婚姻提示:正文内容派发自架构师丁浪的技术分享,次要观点可作抛砖引玉之用,以前之太少最佳实践,欢迎留言指正。

《现代IM系统中聊天消息的同步和存储方案探讨》

硬件设备的成本和可靠性(是普通机械硬盘,还是SSD,以前更高端的存储设备和方案);

防止方案如下:

用户的访问方式1:

《从零到卓越:京东客服即时通讯系统的技术架构演进历程》

文件系统的取舍。根据文件形状(类似于文件大小、读写比例等)取舍是用ext3/4以前NFS/GFS/TFS并都有开源的(分布式)文件系统;

值得一提的是,在“云计算”流行的当下,也推荐高速发展期间的网站,使用“云存储”太少的方案,既能帮你防止各类存储、扩展、备灾的大问题,又能做好CDN加速。最重要的是,价格太少贵。

《一套海量在线用户的移动端IM派发实践分享(含删剪图文)》

[2] 在数据库表中保存的也是“upload/qa/test.jpg”类似于相对路径;

《理论联系实际:一套典型的IM通信协议设计详解(含安全层设计)》

《简述实时音视频聊天中端到端加密(E2EE)的工作原理》

以前您是IM开发初学者,强烈建议首先阅读《新手入门一篇就够:从零开发移动端IM》。

以前采用了商用CDN服务,太少一帮人并如此考虑用Squid/Vanish来自行构建前置代理缓存。

支持UNC所在server上配置独立域名指向,并配置轻量级的web服务器,来实现独立图片服务器。

缺点:部署成由多台Web服务器组成的集群,各个Web服务器(集群节点)之间(虚拟目录下的)如此实时的去同步文件,以前同步数率和实时性的限制,不能自己保证某一时刻各节点上文件是删剪一致的。

数据的同步、冗余和容灾;

缺点:只要UNC配置或多或少繁琐,只要会造成一定的(读写和安全)性能损失。以不会总出 “单点故障”。以前存储级别如此raid以前更高级的灾备方式,都有造成数据丢失。

方便做图片访问请求的负载均衡,方便应用各种缓存策略(HTTP Header、Proxy Cache等),也更加方便迁移到CDN;

基本架构如下图所示:

《通俗易懂:一篇掌握即时通讯的消息传输安全原理》

从上图可看出,整个Web服务器架构以前具备“可扩展、高可用”了,主要大问题和瓶颈都集中在多台服务器之间的文件同步上。

优点:实现起来最简单,不需要任何复杂化技术,就能成功将用户上传的文件写入指定目录。保存数据库记录和访问起来倒是也很方便;

《IM消息送达保证机制实现(二):保证离线消息的可靠投递》

独立的图片服务器上如此提供单独的上传写入的接口(服务API对外发布),安全大问题怎么才能 才能 保证?

在早期的太少基于Linux开源架构的网站中,以前不需要同步图片,以不会利用NFS来实现。事实证明,NFS在高并发读写和海量存储方面,数率上地处一定大问题,之太少最佳的取舍,太少大次要互联网公司都有会使用NFS来实现此类应用。当然,也都如此通过Windows自带的DFS来实现,缺点是“配置复杂化,数率未知,只要缺乏资料几瓶的实际案例”。另外,都有或多或少公司采用FTP或Samba来实现。

《IM群聊消息如此复杂化,怎么才能 才能 保证不丢不重?》

▼ IM开发干货系列文章适合作方式方式为IM开发热点大问题参考资料(本文是其第11篇):

总结,有关图片服务器架构扩展,大致围绕并都有大问题展开:

《即时通讯系统的原理、技术和应用(技术论文)》

《谈谈移动端 IM 开发中登录请求的优化》

《IM单聊和群聊中的在线情況同步应该用“推”还是“拉”?》

《即时通讯安全篇(三):常用加解密算法与通讯安全讲解》

《微信后台基于时间序的海量数据冷热分级派发实践》

[2] 有关IM安全的文章:

>> 更多类似于文章 ……

《IM开发基础知识补课:正确理解前置HTTP SSO单点登陆接口的原理》

将img域名cname到CDN厂商指定的域名上,用户请求访问图片时,则由CDN厂商提供智能DNS解析,将最近的(当然也以前有其它更复杂化的策略,类似于负载情況、健康情況等)服务节点地址返回给用户,用户请求到达指定的服务器节点上,该节点上提供了类似于Squid/Vanish的代理缓存服务,以前是第一次请求该路径,则会从源站获取图片资源返回客户端浏览器,以前缓存中地处,则直接从缓存中获取并返回给客户端浏览器,完成请求/响应过程。

《简述移动端IM开发的并都有坑:派发、通信协议和客户端》

《并都有Android端IM智能心跳算法的设计与实现探讨(含样例代码)》

- 移动端IM开发入门文章:《新手入门一篇就够:从零开发移动端IM》

http://www.yourdomain.com/upload/qa/test.jpg

《腾讯原创分享(二):怎么才能 才能 大幅压缩移动网络下APP的流量消耗(下篇)》

《怎么才能 才能 保证IM实时消息的“时序性”与“一致性”?》

《移动端IM开发如此面对的技术大问题》

《IM消息送达保证机制实现(二):保证离线消息的可靠投递》

《浅谈移动端IM的多点登陆和消息漫游原理》

优点: 通过UNC(网络路径)的方式来进行读写操作,都如此防止多服务器之间同步相关的大问题。相对来讲很灵活,也支持扩容/扩展。支持配置成独立图片服务器和域名访问,也删剪兼容旧版本的访问规则。   

沿用虚拟目录的方式,通过UNC(网络路径)的方式实现共享存储(将upload虚拟目录指向UNC)。

[1] 以前按业务再细分,都如此在upload目录下再建立不同的子目录来区分,类似于:upload\QA,upload\Face等

《IM消息送达保证机制实现(一):保证在线实时消息的可靠投递》

《腾讯原创分享(一):怎么才能 才能 大幅提升移动网络下手机QQ的图片传输数率和成功率》

《IM开发基础知识补课(二):怎么才能 才能 设计几瓶图片文件的服务端存储架构?》

《即时通讯安全篇(一):正确地理解和使用Android端加密算法》

[3] IM开发综合文章:

考虑到各DFS的特点,客户端API语言支持情況(如此支持C#),文档和案例,以及社区的支持度,一帮人最终取舍了FastDFS来部署。

《即时通讯安全篇(四):实例分析Android中密钥硬编码的风险》

一一一两个多传统的Web服务端站点下面,新建一一一两个多名为upload的虚拟目录,以前虚拟目录的灵活性,能在一定程度上取代物理目录,并兼容原有的图片上传和访问方式。

《QQ音乐团队分享:Android中的图片压缩技术详解(上篇)》

容量规划和扩展大问题;

- 即时通讯开发交流群:320837163[推荐]

优点:配置更加灵活,不能兼容老版本的上传和访问方式。以前虚拟目录,都如此指向本地任意盘符下的任意目录。太少一来,还都如此通过接入外置存储,来进行单机的容量扩展。

>> 更多类似于文章 ……

用户的访问方式依然是:

《微信技术总监谈架构:微信之道——大道至简(演讲全文)》

针对上述最原始的架构,主要面临着如下大问题:

《通俗易懂:基于集群的移动端IM接入层负载均衡方案分享》