# /

# 命名规划

严格区分文件、目录、路径、名称。

docFile---------表示doc对象(File)
docFileDir------表示doc所在目录对象(File)
docFilePath-----表示doc路径(String)
docFileDirPath--表示doc所在目录路径(String)
docFileName-----表示doc名称(String)
docFileDirName--表示doc所在目录名称(String)

# 路径规划

原始文件目录:/upload/
临时文件目录:/clouder/temporary/
文档本地目录:/clouder/document/
图片本地目录:/clouder/picture/
页面本地目录:/clouder/page/

# 错误/异常规划

1、采用具体异常类,比如:拷贝写异常、移动写异常、新增写异常、下载写异常、推送写异常、克隆写异常。
2、项目中的异常处理(分层架构):
控制层,不用考虑异常,下图。
业务层,需要考虑异常,捕获异常并抛出自定义异常,再统一交给异常工具类评估。
工具层,不用考虑异常,直接抛给业务层处理。
image.png

# 图床规划

1、背景:一个文档分配一个图片文件夹;兼容文档重命名时,图片文件夹不变。
2、索引的基本架构:使用“哈希桶组”作为一级索引,使用“有序队列”作为二级索引。
3、索引的具体实现:
使用完整的哈希值作为哈希桶组,长度为2^32(21亿)。如果存放在一个索引文件中,文件过大,还需要对索引进行分层。由于产品的定位不是大型图床,不采用此方案。
使用长度为62^3的哈希桶组作为一级索引,每个桶分配62个小桶。大概可容纳1500万个文档,个人文档库一般不超过1万。这样索引文件只有100K,适合个人图床,决定采用此方案。
4、怎么避免图片覆盖?

每个桶只分配62个小桶。如果用户的文档非常多,某个桶的冲突超过62次且文档中的图片名称相同,则会出现图片覆盖。

(1)通过图片前缀来避免图片覆盖,每次文档重命名都会造成图片浪费,不采用此方案。
(2)让用户自行保证图片名称唯一,以避免图片覆盖,不采用此方案。
(3)直接限制每个小桶只能存放61个文档的图片(哈希冲突达到61次后提醒),以避免图片覆盖。由于是个人图床,决定采用此方案。
5、怎么保证索引文件的原子性?
(1)如果要保证两个文件(一级索引index1与二级索引index2)同时写入成功,锁定时间太长。
(2)二级索引index2依赖一级索引index1,但多个二级索引index2之间并不相互依赖。因此不用同时锁定两个索引文件,一级索引index1二级索引index2各自使用一把锁。
6、怎么保证文档的一致性?
(1)发现异常,写操作需要回滚,读操作无需回滚。
(2)每个文档保存一个操作列表用于回滚。
(3)文档在回滚的过程中,二级索引index2要锁定。