2016-09-17 127 views
0

我有我的“分布式系统开发”类的项目,并且我的项目正在制作一个最小版本的云存储(就像Google Drive一样)。在2个数据库之间共享1个存储库

我这里的做法是用2个用Rails编写的后端服务器,用1个代理服务器来控制发送到服务器的请求,2个带有主从复制关系的Postgres服务器。

但这里的问题是如何存储真正的资产(视频,pdf,MP3 ...)。我没有这方面的经验。

示例: 如果1个用户打开2个浏览器选项卡,然后在每个选项卡中他将1个具有相同名称的视频上传到1个目录,会发生什么情况?

enter image description here

+0

当您同时上传两个视频时,您预期结果如何?一个成功,一个失败?都成功video_file.mp4和video_file(2).mp4 ...? – RedGlobe

+0

重命名,或只锁定上传1个请求,我仍在决定。那么,哪种方式更好(或者更容易归档)? – user3448806

回答

1

因为你很可能希望异步上传,这是很容易处理:上传(即文件名+哈希)之前产生某种令牌,然后用手上传关闭的延迟工作。如果用户尝试上传第二个文件,它将生成相同的标记并被拒绝。

跟踪数据库中上载的示例。在开始上传之前生成记录并保存文件名和散列。

Asset.create(filename: ..., hash: ...) 

一旦上传完成后,您可以更新与S3网址或任何你用于存储的记录(通过资产ID来延迟工作)。验证很容易:

validates uniqueness: { scope: :filename } 
+0

感谢:D但是这种情况如何:2浏览器标签(或2浏览器)以2种方式(代理 - >导轨服务器1 - > postgres 1;代理 - >导航服务器2 - > postgres 2)发出请求,并由于网络问题,那么会有2个令牌? Sr对于这个问题,但我真的很新:( – user3448806

+1

你描述你的数据库的方式我认为奴隶将只读,写入只会发生在主人。无论是否是这种情况,你的上传跟踪需要一个或者让你的文件存储器处理它(例如,如果你上传到S3并为每次上传尝试生成相同的密钥,那么你的文件将不会被存储两次) –

+0

噢,是的,只有主控制器是可写的,sr忘了吧:)这只是一个课程项目,所以我只用本地网络做一些虚拟机的演示。 (没有像S3这样的外部服务) – user3448806

相关问题