Class: JPSClient::UploadConfig

Inherits:
Object
  • Object
show all
Defined in:
lib/jpsclient/upload/upload_config.rb

Overview

上传配置类

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(region: nil, bucket_name: nil, default_url: nil, attach_url: nil, upload_type: nil, concurrent_workers: nil, chunk_size_mb: nil, max_retry_times: nil, timeout_seconds: nil, media_region: nil, media_bucket_name: nil, media_default_url: nil) ⇒ UploadConfig

Returns a new instance of UploadConfig.



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/jpsclient/upload/upload_config.rb', line 19

def initialize(
  region: nil,
  bucket_name: nil,
  default_url: nil,
  attach_url: nil,
  upload_type: nil,
  concurrent_workers: nil,
  chunk_size_mb: nil,
  max_retry_times: nil,
  timeout_seconds: nil,
  media_region: nil,
  media_bucket_name: nil,
  media_default_url: nil
)
  @region = region
  @bucket_name = bucket_name
  @default_url = default_url
  @attach_url = attach_url
  @upload_type = upload_type
  @concurrent_workers = concurrent_workers
  @chunk_size_mb = chunk_size_mb
  @max_retry_times = max_retry_times
  @timeout_seconds = timeout_seconds
  @media_region = media_region
  @media_bucket_name = media_bucket_name
  @media_default_url = media_default_url
end

Instance Attribute Details

#attach_urlObject

Returns the value of attribute attach_url.



9
10
11
# File 'lib/jpsclient/upload/upload_config.rb', line 9

def attach_url
  @attach_url
end

#bucket_nameObject

Returns the value of attribute bucket_name.



7
8
9
# File 'lib/jpsclient/upload/upload_config.rb', line 7

def bucket_name
  @bucket_name
end

#chunk_size_mbObject

分片大小(MB)



12
13
14
# File 'lib/jpsclient/upload/upload_config.rb', line 12

def chunk_size_mb
  @chunk_size_mb
end

#concurrent_workersObject

并发上传工作线程数



11
12
13
# File 'lib/jpsclient/upload/upload_config.rb', line 11

def concurrent_workers
  @concurrent_workers
end

#default_urlObject

Returns the value of attribute default_url.



8
9
10
# File 'lib/jpsclient/upload/upload_config.rb', line 8

def default_url
  @default_url
end

#max_retry_timesObject

每个分片的最大重试次数



13
14
15
# File 'lib/jpsclient/upload/upload_config.rb', line 13

def max_retry_times
  @max_retry_times
end

#media_bucket_nameObject

媒体文件存储桶



16
17
18
# File 'lib/jpsclient/upload/upload_config.rb', line 16

def media_bucket_name
  @media_bucket_name
end

#media_default_urlObject

媒体文件默认路径



17
18
19
# File 'lib/jpsclient/upload/upload_config.rb', line 17

def media_default_url
  @media_default_url
end

#media_regionObject

媒体文件上传区域



15
16
17
# File 'lib/jpsclient/upload/upload_config.rb', line 15

def media_region
  @media_region
end

#regionObject

Returns the value of attribute region.



6
7
8
# File 'lib/jpsclient/upload/upload_config.rb', line 6

def region
  @region
end

#timeout_secondsObject

单个分片的超时时间(秒)



14
15
16
# File 'lib/jpsclient/upload/upload_config.rb', line 14

def timeout_seconds
  @timeout_seconds
end

#upload_typeObject

上传类型



10
11
12
# File 'lib/jpsclient/upload/upload_config.rb', line 10

def upload_type
  @upload_type
end

Class Method Details

.determine_concurrent_workers(config_value) ⇒ Object

智能确定并发工作线程数策略:使用 min(CPU自适应值, 配置最大值)



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/jpsclient/upload/upload_config.rb', line 72

def self.determine_concurrent_workers(config_value)
  cpu_count = Etc.nprocessors

  # 根据CPU计算推荐值(I/O密集型任务,使用CPU核心数的2倍)
  cpu_recommended = cpu_count * 2

  # 处理不同的配置值
  if config_value.nil?
    # 没有配置,使用CPU推荐值,但限制在4-16之间
    return [[cpu_recommended, 4].max, 16].min
  elsif config_value.to_s.downcase == 'auto'
    # 自动模式:使用CPU推荐值,限制在4-16之间
    return [[cpu_recommended, 4].max, 16].min
  elsif config_value.is_a?(String) && config_value.include?('cpu')
    # 支持 "cpu*2", "cpu*3" 这样的配置
    if config_value =~ /cpu\s*\*\s*(\d+)/
      multiplier = $1.to_i
      calculated = cpu_count * multiplier
      # 限制在 2-30 之间
      return [[calculated, 2].max, 30].min
    end
  end

  # 配置值是数字时,作为最大限制
  max_workers = config_value.to_i
  if max_workers > 0
    # 实际使用:min(CPU推荐值, 配置最大值)
    # 但至少保证2个线程
    actual_workers = [cpu_recommended, max_workers].min
    return [actual_workers, 2].max
  end

  # 默认值
  return 5
end

.from_json(json_config) ⇒ Object

从 JSON 配置创建实例



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/jpsclient/upload/upload_config.rb', line 48

def self.from_json(json_config)
  return nil unless json_config

  # 动态计算并发数
  concurrent_workers = determine_concurrent_workers(json_config['concurrent_workers'])

  new(
    region: json_config['region'] || "ap-southeast-1",
    bucket_name: json_config['bucket_name'] || "pgy-resource-new",
    default_url: json_config['default_url'] || "resource/",
    attach_url: json_config['attach_url'] || "attach_file/",
    upload_type: json_config['upload_type'] || "s3",
    concurrent_workers: concurrent_workers,
    chunk_size_mb: json_config['chunk_size_mb'] || 10,
    max_retry_times: json_config['max_retry_times'] || 6,  # 每个分片重试6次
    timeout_seconds: json_config['timeout_seconds'] || 600,  # 单个分片超时10分钟
    media_region: json_config['media_region'] || "ap-east-1",
    media_bucket_name: json_config['media_bucket_name'] || "jps-resource",
    media_default_url: json_config['media_default_url'] || "resource/"
  )
end

Instance Method Details

#chunk_size_bytesObject

获取分片大小(字节)



118
119
120
# File 'lib/jpsclient/upload/upload_config.rb', line 118

def chunk_size_bytes
  @chunk_size_mb * 1024 * 1024
end

#to_hObject

转换为 Hash



123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# File 'lib/jpsclient/upload/upload_config.rb', line 123

def to_h
  {
    'region' => @region,
    'bucket_name' => @bucket_name,
    'default_url' => @default_url,
    'attach_url' => @attach_url,
    'upload_type' => @upload_type,
    'concurrent_workers' => @concurrent_workers,
    'chunk_size_mb' => @chunk_size_mb,
    'max_retry_times' => @max_retry_times,
    'timeout_seconds' => @timeout_seconds,
    'media_region' => @media_region,
    'media_bucket_name' => @media_bucket_name,
    'media_default_url' => @media_default_url
  }
end

#valid?Boolean

验证配置完整性注意:移除了对 access_key_id 和 access_key_secret 的验证因为客户端使用预签名 URL,不直接使用 AWS 凭证AWS 凭证由 JPS 服务器端管理

Returns:

  • (Boolean)


112
113
114
115
# File 'lib/jpsclient/upload/upload_config.rb', line 112

def valid?
  !@region.nil? && !@bucket_name.nil? &&
  !@default_url.nil? && !@attach_url.nil?
end