sidekiq-throttled 1.5.1 → 1.5.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7a601fd050b147fd24ab88416d29273f0cca950c7e540c6303e1c0bb9c47f66d
4
- data.tar.gz: 72ebc4a88c60c09faa9922c4f305fbe4374a90ebcafa62f149b83cbae6a356a6
3
+ metadata.gz: 07f60ab84ab53725f6189d8a142ccb7d5596ea408a5d52087e2665420c92a276
4
+ data.tar.gz: 489d3d9a5a72dc20af8295d6942d4abdc9a27dfffdf917b753a08af78184d59e
5
5
  SHA512:
6
- metadata.gz: a41505e78b80af968f4aa3ab5076298d8acb62ab4b79046bbb8ff3d7cdb83d456546d066c3c431033418d5754b300cb16c30443b4f66bf82c30b14c5043b3ab4
7
- data.tar.gz: 95b3c4839f01711aa6ff3fca8f390ab49981f7e7cf1cf3cd9c289276f945943ada4a3ec9adf96413cf1435f58fe9ea8c08f2b31fc3133e4fbbfca646d0c677b0
6
+ metadata.gz: bac5ad071e0de8913f80f8c78cec87ee98c61da77a48c46000ba3680f0eeb684b2970c69d256b61cf5d1b680121f2762a0ae3c9220729ee25140ba6cbf3f9598
7
+ data.tar.gz: 92d08e2c0f76716816385b24df2c06092fa416ceb22714657967e2e312fe04357000db45fc18ee4f99d5eab57b6c267d93556a8064cb704478590b457ec48f2f
data/README.adoc CHANGED
@@ -262,6 +262,33 @@ IMPORTANT: Don't forget to specify `:key_suffix` and make it return different
262
262
  values if you are using dynamic limit/period options. Otherwise, you risk
263
263
  getting into some trouble.
264
264
 
265
+ [source,ruby]
266
+ ----
267
+ class MyJob
268
+ include Sidekiq::Job
269
+ include Sidekiq::Throttled::Job
270
+
271
+ sidekiq_options queue: :my_queue
272
+
273
+ sidekiq_throttle(
274
+ concurrency: { limit: 10 },
275
+ # Allow 500 jobs per minute, 5,000 per hour, and 50,000 per day:
276
+ threshold: [
277
+ { limit: 500, period: 1.minute, key_suffix: "minutely" },
278
+ { limit: 5_000, period: 1.hour, key_suffix: "hourly" },
279
+ { limit: 50_000, period: 1.day, key_suffix: "daily" },
280
+ ]
281
+ )
282
+
283
+ def perform(project_id, user_id)
284
+ # ...
285
+ end
286
+ end
287
+ ----
288
+
289
+ NOTE: `key_suffix` does not have to be a proc/lambda, it can just be a
290
+ string value. This can come in handy to set throttle limits for different
291
+ ranges of time
265
292
 
266
293
  === Concurrency throttling fine-tuning
267
294
 
@@ -143,24 +143,27 @@ module Sidekiq
143
143
  when NilClass
144
144
  work.queue
145
145
  when String, Symbol
146
- requeue_to.to_s
146
+ requeue_to
147
147
  else
148
148
  raise ArgumentError, "Invalid argument for `to`"
149
149
  end
150
150
 
151
151
  target = work.queue if target.nil? || target.empty?
152
152
 
153
- target.start_with?("queue:") ? target : "queue:#{target}"
153
+ target.to_s
154
154
  end
155
155
 
156
156
  # Push the job back to the head of the queue.
157
+ # The queue name is expected to include the "queue:" prefix, so we add it if it's missing.
157
158
  def re_enqueue_throttled(work, target_queue)
159
+ target_queue = "queue:#{target_queue}" unless target_queue.start_with?("queue:")
160
+
158
161
  case work.class.name
159
162
  when "Sidekiq::Pro::SuperFetch::UnitOfWork"
160
163
  # Calls SuperFetch UnitOfWork's requeue to remove the job from the
161
164
  # temporary queue and push job back to the head of the target queue, so that
162
165
  # the job won't be tried immediately after it was requeued (in most cases).
163
- work.queue = target_queue if target_queue
166
+ work.queue = target_queue
164
167
  work.requeue
165
168
  else
166
169
  # This is the same operation Sidekiq performs upon `Sidekiq::Worker.perform_async` call.
@@ -168,10 +171,13 @@ module Sidekiq
168
171
  end
169
172
  end
170
173
 
174
+ # Reschedule the job to be executed later in the target queue.
175
+ # The queue name should NOT include the "queue:" prefix, so we remove it if it's present.
171
176
  def reschedule_throttled(work, target_queue)
172
- message = JSON.parse(work.job)
173
- job_class = message.fetch("wrapped") { message.fetch("class") { return false } }
174
- job_args = message["args"]
177
+ target_queue = target_queue.delete_prefix("queue:")
178
+ message = JSON.parse(work.job)
179
+ job_class = message.fetch("wrapped") { message.fetch("class") { return false } }
180
+ job_args = message["args"]
175
181
 
176
182
  # Re-enqueue the job to the target queue at another time as a NEW unit of work
177
183
  # AND THEN mark this work as done, so SuperFetch doesn't think this instance is orphaned
@@ -179,6 +185,7 @@ module Sidekiq
179
185
  # but your job should be idempotent anyway, right?
180
186
  # The job running twice was already a risk with SuperFetch anyway and this doesn't really increase that risk.
181
187
  Sidekiq::Client.enqueue_to_in(target_queue, retry_in(work), Object.const_get(job_class), *job_args)
188
+
182
189
  work.acknowledge
183
190
  end
184
191
 
@@ -43,7 +43,7 @@ module Sidekiq
43
43
 
44
44
  # @return [Float] How long, in seconds, before we'll next be able to take on jobs
45
45
  def retry_in(*args)
46
- max { |s| s.retry_in(*args) }
46
+ map { |s| s.retry_in(*args) }.max
47
47
  end
48
48
 
49
49
  # Marks job as being processed.
@@ -3,6 +3,6 @@
3
3
  module Sidekiq
4
4
  module Throttled
5
5
  # Gem version
6
- VERSION = "1.5.1"
6
+ VERSION = "1.5.2"
7
7
  end
8
8
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq-throttled
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.1
4
+ version: 1.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexey Zapparov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-12-09 00:00:00.000000000 Z
11
+ date: 2025-01-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -90,9 +90,9 @@ licenses:
90
90
  - MIT
91
91
  metadata:
92
92
  homepage_uri: https://github.com/ixti/sidekiq-throttled
93
- source_code_uri: https://github.com/ixti/sidekiq-throttled/tree/v1.5.1
93
+ source_code_uri: https://github.com/ixti/sidekiq-throttled/tree/v1.5.2
94
94
  bug_tracker_uri: https://github.com/ixti/sidekiq-throttled/issues
95
- changelog_uri: https://github.com/ixti/sidekiq-throttled/blob/v1.5.1/CHANGES.md
95
+ changelog_uri: https://github.com/ixti/sidekiq-throttled/blob/v1.5.2/CHANGES.md
96
96
  rubygems_mfa_required: 'true'
97
97
  post_install_message:
98
98
  rdoc_options: []
@@ -109,7 +109,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  requirements: []
112
- rubygems_version: 3.4.22
112
+ rubygems_version: 3.5.22
113
113
  signing_key:
114
114
  specification_version: 4
115
115
  summary: Concurrency and rate-limit throttling for Sidekiq