sbmt-outbox 6.13.1 → 6.14.0
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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2616bf630410714a263f3eea95a7c98af5568018386d0792b8af8ac8de9572b2
|
4
|
+
data.tar.gz: 711b190d7c2d45ae1e66f07e60d9742fea6d2f9d0eae07431756da99bbc71e83
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8af881dffaa9802491a6764f471a6fedaac2ea5766e1f2c6749a1b6f5523f74f5f2239025b6d1e48fd985243556569b1670ed80d5aeb92f0a40ae67c2254a777
|
7
|
+
data.tar.gz: 543ad28b03629931934332ef0f62a6190a90159c0aa45ef3800c09472a824bfd474f270a5c9d27df2879ace34d2f03bbc92206381476568313254cf8db34a70a
|
data/README.md
CHANGED
@@ -267,8 +267,12 @@ default: &default
|
|
267
267
|
outbox_items: # outbox items section
|
268
268
|
my_outbox_item: # underscored model class name
|
269
269
|
owner: my_outbox_item_team # optional, used in Yabeda metrics
|
270
|
-
retention: P1W # for statuses: failed and discarded, retention period, https://en.wikipedia.org/wiki/ISO_8601#Durations
|
271
|
-
|
270
|
+
retention: P1W #optional, default: P1W, for statuses: failed and discarded, retention period, https://en.wikipedia.org/wiki/ISO_8601#Durations
|
271
|
+
min_retention_period: P1D #optional, default: P1D, for statuses: failed and discarded, retention period, https://en.wikipedia.org/wiki/ISO_8601#Durations
|
272
|
+
retention_delivered_items: PT6H #optional, default: P1W, for statuses: delivered, retention period for delivered items, https://en.wikipedia.org/wiki/ISO_8601#Durations
|
273
|
+
delivered_min_retention_period: PT1H #optional, default: PT1H, for statuses: delivered, retention period for delivered items, https://en.wikipedia.org/wiki/ISO_8601#Durations
|
274
|
+
deletion_batch_size: 1_000 #optional, default: 1_000
|
275
|
+
deletion_sleep_time: 0.5 #optional, default: 0.5
|
272
276
|
max_retries: 3 # default 0, the number of retries before the item will be marked as failed
|
273
277
|
strict_order: false # optional, default
|
274
278
|
transports: # transports section
|
@@ -343,8 +347,12 @@ end
|
|
343
347
|
inbox_items: # inbox items section
|
344
348
|
my_inbox_item: # underscored model class name
|
345
349
|
owner: my_inbox_item_team # optional, used in Yabeda metrics
|
346
|
-
retention: P1W # for statuses: failed and discarded, retention period, https://en.wikipedia.org/wiki/ISO_8601#Durations
|
347
|
-
|
350
|
+
retention: P1W #optional, default: P1W, for statuses: failed and discarded, retention period, https://en.wikipedia.org/wiki/ISO_8601#Durations
|
351
|
+
min_retention_period: P1D #optional, default: P1D, for statuses: failed and discarded, retention period, https://en.wikipedia.org/wiki/ISO_8601#Durations
|
352
|
+
retention_delivered_items: PT6H #optional, default: P1W, for statuses: delivered, retention period for delivered items, https://en.wikipedia.org/wiki/ISO_8601#Durations
|
353
|
+
delivered_min_retention_period: PT1H #optional, default: PT1H, for statuses: delivered, retention period for delivered items, https://en.wikipedia.org/wiki/ISO_8601#Durations
|
354
|
+
deletion_batch_size: 1_000 #optional, default: 1_000
|
355
|
+
deletion_sleep_time: 0.5 #optional, default: 0.5
|
348
356
|
max_retries: 3 # default 0, the number of retries before the item will be marked as failed
|
349
357
|
transports: # transports section
|
350
358
|
import_order: # underscored transport class name
|
@@ -5,10 +5,7 @@ require "redlock"
|
|
5
5
|
module Sbmt
|
6
6
|
module Outbox
|
7
7
|
class BaseDeleteStaleItemsJob < Outbox.active_job_base_class
|
8
|
-
MIN_RETENTION_PERIOD = 1.day
|
9
8
|
LOCK_TTL = 10_800_000
|
10
|
-
BATCH_SIZE = 1_000
|
11
|
-
SLEEP_TIME = 0.5
|
12
9
|
|
13
10
|
class << self
|
14
11
|
def enqueue
|
@@ -45,7 +42,7 @@ module Sbmt
|
|
45
42
|
duration_failed = item_class.config.retention
|
46
43
|
duration_delivered = item_class.config.retention_delivered_items
|
47
44
|
|
48
|
-
validate_retention!(duration_failed)
|
45
|
+
validate_retention!(duration_delivered, duration_failed)
|
49
46
|
|
50
47
|
logger.with_tags(box_type: box_type, box_name: box_name) do
|
51
48
|
delete_stale_items(Time.current - duration_failed, Time.current - duration_delivered)
|
@@ -60,10 +57,22 @@ module Sbmt
|
|
60
57
|
|
61
58
|
private
|
62
59
|
|
63
|
-
def validate_retention!(duration_failed)
|
64
|
-
|
60
|
+
def validate_retention!(duration_delivered, duration_failed)
|
61
|
+
validate_retention_for!(
|
62
|
+
duration: duration_delivered,
|
63
|
+
min_period: item_class.config.delivered_min_retention_period,
|
64
|
+
error_message: "Retention period for #{box_name} must be longer than #{item_class.config.delivered_min_retention_period.inspect}"
|
65
|
+
)
|
66
|
+
|
67
|
+
validate_retention_for!(
|
68
|
+
duration: duration_failed,
|
69
|
+
min_period: item_class.config.min_retention_period,
|
70
|
+
error_message: "Retention period for #{box_name} must be longer than #{item_class.config.min_retention_period.inspect}"
|
71
|
+
)
|
72
|
+
end
|
65
73
|
|
66
|
-
|
74
|
+
def validate_retention_for!(duration:, min_period:, error_message:)
|
75
|
+
raise error_message if duration < min_period
|
67
76
|
end
|
68
77
|
|
69
78
|
def delete_stale_items(waterline_failed, waterline_delivered)
|
@@ -111,7 +120,7 @@ module Sbmt
|
|
111
120
|
subquery = table
|
112
121
|
.project(table[:id])
|
113
122
|
.where(condition)
|
114
|
-
.take(
|
123
|
+
.take(item_class.config.deletion_batch_size)
|
115
124
|
|
116
125
|
delete_statement = Arel::Nodes::DeleteStatement.new
|
117
126
|
delete_statement.relation = table
|
@@ -131,7 +140,7 @@ module Sbmt
|
|
131
140
|
logger.log_info("Deleted #{deleted_count} #{box_type} items for #{box_name} items")
|
132
141
|
break if deleted_count == 0
|
133
142
|
lock_timer.checkpoint!
|
134
|
-
sleep(
|
143
|
+
sleep(item_class.config.deletion_sleep_time)
|
135
144
|
end
|
136
145
|
end
|
137
146
|
|
@@ -167,7 +176,7 @@ module Sbmt
|
|
167
176
|
|
168
177
|
loop do
|
169
178
|
track_deleted_latency do
|
170
|
-
deleted_count = query.limit(
|
179
|
+
deleted_count = query.limit(item_class.config.deletion_batch_size).delete_all
|
171
180
|
end
|
172
181
|
|
173
182
|
track_deleted_counter(deleted_count)
|
@@ -175,7 +184,7 @@ module Sbmt
|
|
175
184
|
logger.log_info("Deleted #{deleted_count} #{box_type} items for #{box_name} items")
|
176
185
|
break if deleted_count == 0
|
177
186
|
lock_timer.checkpoint!
|
178
|
-
sleep(
|
187
|
+
sleep(item_class.config.deletion_sleep_time)
|
179
188
|
end
|
180
189
|
end
|
181
190
|
|
@@ -44,6 +44,22 @@ module Sbmt
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
+
def deletion_batch_size
|
48
|
+
@deletion_batch_size ||= (options[:deletion_batch_size] || 1_000).to_i
|
49
|
+
end
|
50
|
+
|
51
|
+
def deletion_sleep_time
|
52
|
+
@deletion_sleep_time ||= (options[:deletion_sleep_time] || 0.5).to_f
|
53
|
+
end
|
54
|
+
|
55
|
+
def min_retention_period
|
56
|
+
@min_retention_period ||= ActiveSupport::Duration.parse(options[:min_retention_period] || "P1D")
|
57
|
+
end
|
58
|
+
|
59
|
+
def delivered_min_retention_period
|
60
|
+
@delivered_min_retention_period ||= ActiveSupport::Duration.parse(options[:delivered_min_retention_period] || "PT1H")
|
61
|
+
end
|
62
|
+
|
47
63
|
def max_retries
|
48
64
|
@max_retries ||= (options[:max_retries] || 0).to_i
|
49
65
|
end
|
@@ -17,6 +17,11 @@ default: &default
|
|
17
17
|
# partition_size: 2
|
18
18
|
# partition_strategy: number
|
19
19
|
# retention: P1W
|
20
|
+
# min_retention_period: P1D
|
21
|
+
# retention_delivered_items: PT6H
|
22
|
+
# delivered_min_retention_period: PT1H
|
23
|
+
# deletion_batch_size: 1_000
|
24
|
+
# deletion_sleep_time: 0.5
|
20
25
|
# retry_strategies:
|
21
26
|
# - exponential_backoff
|
22
27
|
# - compacted_log
|
@@ -32,6 +37,11 @@ default: &default
|
|
32
37
|
# partition_size: 2
|
33
38
|
# partition_strategy: number
|
34
39
|
# retention: P1W
|
40
|
+
# min_retention_period: P1D
|
41
|
+
# retention_delivered_items: PT6H
|
42
|
+
# delivered_min_retention_period: PT1H
|
43
|
+
# deletion_batch_size: 1_000
|
44
|
+
# deletion_sleep_time: 0.5
|
35
45
|
# retry_strategies:
|
36
46
|
# - exponential_backoff
|
37
47
|
# transports:
|
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.14.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: 2025-01-
|
11
|
+
date: 2025-01-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: connection_pool
|