项目背景
在一些软件的使用场景中,比如阅读软件,我们需要存储大量的数据封面图片、客户的下载书籍等,对于这类情形,可以统一归类为海量小文件的存储问题,在Linux系统中,如果直接进行存储,会导致存储的文件比较分散,影响存储效率。在项目中我们使用Fastdfs来进行文件的上传和下载。
Fastdfs是一种分布式的文件系统,主要由客户端、跟踪服务器和存储服务器组成,客户端主要负责文件的上传下载和删除等操作,跟踪服务器主要负责任务的调度工作,起到负载均衡的作用,存储服务器主要提供容量和备份服务。
项目介绍
图床项目是一个可以允许用户上传、下载文件和图片以及分享图片的平台。使用Fastdfs架构存储图片和文件,使用MySQL、redis实现性能的优化。
客户端登陆web服务器,可以在web界面进行文件和图片的上传下载功能,当有多个客户端进行请求操作时,通过nginx的反向代理功能,将客户端的请求转发给后端服务器,并将后端服务器的请求返回给客户端,分担后端服务器的负载,提高项目的性能,在网络模型部分使用reactor网络模型来处理请求,将处理后的请求封装成任务放入任务队列中,通过线程池来获取任务并执行,通过redis和mysql数据库的联合使用来提升和优化项目的性能,其中数据库中存储文件相关的信息,比如用户名、文件名、文件大小、文件的md5值、文件的url等,根据不同数据库的性质,MySQL作为持久化的数据存储,负责存储所有的业务,处理复杂的业务,以及长期的数据保留,redis作为高速缓存和消息代理,负责高频的读写操作,减轻MySQL的负担,提高系统的响应速度。数据库的连接都使用连接池进行实现,减少了频繁创建销毁连接的开销,redis数据库用来实现某些特定的功能,比如存储用户的token,通过设置过期时间到期销毁token让用户退出登陆,来保证数据的安全,以及使用redis中的有序集合来保存用户下载排量来进行快速排序。
应用技术
reactor网络模型、线程池、连接池、Http API+ Json、MySQL、redis、fastdfs、nginx
项目流程
1:实现reactor网络模型、线程池、连接池
2:使用fastdfs存储文件和图片,结合nginx-upload-module、nginx-fastdfs-modul实现文件的上传下载
3:通过MySQL维护图床用户信息、文件信息、共享文件和图片分享信息,使用索引最左匹配原则优化索引。
4:支持文件秒传功能
5:支持图片分享功能,并使用短链接优化分享长链接的长度
6:使用redis存储共享下载排行榜、用户token、图片分享id对应的实际图片url,缓解MySQL主数据库的读写压力
7:采用wrk+lua压力测试http接口的qps
参考连接