sidekiq-throttled 1.5.1 → 1.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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