Active Storage Mirror Service¶ ↑
封装了一组镜像服务,并提供了一个单一的 ActiveStorage::Service 对象,所有文件都将上传到这些服务。一个 primary 服务被指定用来响应调用
-
下载 (download) -
exists? -
URL (url) -
url_for_direct_upload -
headers_for_direct_upload
方法
- D
- M
- N
- U
Attributes
| [R] | 镜像列表 | |
| [R] | 主服务 |
类公共方法
new(primary:, mirrors:) 链接
来源: 显示 | 在 GitHub 上
# File activestorage/lib/active_storage/service/mirror_service.rb, line 30 def initialize(primary:, mirrors:) @primary, @mirrors = primary, mirrors @executor = Concurrent::ThreadPoolExecutor.new( name: "ActiveStorage-mirror-service", min_threads: 1, max_threads: mirrors.size, max_queue: 0, fallback_policy: :caller_runs, idle_time: 60 ) end
实例公共方法
delete(key) 链接
从所有服务中删除 key 处的文件。
来源: 显示 | 在 GitHub 上
# File activestorage/lib/active_storage/service/mirror_service.rb, line 52 def delete(key) perform_across_services :delete, key end
delete_prefixed(prefix) 链接
从所有服务中删除以 prefix 开头的键的文件。
来源: 显示 | 在 GitHub 上
# File activestorage/lib/active_storage/service/mirror_service.rb, line 57 def delete_prefixed(prefix) perform_across_services :delete_prefixed, prefix end
mirror(key, checksum:) 链接
将主服务中 key 处的文件复制到每个尚不存在该文件的镜像中。
来源: 显示 | 在 GitHub 上
# File activestorage/lib/active_storage/service/mirror_service.rb, line 66 def mirror(key, checksum:) instrument :mirror, key: key, checksum: checksum do if (mirrors_in_need_of_mirroring = mirrors.select { |service| !service.exist?(key) }).any? primary.open(key, checksum: checksum) do |io| mirrors_in_need_of_mirroring.each do |service| io.rewind service.upload key, io, checksum: checksum end end end end end
upload(key, io, checksum: nil, **options) 链接
将 io 上传到指定的 key,上传到所有服务。主服务的上传是同步进行的,而镜像服务的上传是异步进行的。如果提供了 checksum,所有服务将在上传完成后确保匹配,否则将引发 ActiveStorage::IntegrityError。
来源: 显示 | 在 GitHub 上
# File activestorage/lib/active_storage/service/mirror_service.rb, line 45 def upload(key, io, checksum: nil, **options) io.rewind primary.upload key, io, checksum: checksum, **options mirror_later key, checksum: checksum end