在 2 个数据库之间共享 1 个存储库
Share 1 storage repository between 2 database
我有我的 "distributed system development" class 项目,我的项目正在制作一个最小版本的云存储(比如 Google 驱动器)。
我这里的做法是用Rails写的2台后端服务器,1台代理服务器控制发送到服务器的请求,2台两台具有主从复制关系的Postgres服务器。
但这里的问题是如何存储真实资产(视频、pdf、mp3 ...)。我没有这方面的经验。
示例:
如果 1 个用户打开 2 个浏览器选项卡,然后在每个选项卡中他将 1 个同名视频上传到 1 个目录,会发生什么情况?
由于您可能想要异步上传,这很容易处理:在上传之前生成某种令牌(即文件名 + 哈希),然后将上传交给延迟的作业。如果用户尝试上传第二个文件,它将生成相同的令牌并被拒绝。
跟踪数据库中上传的示例。在上传开始前生成一条记录并保存文件名和哈希值。
Asset.create(filename: ..., hash: ...)
上传完成后,您可以使用 S3 URL 或您用于存储的任何内容更新记录(将资产 ID 传递给延迟的作业)。然后验证很容易:
validates uniqueness: { scope: :filename }
我有我的 "distributed system development" class 项目,我的项目正在制作一个最小版本的云存储(比如 Google 驱动器)。
我这里的做法是用Rails写的2台后端服务器,1台代理服务器控制发送到服务器的请求,2台两台具有主从复制关系的Postgres服务器。
但这里的问题是如何存储真实资产(视频、pdf、mp3 ...)。我没有这方面的经验。
示例: 如果 1 个用户打开 2 个浏览器选项卡,然后在每个选项卡中他将 1 个同名视频上传到 1 个目录,会发生什么情况?
由于您可能想要异步上传,这很容易处理:在上传之前生成某种令牌(即文件名 + 哈希),然后将上传交给延迟的作业。如果用户尝试上传第二个文件,它将生成相同的令牌并被拒绝。
跟踪数据库中上传的示例。在上传开始前生成一条记录并保存文件名和哈希值。
Asset.create(filename: ..., hash: ...)
上传完成后,您可以使用 S3 URL 或您用于存储的任何内容更新记录(将资产 ID 传递给延迟的作业)。然后验证很容易:
validates uniqueness: { scope: :filename }