pub_sub_model_sync 1.4.0 → 1.5.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/.gitignore +2 -1
- data/Gemfile.lock +20 -16
- data/README.md +5 -3
- data/Rakefile +0 -1
- data/lib/pub_sub_model_sync/config.rb +2 -2
- data/lib/pub_sub_model_sync/message_processor.rb +7 -2
- data/lib/pub_sub_model_sync/mock_rabbit_service.rb +8 -0
- data/lib/pub_sub_model_sync/payload_cache_optimizer.rb +3 -2
- data/lib/pub_sub_model_sync/service_base.rb +11 -7
- data/lib/pub_sub_model_sync/service_google.rb +0 -1
- data/lib/pub_sub_model_sync/service_kafka.rb +2 -1
- data/lib/pub_sub_model_sync/service_rabbit.rb +6 -3
- data/lib/pub_sub_model_sync/version.rb +1 -1
- data/pub_sub_model_sync.gemspec +1 -1
- metadata +2 -88
- data/samples/README.md +0 -50
- data/samples/app1/Dockerfile +0 -13
- data/samples/app1/Gemfile +0 -37
- data/samples/app1/Gemfile.lock +0 -171
- data/samples/app1/README.md +0 -24
- data/samples/app1/Rakefile +0 -6
- data/samples/app1/app/models/application_record.rb +0 -3
- data/samples/app1/app/models/concerns/.keep +0 -0
- data/samples/app1/app/models/post.rb +0 -19
- data/samples/app1/app/models/user.rb +0 -29
- data/samples/app1/bin/bundle +0 -114
- data/samples/app1/bin/rails +0 -5
- data/samples/app1/bin/rake +0 -5
- data/samples/app1/bin/setup +0 -33
- data/samples/app1/bin/spring +0 -14
- data/samples/app1/config/application.rb +0 -40
- data/samples/app1/config/boot.rb +0 -4
- data/samples/app1/config/credentials.yml.enc +0 -1
- data/samples/app1/config/database.yml +0 -25
- data/samples/app1/config/environment.rb +0 -5
- data/samples/app1/config/environments/development.rb +0 -63
- data/samples/app1/config/environments/production.rb +0 -105
- data/samples/app1/config/environments/test.rb +0 -57
- data/samples/app1/config/initializers/application_controller_renderer.rb +0 -8
- data/samples/app1/config/initializers/backtrace_silencers.rb +0 -8
- data/samples/app1/config/initializers/cors.rb +0 -16
- data/samples/app1/config/initializers/filter_parameter_logging.rb +0 -6
- data/samples/app1/config/initializers/inflections.rb +0 -16
- data/samples/app1/config/initializers/mime_types.rb +0 -4
- data/samples/app1/config/initializers/pubsub.rb +0 -4
- data/samples/app1/config/initializers/wrap_parameters.rb +0 -14
- data/samples/app1/config/locales/en.yml +0 -33
- data/samples/app1/config/master.key +0 -1
- data/samples/app1/config/puma.rb +0 -43
- data/samples/app1/config/routes.rb +0 -3
- data/samples/app1/config/spring.rb +0 -6
- data/samples/app1/config.ru +0 -6
- data/samples/app1/db/migrate/20210513080700_create_users.rb +0 -12
- data/samples/app1/db/migrate/20210513134332_create_posts.rb +0 -11
- data/samples/app1/db/schema.rb +0 -34
- data/samples/app1/db/seeds.rb +0 -7
- data/samples/app1/docker-compose.yml +0 -32
- data/samples/app1/log/.keep +0 -0
- data/samples/app2/Dockerfile +0 -13
- data/samples/app2/Gemfile +0 -37
- data/samples/app2/Gemfile.lock +0 -171
- data/samples/app2/README.md +0 -24
- data/samples/app2/Rakefile +0 -6
- data/samples/app2/app/models/application_record.rb +0 -9
- data/samples/app2/app/models/concerns/.keep +0 -0
- data/samples/app2/app/models/customer.rb +0 -28
- data/samples/app2/app/models/post.rb +0 -10
- data/samples/app2/bin/bundle +0 -114
- data/samples/app2/bin/rails +0 -5
- data/samples/app2/bin/rake +0 -5
- data/samples/app2/bin/setup +0 -33
- data/samples/app2/bin/spring +0 -14
- data/samples/app2/config/application.rb +0 -40
- data/samples/app2/config/boot.rb +0 -4
- data/samples/app2/config/credentials.yml.enc +0 -1
- data/samples/app2/config/database.yml +0 -25
- data/samples/app2/config/environment.rb +0 -5
- data/samples/app2/config/environments/development.rb +0 -63
- data/samples/app2/config/environments/production.rb +0 -105
- data/samples/app2/config/environments/test.rb +0 -57
- data/samples/app2/config/initializers/application_controller_renderer.rb +0 -8
- data/samples/app2/config/initializers/backtrace_silencers.rb +0 -8
- data/samples/app2/config/initializers/cors.rb +0 -16
- data/samples/app2/config/initializers/filter_parameter_logging.rb +0 -6
- data/samples/app2/config/initializers/inflections.rb +0 -16
- data/samples/app2/config/initializers/mime_types.rb +0 -4
- data/samples/app2/config/initializers/pubsub.rb +0 -4
- data/samples/app2/config/initializers/wrap_parameters.rb +0 -14
- data/samples/app2/config/locales/en.yml +0 -33
- data/samples/app2/config/master.key +0 -1
- data/samples/app2/config/puma.rb +0 -43
- data/samples/app2/config/routes.rb +0 -3
- data/samples/app2/config/spring.rb +0 -6
- data/samples/app2/config.ru +0 -6
- data/samples/app2/db/development.sqlite3 +0 -0
- data/samples/app2/db/migrate/20210513080956_create_customers.rb +0 -10
- data/samples/app2/db/migrate/20210513135203_create_posts.rb +0 -10
- data/samples/app2/db/schema.rb +0 -31
- data/samples/app2/db/seeds.rb +0 -7
- data/samples/app2/docker-compose.yml +0 -20
- data/samples/app2/log/.keep +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: '0839d268607d201c9f77bbbca404f32aa5af02621b7582256eb384b42b9d3985'
|
|
4
|
+
data.tar.gz: 0ad3d2cfdce3ce99eb5d0b95a4292496927befaca2a8e2d83b865af411be2988
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c86be499e21572b796060fc07f5d95191971b87366bbebe3b22737d5eb906f25a6e850f4b4b6f2c08f2790541169f36401fb67b95df0c5da365fda1f76e8751f
|
|
7
|
+
data.tar.gz: 3e91e306f83eb4ba8dd5c494aadc90b36a702935d7fb716424af80efee6fe6bce9ff895ae6231aa1c32327d7f468ed2148aa69a5f37842c10e0f50e206dad82a
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
pub_sub_model_sync (1.
|
|
4
|
+
pub_sub_model_sync (1.5.0)
|
|
5
5
|
rails
|
|
6
6
|
|
|
7
7
|
GEM
|
|
@@ -99,8 +99,8 @@ GEM
|
|
|
99
99
|
googleapis-common-protos-types (>= 1.0.6, < 2.0)
|
|
100
100
|
googleauth (~> 0.15, >= 0.15.1)
|
|
101
101
|
grpc (~> 1.36)
|
|
102
|
-
globalid (0.
|
|
103
|
-
activesupport (>=
|
|
102
|
+
globalid (1.0.0)
|
|
103
|
+
activesupport (>= 5.0)
|
|
104
104
|
google-cloud-core (1.6.0)
|
|
105
105
|
google-cloud-env (~> 1.0)
|
|
106
106
|
google-cloud-errors (~> 1.0)
|
|
@@ -116,6 +116,7 @@ GEM
|
|
|
116
116
|
google-cloud-errors (~> 1.0)
|
|
117
117
|
grpc-google-iam-v1 (>= 0.6.10, < 2.0)
|
|
118
118
|
google-protobuf (3.17.0)
|
|
119
|
+
google-protobuf (3.17.0-x86_64-linux)
|
|
119
120
|
googleapis-common-protos (1.3.11)
|
|
120
121
|
google-protobuf (~> 3.14)
|
|
121
122
|
googleapis-common-protos-types (>= 1.0.6, < 2.0)
|
|
@@ -132,6 +133,9 @@ GEM
|
|
|
132
133
|
grpc (1.37.1)
|
|
133
134
|
google-protobuf (~> 3.15)
|
|
134
135
|
googleapis-common-protos-types (~> 1.0)
|
|
136
|
+
grpc (1.37.1-x86_64-linux)
|
|
137
|
+
google-protobuf (~> 3.15)
|
|
138
|
+
googleapis-common-protos-types (~> 1.0)
|
|
135
139
|
grpc-google-iam-v1 (0.6.11)
|
|
136
140
|
google-protobuf (~> 3.14)
|
|
137
141
|
googleapis-common-protos (>= 1.3.11, < 2.0)
|
|
@@ -139,27 +143,27 @@ GEM
|
|
|
139
143
|
i18n (1.8.10)
|
|
140
144
|
concurrent-ruby (~> 1.0)
|
|
141
145
|
jwt (2.2.3)
|
|
142
|
-
loofah (2.
|
|
146
|
+
loofah (2.15.0)
|
|
143
147
|
crass (~> 1.0.2)
|
|
144
148
|
nokogiri (>= 1.5.9)
|
|
145
149
|
mail (2.7.1)
|
|
146
150
|
mini_mime (>= 0.1.1)
|
|
147
|
-
marcel (1.0.
|
|
151
|
+
marcel (1.0.2)
|
|
148
152
|
memoist (0.16.2)
|
|
149
153
|
method_source (1.0.0)
|
|
150
154
|
mini_mime (1.0.3)
|
|
151
155
|
minitest (5.14.4)
|
|
152
156
|
multi_json (1.15.0)
|
|
153
157
|
multipart-post (2.1.1)
|
|
154
|
-
nio4r (2.5.
|
|
155
|
-
nokogiri (1.
|
|
158
|
+
nio4r (2.5.8)
|
|
159
|
+
nokogiri (1.12.5-x86_64-linux)
|
|
156
160
|
racc (~> 1.4)
|
|
157
161
|
os (1.1.1)
|
|
158
162
|
parallel (1.20.1)
|
|
159
163
|
parser (3.0.1.1)
|
|
160
164
|
ast (~> 2.4.1)
|
|
161
165
|
public_suffix (4.0.6)
|
|
162
|
-
racc (1.
|
|
166
|
+
racc (1.6.0)
|
|
163
167
|
rack (2.2.3)
|
|
164
168
|
rack-test (1.1.0)
|
|
165
169
|
rack (>= 1.0, < 3)
|
|
@@ -181,7 +185,7 @@ GEM
|
|
|
181
185
|
rails-dom-testing (2.0.3)
|
|
182
186
|
activesupport (>= 4.2.0)
|
|
183
187
|
nokogiri (>= 1.6)
|
|
184
|
-
rails-html-sanitizer (1.
|
|
188
|
+
rails-html-sanitizer (1.4.2)
|
|
185
189
|
loofah (~> 2.3)
|
|
186
190
|
railties (6.1.3.2)
|
|
187
191
|
actionpack (= 6.1.3.2)
|
|
@@ -226,19 +230,19 @@ GEM
|
|
|
226
230
|
faraday (>= 0.17.3, < 2.0)
|
|
227
231
|
jwt (>= 1.5, < 3.0)
|
|
228
232
|
multi_json (~> 1.10)
|
|
229
|
-
sprockets (4.0.
|
|
233
|
+
sprockets (4.0.3)
|
|
230
234
|
concurrent-ruby (~> 1.0)
|
|
231
235
|
rack (> 1, < 3)
|
|
232
|
-
sprockets-rails (3.
|
|
233
|
-
actionpack (>=
|
|
234
|
-
activesupport (>=
|
|
236
|
+
sprockets-rails (3.4.2)
|
|
237
|
+
actionpack (>= 5.2)
|
|
238
|
+
activesupport (>= 5.2)
|
|
235
239
|
sprockets (>= 3.0.0)
|
|
236
240
|
sqlite3 (1.4.2)
|
|
237
|
-
thor (1.1
|
|
241
|
+
thor (1.2.1)
|
|
238
242
|
tzinfo (2.0.4)
|
|
239
243
|
concurrent-ruby (~> 1.0)
|
|
240
244
|
unicode-display_width (1.7.0)
|
|
241
|
-
websocket-driver (0.7.
|
|
245
|
+
websocket-driver (0.7.5)
|
|
242
246
|
websocket-extensions (>= 0.1.0)
|
|
243
247
|
websocket-extensions (0.1.5)
|
|
244
248
|
zeitwerk (2.4.2)
|
|
@@ -260,4 +264,4 @@ DEPENDENCIES
|
|
|
260
264
|
sqlite3
|
|
261
265
|
|
|
262
266
|
BUNDLED WITH
|
|
263
|
-
2.
|
|
267
|
+
2.3.9
|
data/README.md
CHANGED
|
@@ -167,7 +167,7 @@ PubSubModelSync::Payload.new({ ids: [my_user.id] }, { klass: 'User', action: :ba
|
|
|
167
167
|
ps_class_subscribe(action, settings)
|
|
168
168
|
end
|
|
169
169
|
```
|
|
170
|
-
- Instance subscriptions: `ps_subscribe(action, mapping, settings)`
|
|
170
|
+
- Instance subscriptions: `ps_subscribe(action, mapping, settings, &block)`
|
|
171
171
|
When model receives the corresponding notification, `action` or `to_action` method will be called on the model. Like: `model.destroy`
|
|
172
172
|
- `action` (Symbol|Array<Symbol>) Only notifications with this action name will be processed by this subscription. Sample: save|create|update|destroy|<any_other_action>
|
|
173
173
|
- `mapping` (Array<String>) Data mapping from payload data into model attributes, sample: ["email", "full_name:name"] (Note: Only these attributes will be assigned/synced to the current model)
|
|
@@ -182,12 +182,14 @@ PubSubModelSync::Payload.new({ ids: [my_user.id] }, { klass: 'User', action: :ba
|
|
|
182
182
|
Sample: `id: :id` will search for a model like: `model_class.where(id: payload.data[:id])`
|
|
183
183
|
Sample: `id: [:id, :email:user_email]` will search for a model like: `model_class.where(id: payload.data[:id], user_email: payload.data[:email])`
|
|
184
184
|
- `if:` (Symbol|Proc|Array<Symbol>) Method(s) or block called for the confirmation before calling the callback
|
|
185
|
-
- `unless:` (Symbol|Proc|Array<Symbol>) Method or block called for the negation before calling the callback
|
|
185
|
+
- `unless:` (Symbol|Proc|Array<Symbol>) Method or block called for the negation before calling the callback
|
|
186
|
+
- `&block` Block to be used as the callback method (ignored if `:to_action` is present). Sample: `ps_subscribe(:send_welcome, %i[email]) { |_data| puts model.email }`
|
|
186
187
|
|
|
187
|
-
- Class subscriptions: `ps_class_subscribe(action, settings)`
|
|
188
|
+
- Class subscriptions: `ps_class_subscribe(action, settings, &block)`
|
|
188
189
|
When current class receives the corresponding notification, `action` or `to_action` method will be called on the Class. Like: `User.hello(data)`
|
|
189
190
|
* `action` (Symbol) Notification.action name
|
|
190
191
|
* `settings` (Hash) refer ps_subscribe.settings except(:id)
|
|
192
|
+
* `&block` Block to be used as the callback method (ignored if `:to_action` is present). Sample: `ps_class_subscribe(:send_welcome) { |data| puts data }`
|
|
191
193
|
|
|
192
194
|
- `ps_processing_payload` a class and instance variable that saves the current payload being processed
|
|
193
195
|
|
data/Rakefile
CHANGED
|
@@ -7,13 +7,13 @@ module PubSubModelSync
|
|
|
7
7
|
|
|
8
8
|
# customizable callbacks
|
|
9
9
|
cattr_accessor(:debug) { false }
|
|
10
|
-
cattr_accessor
|
|
10
|
+
cattr_accessor(:logger) { Rails.logger }
|
|
11
11
|
cattr_accessor(:transactions_max_buffer) { 1 }
|
|
12
12
|
cattr_accessor(:skip_cache) { false }
|
|
13
13
|
|
|
14
14
|
cattr_accessor(:on_before_processing) { ->(_payload, _info) {} } # return :cancel to skip
|
|
15
15
|
cattr_accessor(:on_success_processing) { ->(_payload, _info) {} }
|
|
16
|
-
cattr_accessor(:on_error_processing) { ->(
|
|
16
|
+
cattr_accessor(:on_error_processing) { ->(exception, _info) { raise(exception) } }
|
|
17
17
|
cattr_accessor(:on_before_publish) { ->(_payload) {} } # return :cancel to skip
|
|
18
18
|
cattr_accessor(:on_after_publish) { ->(_payload) {} }
|
|
19
19
|
cattr_accessor(:on_error_publish) { ->(_exception, _info) {} }
|
|
@@ -49,9 +49,14 @@ module PubSubModelSync
|
|
|
49
49
|
|
|
50
50
|
# @param error (StandardError)
|
|
51
51
|
def notify_error(error)
|
|
52
|
-
|
|
52
|
+
error_msg = 'Error processing message: '
|
|
53
|
+
error_details = [payload, error.message, error.backtrace]
|
|
53
54
|
res = config.on_error_processing.call(error, { payload: payload })
|
|
54
|
-
log("
|
|
55
|
+
log("#{error_msg} #{error_details}", :error) if res != :skip_log
|
|
56
|
+
rescue => e
|
|
57
|
+
error_details = [payload, e.message, e.backtrace]
|
|
58
|
+
log("#{error_msg} #{error_details}", :error)
|
|
59
|
+
raise(e)
|
|
55
60
|
end
|
|
56
61
|
|
|
57
62
|
def lost_db_connection?(error)
|
|
@@ -24,6 +24,10 @@ module PubSubModelSync
|
|
|
24
24
|
def publish(*_args)
|
|
25
25
|
true
|
|
26
26
|
end
|
|
27
|
+
|
|
28
|
+
def channel
|
|
29
|
+
MockChannel.new
|
|
30
|
+
end
|
|
27
31
|
end
|
|
28
32
|
|
|
29
33
|
class MockChannel
|
|
@@ -39,6 +43,10 @@ module PubSubModelSync
|
|
|
39
43
|
def close
|
|
40
44
|
true
|
|
41
45
|
end
|
|
46
|
+
|
|
47
|
+
def ack(_delivery_tag)
|
|
48
|
+
true
|
|
49
|
+
end
|
|
42
50
|
end
|
|
43
51
|
|
|
44
52
|
def create_channel(*_args)
|
|
@@ -41,8 +41,9 @@ module PubSubModelSync
|
|
|
41
41
|
end
|
|
42
42
|
|
|
43
43
|
def optimize_payload # rubocop:disable Metrics/AbcSize
|
|
44
|
-
changed_keys = Hash[(payload.data.to_a - previous_payload_data.to_a)].keys
|
|
45
|
-
|
|
44
|
+
changed_keys = Hash[(payload.data.to_a - previous_payload_data.to_a)].keys.map(&:to_sym)
|
|
45
|
+
required_keys = payload.cache_settings[:required].map(&:to_sym)
|
|
46
|
+
invalid_keys = payload.data.keys - (changed_keys + required_keys)
|
|
46
47
|
log("Excluding non changed attributes: #{invalid_keys} from: #{payload.inspect}") if debug?
|
|
47
48
|
payload.exclude_data_attrs(invalid_keys)
|
|
48
49
|
end
|
|
@@ -33,25 +33,29 @@ module PubSubModelSync
|
|
|
33
33
|
# @param (String: Payload in json format)
|
|
34
34
|
def process_message(payload_info)
|
|
35
35
|
payload = decode_payload(payload_info)
|
|
36
|
-
return
|
|
36
|
+
return unless payload
|
|
37
|
+
return if same_app_message?(payload)
|
|
37
38
|
|
|
38
|
-
|
|
39
|
-
rescue => e
|
|
40
|
-
error_payload = [payload, e.message, e.backtrace]
|
|
41
|
-
log("Error while starting to process a message: #{error_payload}", :error)
|
|
39
|
+
payload.process
|
|
42
40
|
end
|
|
43
41
|
|
|
44
|
-
# @return Payload
|
|
42
|
+
# @return [Payload,Nil]
|
|
45
43
|
def decode_payload(payload_info)
|
|
46
44
|
payload = ::PubSubModelSync::Payload.from_payload_data(JSON.parse(payload_info))
|
|
47
45
|
log("Received message: #{[payload]}") if config.debug
|
|
48
46
|
payload
|
|
47
|
+
rescue => e
|
|
48
|
+
error_payload = [payload_info, e.message, e.backtrace]
|
|
49
|
+
log("Error while parsing payload: #{error_payload}", :error)
|
|
50
|
+
nil
|
|
49
51
|
end
|
|
50
52
|
|
|
51
53
|
# @param payload (Payload)
|
|
52
54
|
def same_app_message?(payload)
|
|
53
55
|
key = payload.headers[:app_key]
|
|
54
|
-
key && key == config.subscription_key
|
|
56
|
+
res = key && key == config.subscription_key
|
|
57
|
+
log("Skipping message from same origin: #{[payload]}") if res && config.debug
|
|
58
|
+
res
|
|
55
59
|
end
|
|
56
60
|
end
|
|
57
61
|
end
|
|
@@ -8,7 +8,7 @@ end
|
|
|
8
8
|
module PubSubModelSync
|
|
9
9
|
class ServiceKafka < ServiceBase
|
|
10
10
|
QTY_WORKERS = 10
|
|
11
|
-
LISTEN_SETTINGS = {}.freeze
|
|
11
|
+
LISTEN_SETTINGS = { automatically_mark_as_processed: false }.freeze
|
|
12
12
|
PUBLISH_SETTINGS = {}.freeze
|
|
13
13
|
PRODUCER_SETTINGS = { delivery_threshold: 200, delivery_interval: 30 }.freeze
|
|
14
14
|
cattr_accessor :producer
|
|
@@ -73,6 +73,7 @@ module PubSubModelSync
|
|
|
73
73
|
|
|
74
74
|
def process_message(message)
|
|
75
75
|
super(message.value) if message.headers[SERVICE_KEY]
|
|
76
|
+
consumer.mark_message_as_processed(message)
|
|
76
77
|
end
|
|
77
78
|
|
|
78
79
|
# Check topic existence, create if missing topic
|
|
@@ -8,7 +8,7 @@ end
|
|
|
8
8
|
module PubSubModelSync
|
|
9
9
|
class ServiceRabbit < ServiceBase
|
|
10
10
|
QUEUE_SETTINGS = { durable: true, auto_delete: false }.freeze
|
|
11
|
-
LISTEN_SETTINGS = { manual_ack:
|
|
11
|
+
LISTEN_SETTINGS = { manual_ack: true }.freeze
|
|
12
12
|
PUBLISH_SETTINGS = {}.freeze
|
|
13
13
|
|
|
14
14
|
# @!attribute topic_names (Array): ['Topic 1', 'Topic 2']
|
|
@@ -25,7 +25,9 @@ module PubSubModelSync
|
|
|
25
25
|
|
|
26
26
|
def listen_messages
|
|
27
27
|
log('Listener starting...')
|
|
28
|
-
subscribe_to_queues
|
|
28
|
+
subscribe_to_queues do |queue|
|
|
29
|
+
queue.subscribe(LISTEN_SETTINGS) { |info, meta, payload| process_message(queue, info, meta, payload) }
|
|
30
|
+
end
|
|
29
31
|
log('Listener started')
|
|
30
32
|
loop { sleep 5 }
|
|
31
33
|
rescue PubSubModelSync::Runner::ShutDown
|
|
@@ -62,8 +64,9 @@ module PubSubModelSync
|
|
|
62
64
|
}.merge(PUBLISH_SETTINGS)
|
|
63
65
|
end
|
|
64
66
|
|
|
65
|
-
def process_message(
|
|
67
|
+
def process_message(queue, delivery_info, meta_info, payload)
|
|
66
68
|
super(payload) if meta_info[:type] == SERVICE_KEY
|
|
69
|
+
queue.channel.ack(delivery_info.delivery_tag)
|
|
67
70
|
end
|
|
68
71
|
|
|
69
72
|
def subscribe_to_queues(&block)
|
data/pub_sub_model_sync.gemspec
CHANGED
|
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
|
|
|
27
27
|
# into git.
|
|
28
28
|
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
|
29
29
|
`git ls-files -z`.split("\x0")
|
|
30
|
-
.reject { |f| f.match(%r{^(test|spec|features)/}) }
|
|
30
|
+
.reject { |f| f.match(%r{^(test|spec|features|samples)/}) }
|
|
31
31
|
end
|
|
32
32
|
spec.bindir = 'exe'
|
|
33
33
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: pub_sub_model_sync
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.5.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Owen
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-
|
|
11
|
+
date: 2022-06-02 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rails
|
|
@@ -134,92 +134,6 @@ files:
|
|
|
134
134
|
- lib/pub_sub_model_sync/transaction.rb
|
|
135
135
|
- lib/pub_sub_model_sync/version.rb
|
|
136
136
|
- pub_sub_model_sync.gemspec
|
|
137
|
-
- samples/README.md
|
|
138
|
-
- samples/app1/Dockerfile
|
|
139
|
-
- samples/app1/Gemfile
|
|
140
|
-
- samples/app1/Gemfile.lock
|
|
141
|
-
- samples/app1/README.md
|
|
142
|
-
- samples/app1/Rakefile
|
|
143
|
-
- samples/app1/app/models/application_record.rb
|
|
144
|
-
- samples/app1/app/models/concerns/.keep
|
|
145
|
-
- samples/app1/app/models/post.rb
|
|
146
|
-
- samples/app1/app/models/user.rb
|
|
147
|
-
- samples/app1/bin/bundle
|
|
148
|
-
- samples/app1/bin/rails
|
|
149
|
-
- samples/app1/bin/rake
|
|
150
|
-
- samples/app1/bin/setup
|
|
151
|
-
- samples/app1/bin/spring
|
|
152
|
-
- samples/app1/config.ru
|
|
153
|
-
- samples/app1/config/application.rb
|
|
154
|
-
- samples/app1/config/boot.rb
|
|
155
|
-
- samples/app1/config/credentials.yml.enc
|
|
156
|
-
- samples/app1/config/database.yml
|
|
157
|
-
- samples/app1/config/environment.rb
|
|
158
|
-
- samples/app1/config/environments/development.rb
|
|
159
|
-
- samples/app1/config/environments/production.rb
|
|
160
|
-
- samples/app1/config/environments/test.rb
|
|
161
|
-
- samples/app1/config/initializers/application_controller_renderer.rb
|
|
162
|
-
- samples/app1/config/initializers/backtrace_silencers.rb
|
|
163
|
-
- samples/app1/config/initializers/cors.rb
|
|
164
|
-
- samples/app1/config/initializers/filter_parameter_logging.rb
|
|
165
|
-
- samples/app1/config/initializers/inflections.rb
|
|
166
|
-
- samples/app1/config/initializers/mime_types.rb
|
|
167
|
-
- samples/app1/config/initializers/pubsub.rb
|
|
168
|
-
- samples/app1/config/initializers/wrap_parameters.rb
|
|
169
|
-
- samples/app1/config/locales/en.yml
|
|
170
|
-
- samples/app1/config/master.key
|
|
171
|
-
- samples/app1/config/puma.rb
|
|
172
|
-
- samples/app1/config/routes.rb
|
|
173
|
-
- samples/app1/config/spring.rb
|
|
174
|
-
- samples/app1/db/migrate/20210513080700_create_users.rb
|
|
175
|
-
- samples/app1/db/migrate/20210513134332_create_posts.rb
|
|
176
|
-
- samples/app1/db/schema.rb
|
|
177
|
-
- samples/app1/db/seeds.rb
|
|
178
|
-
- samples/app1/docker-compose.yml
|
|
179
|
-
- samples/app1/log/.keep
|
|
180
|
-
- samples/app2/Dockerfile
|
|
181
|
-
- samples/app2/Gemfile
|
|
182
|
-
- samples/app2/Gemfile.lock
|
|
183
|
-
- samples/app2/README.md
|
|
184
|
-
- samples/app2/Rakefile
|
|
185
|
-
- samples/app2/app/models/application_record.rb
|
|
186
|
-
- samples/app2/app/models/concerns/.keep
|
|
187
|
-
- samples/app2/app/models/customer.rb
|
|
188
|
-
- samples/app2/app/models/post.rb
|
|
189
|
-
- samples/app2/bin/bundle
|
|
190
|
-
- samples/app2/bin/rails
|
|
191
|
-
- samples/app2/bin/rake
|
|
192
|
-
- samples/app2/bin/setup
|
|
193
|
-
- samples/app2/bin/spring
|
|
194
|
-
- samples/app2/config.ru
|
|
195
|
-
- samples/app2/config/application.rb
|
|
196
|
-
- samples/app2/config/boot.rb
|
|
197
|
-
- samples/app2/config/credentials.yml.enc
|
|
198
|
-
- samples/app2/config/database.yml
|
|
199
|
-
- samples/app2/config/environment.rb
|
|
200
|
-
- samples/app2/config/environments/development.rb
|
|
201
|
-
- samples/app2/config/environments/production.rb
|
|
202
|
-
- samples/app2/config/environments/test.rb
|
|
203
|
-
- samples/app2/config/initializers/application_controller_renderer.rb
|
|
204
|
-
- samples/app2/config/initializers/backtrace_silencers.rb
|
|
205
|
-
- samples/app2/config/initializers/cors.rb
|
|
206
|
-
- samples/app2/config/initializers/filter_parameter_logging.rb
|
|
207
|
-
- samples/app2/config/initializers/inflections.rb
|
|
208
|
-
- samples/app2/config/initializers/mime_types.rb
|
|
209
|
-
- samples/app2/config/initializers/pubsub.rb
|
|
210
|
-
- samples/app2/config/initializers/wrap_parameters.rb
|
|
211
|
-
- samples/app2/config/locales/en.yml
|
|
212
|
-
- samples/app2/config/master.key
|
|
213
|
-
- samples/app2/config/puma.rb
|
|
214
|
-
- samples/app2/config/routes.rb
|
|
215
|
-
- samples/app2/config/spring.rb
|
|
216
|
-
- samples/app2/db/development.sqlite3
|
|
217
|
-
- samples/app2/db/migrate/20210513080956_create_customers.rb
|
|
218
|
-
- samples/app2/db/migrate/20210513135203_create_posts.rb
|
|
219
|
-
- samples/app2/db/schema.rb
|
|
220
|
-
- samples/app2/db/seeds.rb
|
|
221
|
-
- samples/app2/docker-compose.yml
|
|
222
|
-
- samples/app2/log/.keep
|
|
223
137
|
homepage: https://github.com/owen2345/pub_sub_model_sync
|
|
224
138
|
licenses:
|
|
225
139
|
- MIT
|
data/samples/README.md
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
# Sample model sync
|
|
2
|
-
This is a sample to sync information between rails applications using RabbitMQ
|
|
3
|
-
|
|
4
|
-
## Installation
|
|
5
|
-
1. Create manually the required network to share rabbitMQ accross Rails applications (just if not exist):
|
|
6
|
-
```docker network create shared_app_services```
|
|
7
|
-
|
|
8
|
-
2. Start RabbitMQ server
|
|
9
|
-
```cd samples/app1 && docker-compose up pubsub```
|
|
10
|
-
|
|
11
|
-
3. In another tab access to App2 to listen notifications (Wait for step 2)
|
|
12
|
-
- Access to the folder
|
|
13
|
-
`cd samples/app2`
|
|
14
|
-
|
|
15
|
-
- Build docker and start listener (Received notifications will be printed here)
|
|
16
|
-
```docker-compose run listener```
|
|
17
|
-
|
|
18
|
-
- Optional: Open another tab to access application to ensure synced data
|
|
19
|
-
```docker-compose run listener bash -c "rails c```
|
|
20
|
-
```ruby
|
|
21
|
-
user = User.last.inspect
|
|
22
|
-
user.posts.inspect
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
4. In another tab access to App1 to publish notifications (Wait for step 2)
|
|
26
|
-
- Access to the application
|
|
27
|
-
`cd samples/app1`
|
|
28
|
-
|
|
29
|
-
- Build docker and enter rails console
|
|
30
|
-
```docker-compose run app bash -c "rails db:migrate && rails c"```
|
|
31
|
-
|
|
32
|
-
- Create a sample user
|
|
33
|
-
```ruby
|
|
34
|
-
user = User.create!(name: 'User 1', posts_attributes: [{ title: 'Post 1' }, { title: 'Post 2' }])
|
|
35
|
-
```
|
|
36
|
-
Note: Check app2 console to see notifications (3 notifications)
|
|
37
|
-
Note2: Access app2 console to see user and its posts
|
|
38
|
-
|
|
39
|
-
- Update previous user
|
|
40
|
-
```ruby
|
|
41
|
-
user.update!(name: 'User 1 changed', posts_attributes: user.posts.map { |post| { id: post.id, title: "#{post.title} changed" } })
|
|
42
|
-
```
|
|
43
|
-
Note: Check app2 console to see notifications (3 notifications)
|
|
44
|
-
Note2: Access app2 console to see changes for user and its posts
|
|
45
|
-
|
|
46
|
-
- Destroy previous user
|
|
47
|
-
```ruby
|
|
48
|
-
user.destroy!
|
|
49
|
-
```
|
|
50
|
-
|
data/samples/app1/Dockerfile
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
FROM ruby:2.7.1 AS builder
|
|
2
|
-
|
|
3
|
-
# Allow apt to work with https-based sources
|
|
4
|
-
RUN apt-get update -yqq && apt-get install -yqq --no-install-recommends apt-transport-https
|
|
5
|
-
|
|
6
|
-
RUN mkdir /app
|
|
7
|
-
WORKDIR /app
|
|
8
|
-
|
|
9
|
-
# backend
|
|
10
|
-
COPY Gemfile.lock Gemfile /app/
|
|
11
|
-
RUN gem install bundler && bundle install
|
|
12
|
-
|
|
13
|
-
COPY . /app
|
data/samples/app1/Gemfile
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
source 'https://rubygems.org'
|
|
2
|
-
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
|
|
3
|
-
|
|
4
|
-
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails', branch: 'main'
|
|
5
|
-
gem 'rails', '~> 6.1.3', '>= 6.1.3.2'
|
|
6
|
-
# Use sqlite3 as the database for Active Record
|
|
7
|
-
gem 'sqlite3', '~> 1.4'
|
|
8
|
-
# Use Puma as the app server
|
|
9
|
-
gem 'puma', '~> 5.0'
|
|
10
|
-
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
|
|
11
|
-
# gem 'jbuilder', '~> 2.7'
|
|
12
|
-
# Use Active Model has_secure_password
|
|
13
|
-
# gem 'bcrypt', '~> 3.1.7'
|
|
14
|
-
|
|
15
|
-
# Reduces boot times through caching; required in config/boot.rb
|
|
16
|
-
gem 'bootsnap', '>= 1.4.4', require: false
|
|
17
|
-
|
|
18
|
-
# Use Rack CORS for handling Cross-Origin Resource Sharing (CORS), making cross-origin AJAX possible
|
|
19
|
-
# gem 'rack-cors'
|
|
20
|
-
|
|
21
|
-
gem 'pub_sub_model_sync', '>= 1.0'
|
|
22
|
-
gem 'bunny' # to use rabbit-mq pub/sub service
|
|
23
|
-
gem 'annotate'
|
|
24
|
-
|
|
25
|
-
group :development, :test do
|
|
26
|
-
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
|
|
27
|
-
gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
group :development do
|
|
31
|
-
gem 'listen', '~> 3.3'
|
|
32
|
-
# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
|
|
33
|
-
gem 'spring'
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
|
|
37
|
-
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
|