ruby-fog:在少于 3 个请求的情况下从对象存储中删除一个项目

ruby-fog: Delete an item from the object storage in less than 3 requests

我开始在一个项目中使用雾存储。我做最简单的动作:上传一个对象,获取对象,删除对象。我的代码看起来像这样:

storage = get_storage(...) // S3 / OpenStack / ...
dir = storage.directories.get(bucket) # 1st request
if !dir.nil?
  dir.files.create(key: key, body: body) # 2nd request

  # or:
  dir.files.get(key) # 2nd request

  #or
  file = dir.files.get(key) # 2nd request
  if !file.nil?
    file.destroy # 3rd request
  end
end

在所有情况下,第一步都是获取目录,它向存储引擎发出请求(如果目录不存在,它 returns 为零)。

然后还有一个步骤可以做我想做的任何事情(如果删除,中间甚至还有第 3 步)。

但是,如果我看一下 Amazon S3 API,很明显删除一个对象不需要向 amazon 发出 3 个请求。

有没有办法在使用雾的同时减少对存储提供商的请求?

我认为这已经在邮件列表中得到了答复,但是如果您在 directories/files 上使用 #new,它只会给您一个本地参考(对比 #get 进行查找).这应该可以满足您的需求,但如果文件或目录不存在,它可能会引发错误。

像这样:

storage = get_storage(...) // S3 / OpenStack / ...
dir = storage.directories.new(key: bucket)

dir.files.create(key: key, body: body) # 1st request

# or:
dir.files.get(key) # 1st request

#or
file = dir.files.new(key)

if !file.nil?
  file.destroy # 1st request
end

以这种方式工作应该允许 3 种模式中的任何一种在单个请求中工作,但如果存储桶不存在可能会导致错误(因为尝试将文件添加到不存在的存储桶是错误的) .所以它更有效,但需要不同的错误处理。相反,如果您需要确定,您可以提出额外的要求。