sbmt-outbox 6.4.3 → 6.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +7 -2
- data/app/jobs/sbmt/outbox/base_delete_stale_items_job.rb +5 -2
- data/app/models/sbmt/outbox/base_item.rb +2 -1
- data/app/models/sbmt/outbox/base_item_config.rb +15 -2
- data/lib/sbmt/outbox/v2/poller.rb +1 -1
- data/lib/sbmt/outbox/v2/processor.rb +4 -1
- data/lib/sbmt/outbox/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a86388ca6b13cdaef9411bd8baf1ea045fcc1b941721cdb8d4fb15bda4db29be
|
4
|
+
data.tar.gz: 6fbc5a6e5d62df9aaf1cf2f0afdc3cf49e8bf5ccdc0a49d86a0b8feb8e51f200
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bca4330c17aa8d6d8f6563ebc52dae02d9029fb01580b9294ffd5d20822768f95f5c41a0c5bdd733d9f6481632f44a754ce67079cf843e9cf3c58ada9f9fbb39
|
7
|
+
data.tar.gz: 3c24bf5fa9af05b1ef48f38ff20519466c5f63a47a1acbb5bf788d7e197c8af17759581c52443b8650c8ff4f3680bbd48aee3a8b224623e6097176aa284c5a11
|
data/README.md
CHANGED
@@ -122,7 +122,7 @@ Rails.application.config.outbox.tap do |config|
|
|
122
122
|
config.paths << Rails.root.join("config/outbox.yml").to_s # optional; configuration file paths, deep merged at the application start, useful with Rails engines
|
123
123
|
|
124
124
|
# optional (worker v2: default)
|
125
|
-
|
125
|
+
config.poller = ActiveSupport::OrderedOptions.new.tap do |pc|
|
126
126
|
# max parallel threads (per box-item, globally)
|
127
127
|
pc.concurrency = 6
|
128
128
|
# max threads count (per worker process)
|
@@ -152,7 +152,7 @@ Rails.application.config.outbox.tap do |config|
|
|
152
152
|
end
|
153
153
|
|
154
154
|
# optional (worker v2: default)
|
155
|
-
|
155
|
+
config.processor = ActiveSupport::OrderedOptions.new.tap do |pc|
|
156
156
|
# max threads count (per worker process)
|
157
157
|
pc.threads_count = 4
|
158
158
|
# maximum processing time of the batch, after which the batch will be considered hung and processing will be aborted
|
@@ -236,6 +236,7 @@ default: &default
|
|
236
236
|
owner: my_outbox_item_team # optional, used in Yabeda metrics
|
237
237
|
retention: P1W # retention period, https://en.wikipedia.org/wiki/ISO_8601#Durations
|
238
238
|
max_retries: 3 # default 0, the number of retries before the item will be marked as failed
|
239
|
+
strict_order: false # optional, default
|
239
240
|
transports: # transports section
|
240
241
|
produce_message: # underscored transport class name
|
241
242
|
# transport reserved options
|
@@ -255,6 +256,10 @@ production:
|
|
255
256
|
<<: *default
|
256
257
|
bucket_size: 256
|
257
258
|
```
|
259
|
+
__CAUTION__:
|
260
|
+
- ⚠️ If this option is enabled and an error occurs while processing a message in a bucket,
|
261
|
+
subsequent messages in that bucket won't be processed until the current message is either skipped or successfully processed
|
262
|
+
- ⚠️ Cannot use `retry_strategies` and the `strict_order` option at the same time
|
258
263
|
|
259
264
|
```ruby
|
260
265
|
# app/services/import_order.rb
|
@@ -64,9 +64,12 @@ module Sbmt
|
|
64
64
|
def delete_stale_items(waterline)
|
65
65
|
logger.log_info("Start deleting #{box_type} items for #{box_name} older than #{waterline}")
|
66
66
|
|
67
|
-
|
67
|
+
loop do
|
68
|
+
ids = Outbox.database_switcher.use_slave do
|
69
|
+
item_class.where("created_at < ?", waterline).limit(BATCH_SIZE).ids
|
70
|
+
end
|
71
|
+
break if ids.empty?
|
68
72
|
|
69
|
-
while (ids = scope.limit(BATCH_SIZE).ids).present?
|
70
73
|
item_class.where(id: ids).delete_all
|
71
74
|
sleep SLEEP_TIME
|
72
75
|
end
|
@@ -6,7 +6,7 @@ module Sbmt
|
|
6
6
|
self.abstract_class = true
|
7
7
|
|
8
8
|
class << self
|
9
|
-
delegate :owner, to: :config
|
9
|
+
delegate :owner, :strict_order, to: :config
|
10
10
|
|
11
11
|
def box_type
|
12
12
|
raise NotImplementedError
|
@@ -134,6 +134,7 @@ module Sbmt
|
|
134
134
|
end
|
135
135
|
|
136
136
|
def max_retries_exceeded?
|
137
|
+
return false if config.strict_order
|
137
138
|
return true unless retriable?
|
138
139
|
|
139
140
|
errors_count > config.max_retries
|
@@ -16,7 +16,7 @@ module Sbmt
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def owner
|
19
|
-
return @owner if defined?
|
19
|
+
return @owner if defined?(@owner)
|
20
20
|
|
21
21
|
@owner = options[:owner].presence || yaml_config[:owner].presence
|
22
22
|
end
|
@@ -57,7 +57,14 @@ module Sbmt
|
|
57
57
|
return @retry_strategies if defined?(@retry_strategies)
|
58
58
|
|
59
59
|
configured_strategies = options[:retry_strategies]
|
60
|
-
|
60
|
+
|
61
|
+
raise ConfigError, "You cannot use retry_strategies and the strict_order option at the same time." if strict_order.present? && configured_strategies.present?
|
62
|
+
|
63
|
+
strategies = if strict_order.present? && configured_strategies.nil?
|
64
|
+
[]
|
65
|
+
else
|
66
|
+
configured_strategies.presence || %w[exponential_backoff latest_available]
|
67
|
+
end
|
61
68
|
|
62
69
|
@retry_strategies ||= Array.wrap(strategies).map do |str_name|
|
63
70
|
"Sbmt::Outbox::RetryStrategies::#{str_name.camelize}".constantize
|
@@ -108,6 +115,12 @@ module Sbmt
|
|
108
115
|
end
|
109
116
|
end
|
110
117
|
|
118
|
+
def strict_order
|
119
|
+
return @strict_order if defined?(@strict_order)
|
120
|
+
|
121
|
+
@strict_order = options[:strict_order].presence
|
122
|
+
end
|
123
|
+
|
111
124
|
private
|
112
125
|
|
113
126
|
attr_accessor :box_id, :box_name
|
@@ -94,7 +94,7 @@ module Sbmt
|
|
94
94
|
end
|
95
95
|
end
|
96
96
|
rescue Cutoff::CutoffExceededError
|
97
|
-
box_worker.job_timeout_counter.increment(
|
97
|
+
box_worker.job_timeout_counter.increment(task.yabeda_labels)
|
98
98
|
logger.log_info("Lock timeout while processing #{task.resource_key} at id #{last_id}")
|
99
99
|
end
|
100
100
|
|
@@ -68,15 +68,18 @@ module Sbmt
|
|
68
68
|
def process(task)
|
69
69
|
lock_timer = Cutoff.new(lock_timeout)
|
70
70
|
last_id = 0
|
71
|
+
strict_order = task.item_class.config.strict_order
|
71
72
|
|
72
73
|
box_worker.item_execution_runtime.measure(task.yabeda_labels) do
|
73
74
|
Outbox.database_switcher.use_master do
|
74
75
|
task.ids.each do |id|
|
75
|
-
ProcessItem.call(task.item_class, id, worker_version: task.yabeda_labels[:worker_version])
|
76
|
+
result = ProcessItem.call(task.item_class, id, worker_version: task.yabeda_labels[:worker_version])
|
76
77
|
|
77
78
|
box_worker.job_items_counter.increment(task.yabeda_labels)
|
78
79
|
last_id = id
|
79
80
|
lock_timer.checkpoint!
|
81
|
+
|
82
|
+
break if strict_order == true && result.failure?
|
80
83
|
end
|
81
84
|
end
|
82
85
|
end
|
data/lib/sbmt/outbox/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sbmt-outbox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.
|
4
|
+
version: 6.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sbermarket Ruby-Platform Team
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-06-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: connection_pool
|