sbmt-outbox 6.14.0 → 6.15.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 +4 -4
- data/README.md +36 -0
- data/lib/sbmt/outbox/engine.rb +2 -0
- data/lib/sbmt/outbox/tasks/delete_items.rake +43 -0
- data/lib/sbmt/outbox/tasks/update_status_items.rake +43 -0
- data/lib/sbmt/outbox/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 89c324ebe083d7dece71ae19ee9011a8da91843b31997ddbde85722e9f8209a5
|
|
4
|
+
data.tar.gz: fedd73ddecdfc54da1728bf19cdce13632e40ada5c94047a783d15a7e82370f1
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 671f178a2b39285be8adb846ce823652cf1c6f2a68f4ce7e7e327015ea69b22858f95bd8403a637bd38c8ebd981e1423341d420bd308f2fae0d8f9bf151550cb
|
|
7
|
+
data.tar.gz: bea9bbb10ced61b77814e708528deada7058cf7afc8c90726d3d2c4068c619a1ddecb39e5caa836b9620dcfa9fda28cc20e3d4a083e8a83163f6146d9b28b00b
|
data/README.md
CHANGED
|
@@ -439,6 +439,42 @@ outbox_items:
|
|
|
439
439
|
partition_strategy: hash
|
|
440
440
|
```
|
|
441
441
|
|
|
442
|
+
## Rake tasks
|
|
443
|
+
|
|
444
|
+
```shell
|
|
445
|
+
rake outbox:delete_items
|
|
446
|
+
rake outbox:update_status_items
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
Example run:
|
|
450
|
+
```shell
|
|
451
|
+
rake outbox:delete_items[OutboxItem,1] # Mandatory parameters box class and status
|
|
452
|
+
rake outbox:update_status_items[OutboxItem,0,3] # Mandatory parameters box class, current status and new status
|
|
453
|
+
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
Both tasks have optional parameters:
|
|
457
|
+
```ruby
|
|
458
|
+
- start_time # boxes are younger than the specified time, by default nil, time is specified in the format "2025-01-05T23:59:59"
|
|
459
|
+
- end_time # boxes are older than the specified time, by default 6.hours.ago, time is specified in the format "2025-01-05T23:59:59"
|
|
460
|
+
- batch_size # batch size, by default 1_000
|
|
461
|
+
- sleep_time # sleep time between batches, by default 0.5
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
Example with optional parameters:
|
|
465
|
+
- format optional parameters:
|
|
466
|
+
```shell
|
|
467
|
+
rake outbox:delete_items[klass_name,status,start_time,end_time,batch_size,sleep_time]
|
|
468
|
+
|
|
469
|
+
rake outbox:update_status_items[klass_name,status,new_status,start_time,end_time,batch_size,sleep_time]
|
|
470
|
+
```
|
|
471
|
+
- example:
|
|
472
|
+
```shell
|
|
473
|
+
rake outbox:delete_items[OutboxItem,1,"2025-01-05T23:59:59","2025-01-05T00:00:00",10_000,5]
|
|
474
|
+
|
|
475
|
+
rake outbox:update_status_items[OutboxItem,0,3,"2025-01-05T23:59:59","2025-01-05T00:00:00",10_000,5]
|
|
476
|
+
```
|
|
477
|
+
|
|
442
478
|
## Concurrency
|
|
443
479
|
|
|
444
480
|
The worker process consists of a poller and a processor, each of which has its own thread pool.
|
data/lib/sbmt/outbox/engine.rb
CHANGED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
namespace :outbox do
|
|
4
|
+
desc "Delete outbox/inbox items"
|
|
5
|
+
task :delete_items, [:klass_name, :status, :start_time, :end_time, :batch_size, :sleep_time] => :environment do |_, args|
|
|
6
|
+
args.with_defaults(start_time: nil, end_time: 6.hours.ago, batch_size: 1000, sleep_time: 0.5)
|
|
7
|
+
|
|
8
|
+
klass_name = args[:klass_name]
|
|
9
|
+
status = args[:status]
|
|
10
|
+
start_time = args[:start_time]
|
|
11
|
+
end_time = args[:end_time]
|
|
12
|
+
batch_size = args[:batch_size]
|
|
13
|
+
sleep_time = args[:sleep_time]
|
|
14
|
+
|
|
15
|
+
unless klass_name && status
|
|
16
|
+
raise "Error: Class and status must be specified. Example: rake outbox:delete_items[OutboxItem,1]"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
klass_name = klass_name.constantize
|
|
20
|
+
query = klass_name.where(status: status)
|
|
21
|
+
|
|
22
|
+
if start_time && end_time
|
|
23
|
+
query = query.where(created_at: start_time..end_time)
|
|
24
|
+
elsif start_time
|
|
25
|
+
query = query.where(created_at: start_time..)
|
|
26
|
+
elsif end_time
|
|
27
|
+
query = query.where(created_at: ..end_time)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
total_deleted = 0
|
|
31
|
+
query.in_batches(of: batch_size) do |batch|
|
|
32
|
+
deleted_count = batch.delete_all
|
|
33
|
+
|
|
34
|
+
Rails.logger.info("Batch items deleted: #{deleted_count}")
|
|
35
|
+
|
|
36
|
+
total_deleted += deleted_count
|
|
37
|
+
|
|
38
|
+
sleep sleep_time
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
Rails.logger.info("Total items deleted: #{total_deleted}")
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
namespace :outbox do
|
|
4
|
+
desc "Update status of outbox/inbox items"
|
|
5
|
+
task :update_status_items, [:klass_name, :status, :new_status, :start_time, :end_time, :batch_size, :sleep_time] => :environment do |_, args|
|
|
6
|
+
args.with_defaults(start_time: nil, end_time: 6.hours.ago, batch_size: 1000, sleep_time: 0.5)
|
|
7
|
+
|
|
8
|
+
klass_name = args[:klass_name]
|
|
9
|
+
status = args[:status]
|
|
10
|
+
new_status = args[:new_status]
|
|
11
|
+
start_time = args[:start_time]
|
|
12
|
+
end_time = args[:end_time]
|
|
13
|
+
batch_size = args[:batch_size]
|
|
14
|
+
sleep_time = args[:sleep_time]
|
|
15
|
+
|
|
16
|
+
unless klass_name && status && new_status
|
|
17
|
+
raise "Error: Class, current status, and new status must be specified. Example: rake outbox:update_status_items[OutboxItem,0,3]"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
klass_name = klass_name.constantize
|
|
21
|
+
query = klass_name.where(status: status)
|
|
22
|
+
|
|
23
|
+
if start_time && end_time
|
|
24
|
+
query = query.where(created_at: start_time..end_time)
|
|
25
|
+
elsif start_time
|
|
26
|
+
query = query.where(created_at: start_time..)
|
|
27
|
+
elsif end_time
|
|
28
|
+
query = query.where(created_at: ..end_time)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
total_updated = 0
|
|
32
|
+
query.in_batches(of: batch_size) do |batch|
|
|
33
|
+
updated_count = batch.update_all(status: new_status)
|
|
34
|
+
|
|
35
|
+
Rails.logger.info("Batch items updated: #{updated_count}")
|
|
36
|
+
|
|
37
|
+
total_updated += updated_count
|
|
38
|
+
sleep sleep_time
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
Rails.logger.info("Total items updated: #{total_updated}")
|
|
42
|
+
end
|
|
43
|
+
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.15.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-23 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: connection_pool
|
|
@@ -582,7 +582,9 @@ files:
|
|
|
582
582
|
- lib/sbmt/outbox/probes/probe.rb
|
|
583
583
|
- lib/sbmt/outbox/redis_client_factory.rb
|
|
584
584
|
- lib/sbmt/outbox/tasks/delete_failed_items.rake
|
|
585
|
+
- lib/sbmt/outbox/tasks/delete_items.rake
|
|
585
586
|
- lib/sbmt/outbox/tasks/retry_failed_items.rake
|
|
587
|
+
- lib/sbmt/outbox/tasks/update_status_items.rake
|
|
586
588
|
- lib/sbmt/outbox/v1/thread_pool.rb
|
|
587
589
|
- lib/sbmt/outbox/v1/throttler.rb
|
|
588
590
|
- lib/sbmt/outbox/v1/worker.rb
|