message_bus 3.3.7 → 4.1.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/.eslintrc.js +1 -8
- data/.github/workflows/ci.yml +50 -20
- data/.prettierrc +1 -0
- data/CHANGELOG +99 -46
- data/README.md +31 -53
- data/Rakefile +22 -22
- data/docker-compose.yml +1 -1
- data/lib/message_bus/backends/base.rb +14 -0
- data/lib/message_bus/backends/memory.rb +13 -0
- data/lib/message_bus/backends/postgres.rb +55 -22
- data/lib/message_bus/backends/redis.rb +17 -1
- data/lib/message_bus/client.rb +26 -22
- data/lib/message_bus/distributed_cache.rb +1 -0
- data/lib/message_bus/rack/middleware.rb +0 -6
- data/lib/message_bus/rack/thin_ext.rb +1 -0
- data/lib/message_bus/version.rb +1 -1
- data/lib/message_bus.rb +53 -71
- data/message_bus.gemspec +4 -3
- data/package.json +2 -5
- data/spec/helpers.rb +6 -1
- data/spec/lib/fake_async_middleware.rb +1 -0
- data/spec/lib/message_bus/backend_spec.rb +20 -3
- data/spec/lib/message_bus/client_spec.rb +1 -0
- data/spec/lib/message_bus/connection_manager_spec.rb +4 -0
- data/spec/lib/message_bus/multi_process_spec.rb +21 -10
- data/spec/lib/message_bus/rack/middleware_spec.rb +2 -49
- data/spec/lib/message_bus/timer_thread_spec.rb +1 -5
- data/spec/lib/message_bus_spec.rb +12 -3
- data/spec/performance/backlog.rb +80 -0
- data/spec/performance/publish.rb +4 -4
- data/spec/spec_helper.rb +1 -1
- data/vendor/assets/javascripts/message-bus-ajax.js +38 -0
- data/vendor/assets/javascripts/message-bus.js +549 -0
- metadata +8 -31
- data/assets/application.jsx +0 -121
- data/assets/babel.min.js +0 -25
- data/assets/react-dom.js +0 -19851
- data/assets/react.js +0 -3029
- data/examples/diagnostics/Gemfile +0 -6
- data/examples/diagnostics/config.ru +0 -22
- data/lib/message_bus/diagnostics.rb +0 -62
- data/lib/message_bus/rack/diagnostics.rb +0 -120
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 11a14ba0ec9ad142d3335fb7eb764be8e9b975a8dc8367fd4bf359e128a56095
|
4
|
+
data.tar.gz: bf41cede85c8e75e56829447cd3cf9ed6cd531ba27fcddfbccb6043f3a82da34
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 23c1d181028194c16e98c5a3df42e445458aef4779c97ae2d6d5100adf5053680f62ea4c914bea7c84c124bd453127e141c68ffeb1c742cc208e1d040bc8558f
|
7
|
+
data.tar.gz: 7efffe711fac2520356b115820acba2d4206d53f35017ba64c86e3c571a85fb423e943cb9301a03d3b47d6f442f1626dea0495c0242220283685eaa944c890b6
|
data/.eslintrc.js
CHANGED
@@ -10,12 +10,5 @@ module.exports = {
|
|
10
10
|
sourceType: 'module',
|
11
11
|
},
|
12
12
|
rules: {},
|
13
|
-
ignorePatterns: [
|
14
|
-
'/vendor',
|
15
|
-
'/doc',
|
16
|
-
'/assets/babel.min.js',
|
17
|
-
'/assets/jquery-1.8.2.js',
|
18
|
-
'/assets/react-dom.js',
|
19
|
-
'/assets/react.js',
|
20
|
-
],
|
13
|
+
ignorePatterns: ['/vendor', '/doc', '/assets/jquery-1.8.2.js'],
|
21
14
|
};
|
data/.github/workflows/ci.yml
CHANGED
@@ -1,16 +1,10 @@
|
|
1
|
-
name:
|
1
|
+
name: CI
|
2
2
|
|
3
3
|
on:
|
4
|
-
pull_request:
|
5
4
|
push:
|
6
5
|
branches:
|
7
6
|
- main
|
8
|
-
|
9
|
-
env:
|
10
|
-
PGHOST: localhost
|
11
|
-
PGPORT: 5432
|
12
|
-
PGPASSWORD: postgres
|
13
|
-
PGUSER: postgres
|
7
|
+
pull_request:
|
14
8
|
|
15
9
|
jobs:
|
16
10
|
build:
|
@@ -18,10 +12,22 @@ jobs:
|
|
18
12
|
name: Ruby ${{ matrix.ruby }} (redis ${{ matrix.redis }})
|
19
13
|
timeout-minutes: 10
|
20
14
|
|
15
|
+
env:
|
16
|
+
PGHOST: localhost
|
17
|
+
PGPASSWORD: postgres
|
18
|
+
PGUSER: postgres
|
19
|
+
|
20
|
+
strategy:
|
21
|
+
fail-fast: false
|
22
|
+
matrix:
|
23
|
+
ruby: [2.6, 2.7, '3.0', 3.1]
|
24
|
+
redis: [5, 6]
|
25
|
+
|
21
26
|
services:
|
22
27
|
postgres:
|
23
|
-
image: postgres:14
|
28
|
+
image: postgres:14
|
24
29
|
env:
|
30
|
+
POSTGRES_DB: message_bus_test
|
25
31
|
POSTGRES_PASSWORD: postgres
|
26
32
|
ports:
|
27
33
|
- 5432:5432
|
@@ -36,19 +42,13 @@ jobs:
|
|
36
42
|
--health-timeout 5s
|
37
43
|
--health-retries 5
|
38
44
|
|
39
|
-
strategy:
|
40
|
-
fail-fast: false
|
41
|
-
matrix:
|
42
|
-
ruby: ["3.0", "2.7", "2.6"]
|
43
|
-
redis: ["5", "6"]
|
44
|
-
|
45
45
|
steps:
|
46
46
|
- uses: actions/checkout@v2
|
47
47
|
|
48
48
|
- uses: ruby/setup-ruby@v1
|
49
49
|
with:
|
50
50
|
ruby-version: ${{ matrix.ruby }}
|
51
|
-
bundler-cache: true
|
51
|
+
bundler-cache: true
|
52
52
|
|
53
53
|
- name: Set up Node.js
|
54
54
|
uses: actions/setup-node@v2
|
@@ -59,13 +59,43 @@ jobs:
|
|
59
59
|
- name: Setup npm
|
60
60
|
run: npm install
|
61
61
|
|
62
|
-
- name: Create Database
|
63
|
-
run: |
|
64
|
-
createdb message_bus_test
|
65
|
-
|
66
62
|
- name: Tests
|
63
|
+
env:
|
64
|
+
TESTOPTS: --verbose
|
67
65
|
run: bundle exec rake
|
68
66
|
timeout-minutes: 3
|
69
67
|
|
70
68
|
- name: Linting
|
71
69
|
run: npx eslint .
|
70
|
+
|
71
|
+
publish:
|
72
|
+
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
73
|
+
needs: build
|
74
|
+
runs-on: ubuntu-latest
|
75
|
+
|
76
|
+
steps:
|
77
|
+
- uses: actions/checkout@v2
|
78
|
+
|
79
|
+
- name: Release gem
|
80
|
+
uses: discourse/publish-rubygems-action@v2
|
81
|
+
id: publish-gem
|
82
|
+
env:
|
83
|
+
RUBYGEMS_API_KEY: ${{ secrets.RUBYGEMS_API_KEY }}
|
84
|
+
GIT_EMAIL: team@discourse.org
|
85
|
+
GIT_NAME: discoursebot
|
86
|
+
|
87
|
+
- name: Update package version
|
88
|
+
if: steps.publish-gem.outputs.new_version == 'true'
|
89
|
+
run: |
|
90
|
+
VERSION=$(ruby -r './lib/message_bus/version' -e 'puts MessageBus::VERSION')
|
91
|
+
sed -i "s/0.0.0-version-placeholder/$VERSION/" package.json
|
92
|
+
git config --global user.email "ci@ci.invalid"
|
93
|
+
git config --global user.name "Discourse CI"
|
94
|
+
git add package.json
|
95
|
+
git commit -m 'bump'
|
96
|
+
|
97
|
+
- name: Publish package
|
98
|
+
uses: JS-DevTools/npm-publish@v1
|
99
|
+
if: steps.publish-gem.outputs.new_version == 'true'
|
100
|
+
with:
|
101
|
+
token: ${{ secrets.NPM_TOKEN }}
|
data/.prettierrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{}
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,34 @@
|
|
1
|
+
16-02-2022
|
2
|
+
|
3
|
+
- Version 4.1.0
|
4
|
+
|
5
|
+
- PERF: Optimize Client#backlog for up-to-date clients
|
6
|
+
|
7
|
+
Also introduces a new MessageBus#last_ids(*channels) api for fetching the last_ids of
|
8
|
+
multiple channels simultaneously
|
9
|
+
|
10
|
+
11-01-2022
|
11
|
+
|
12
|
+
- Version 4.0.0
|
13
|
+
|
14
|
+
- DEV: Remove backend diagnostics
|
15
|
+
- DEV: Rename reliable_pub_sub to backend_instance
|
16
|
+
- FIX: `destroy` following `after_fork` could thread lock
|
17
|
+
|
18
|
+
31-12-2021
|
19
|
+
|
20
|
+
- Version 3.4.0
|
21
|
+
|
22
|
+
- FEATURE: Remove process auto-termination on missed keepalives
|
23
|
+
|
24
|
+
20-12-2021
|
25
|
+
|
26
|
+
- Version 3.3.8
|
27
|
+
|
28
|
+
- FIX: Restore dist js files to fix a regression in 3.3.7
|
29
|
+
- FIX: Stop various thread/pg connection leaks
|
30
|
+
- DEV: Fix ruby warnings
|
31
|
+
|
1
32
|
15-12-2021
|
2
33
|
|
3
34
|
- Version 3.3.7
|
@@ -63,14 +94,14 @@
|
|
63
94
|
|
64
95
|
- Version 3.3.0
|
65
96
|
|
66
|
-
|
97
|
+
- FEATURE: `MessageBus.base_route=` to alter the route that message bus will listen on.
|
67
98
|
|
68
99
|
07-05-2020
|
69
100
|
|
70
101
|
- Version 3.2.0
|
71
102
|
|
72
|
-
|
73
|
-
|
103
|
+
- FIX: compatibility with Rails 6.0.3, note: apps without ActionDispatch::Flash may stop working after this upgrade
|
104
|
+
to correct this disable middleware injection with `config.skip_message_bus_middleware = true` and configure middleware by hand with `app.middleware.use(MessageBus::Rack::Middleware)`
|
74
105
|
|
75
106
|
28-04-2020
|
76
107
|
|
@@ -105,7 +136,6 @@
|
|
105
136
|
|
106
137
|
- FIX: In the redis backend make the `is_readonly?` method compatible with the redis gem both pre and post v4.0 when the `client` attribute was removed
|
107
138
|
|
108
|
-
|
109
139
|
30-04-2019
|
110
140
|
|
111
141
|
- Version 2.2.1
|
@@ -136,7 +166,7 @@
|
|
136
166
|
- Version 2.2.0.pre
|
137
167
|
|
138
168
|
- FIX: In redis backend we now expire the key used to track channel id this can cause a redis key leak
|
139
|
-
|
169
|
+
with large amounts of subscriptions that go away
|
140
170
|
- FEATURE: Much extra implementation documentation, and some improvements to usage documentation.
|
141
171
|
- FEATURE: Improvements to development workflow:
|
142
172
|
- Fully docker-based development and testing, with no other dependencies.
|
@@ -153,44 +183,47 @@
|
|
153
183
|
- Supports setting backlog size on publication for memory/postgres
|
154
184
|
- FEATURE: `MessageBus.off` now prevents the server subscription from starting up.
|
155
185
|
- FEATURE: Trims unused parts of the public API:
|
186
|
+
|
156
187
|
- Methods removed:
|
157
|
-
|
158
|
-
|
188
|
+
|
189
|
+
- ConnectionManager#stats (never used and the ConnectionManager is not exposed to application code)
|
190
|
+
- Client#cancel (effectively duplicate of Client#close and the Client is only available via the ConnectionManager, thus not available to application code)
|
159
191
|
|
160
192
|
- Methods made private:
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
193
|
+
|
194
|
+
- MessageBus::Implementation#encode_channel_name
|
195
|
+
- MessageBus::Implementation#decode_channel_name
|
196
|
+
- Client#in_async?
|
197
|
+
- Client#ensure_closed!
|
198
|
+
- ConnectionManager#subscribe_client
|
199
|
+
- Diagnostics.full_process_path
|
200
|
+
- Diagnostics.hostname
|
201
|
+
- MessageBus::Rack::Diagnostics#js_asset
|
202
|
+
- MessageBus::Rack::Diagnostics#generate_script_tag
|
203
|
+
- MessageBus::Rack::Diagnostics#file_hash
|
204
|
+
- MessageBus::Rack::Diagnostics#asset_contents
|
205
|
+
- MessageBus::Rack::Diagnostics#asset_path
|
206
|
+
- MessageBus::Rack::Diagnostics#index
|
207
|
+
- MessageBus::Rack::Diagnostics#translate_handlebars
|
208
|
+
- MessageBus::Rack::Diagnostics#indent
|
209
|
+
- MessageBus::Rack::Middleware#start_listener
|
210
|
+
- MessageBus::Rack::Middleware#close_db_connection!
|
211
|
+
- MessageBus::Rack::Middleware#add_client_with_timeout
|
179
212
|
|
180
213
|
- Methods switched from protected to private:
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
214
|
+
- MessageBus::Implementation#global?
|
215
|
+
- MessageBus::Implementation#decode_message!
|
216
|
+
- MessageBus::Implementation#replay_backlog
|
217
|
+
- MessageBus::Implementation#subscribe_impl
|
218
|
+
- MessageBus::Implementation#unsubscribe_impl
|
219
|
+
- MessageBus::Implementation#ensure_subscriber_thread
|
220
|
+
- MessageBus::Implementation#new_subscriber_thread
|
221
|
+
- MessageBus::Implementation#global_subscribe_thread
|
222
|
+
- MessageBus::Implementation#multi_each
|
223
|
+
- Client#write_headers
|
224
|
+
- Client#write_chunk
|
225
|
+
- Client#write_and_close
|
226
|
+
- Client#messages_to_json
|
194
227
|
|
195
228
|
15-10-2018
|
196
229
|
|
@@ -219,7 +252,7 @@
|
|
219
252
|
- Version 2.1.2
|
220
253
|
|
221
254
|
- FEATURE: minHiddenPollInterval set to 1500ms out of the box, ensures we never do hidden tab
|
222
|
-
|
255
|
+
polls at a high rate if tons of tabs are open
|
223
256
|
- FEATURE: added random 500ms to delayed polls to increase tab entropy
|
224
257
|
|
225
258
|
18-12-2017
|
@@ -233,7 +266,7 @@
|
|
233
266
|
- Version 2.1.0
|
234
267
|
|
235
268
|
- FEATURE: you can now lookup last N messages on channel on subscribe from JavaScript
|
236
|
-
|
269
|
+
Subscribe at position (-1 - numberOfMessages) from the client
|
237
270
|
|
238
271
|
24-11-2017
|
239
272
|
|
@@ -253,8 +286,7 @@
|
|
253
286
|
- Version 2.0.7
|
254
287
|
|
255
288
|
- Fix/Feature: use LUA script for publishing to bus, this eliminates a race condition
|
256
|
-
|
257
|
-
|
289
|
+
and ensures that we are never stuck in a multi transaction by mistake
|
258
290
|
|
259
291
|
29-09-2017
|
260
292
|
|
@@ -282,12 +314,10 @@
|
|
282
314
|
- Version 2.0.2
|
283
315
|
- Feature: Add on_middleware_error callback for remapping middleware errors to HTTP results
|
284
316
|
|
285
|
-
|
286
317
|
25-07-2016
|
287
318
|
|
288
319
|
- Feature: Add JavaScript MessageBus.status() function
|
289
320
|
|
290
|
-
|
291
321
|
21-06-2016
|
292
322
|
|
293
323
|
- Version 2.0.1
|
@@ -368,8 +398,8 @@
|
|
368
398
|
|
369
399
|
- Version 1.1.1
|
370
400
|
- Fix: In multisite config there was no way to specify site for last_id or backlog
|
371
|
-
|
372
|
-
|
401
|
+
to resolve overrides were added to #last_id and #backlog, MessageBus::Client now
|
402
|
+
uses the new overrides
|
373
403
|
|
374
404
|
07-12-2015
|
375
405
|
|
@@ -379,86 +409,105 @@
|
|
379
409
|
- Feature: remove most jQuery dependency from message-bus.js
|
380
410
|
|
381
411
|
09-07-2015
|
412
|
+
|
382
413
|
- Version 1.0.16
|
383
414
|
- Fix: correct edge cases around keepalive checks on bus
|
384
415
|
|
385
416
|
09-07-2015
|
417
|
+
|
386
418
|
- Version 1.0.15
|
387
419
|
- Feature: MessageBus.reliable_pub_sub.max_backlog_age (in secs) configurable (default to 7 days)
|
388
420
|
- Fix: API for MessageBus.backlog("/bla") was returning global backlog by mistake
|
389
421
|
- Change: Max global backlog size reduced to 2000 elements
|
390
422
|
|
391
423
|
08-06-2015
|
424
|
+
|
392
425
|
- Version 1.0.14
|
393
426
|
- Fix: we can not use Thread#kill best keepalive can do is terminate process cleanly
|
394
427
|
- Feature: you can opt-out of keepalive with MessageBus.keepalive_timeout = 0
|
395
428
|
|
396
429
|
08-06-2015
|
430
|
+
|
397
431
|
- Version 1.0.13
|
398
432
|
- Fix: on global subscribe reconnect replay missed messages
|
399
433
|
- Feature: keepalive tests for global subscribe, catches hung redis connections
|
400
434
|
|
401
435
|
28-05-2015
|
436
|
+
|
402
437
|
- Version 1.0.12
|
403
438
|
- Feature: Support client_id targeted message
|
404
439
|
|
405
440
|
06-05-2015
|
441
|
+
|
406
442
|
- Version 1.0.11
|
407
443
|
- Fix: race condition in TimerThread
|
408
444
|
|
409
445
|
01-05-2015
|
446
|
+
|
410
447
|
- Version: 1.0.10
|
411
448
|
- Feature: no longer depends on EventMachine (only used for Thin backend)
|
412
449
|
- Feature: reliable pub sub will queue messages in memory if redis is readonly, configurable
|
413
450
|
- Fix: if redis is flushed we will continue to deliver messages
|
414
451
|
|
415
452
|
23-03-2015
|
453
|
+
|
416
454
|
- Version 1.0.9
|
417
455
|
- Fix: inherit off StandardError not Exception for all exceptions raised
|
418
456
|
|
419
457
|
20-03-2015
|
458
|
+
|
420
459
|
- Version 1.0.8
|
421
460
|
- Fix: aggressive short polling in background
|
422
461
|
|
423
462
|
16-03-2015
|
463
|
+
|
424
464
|
- Version 1.0.7
|
425
465
|
- Feature: added pause and resume methods
|
426
466
|
|
427
467
|
03-02-2015
|
468
|
+
|
428
469
|
- Version 1.0.6
|
429
470
|
- Fix: global backlog not truncating correctly
|
430
471
|
|
431
472
|
23-09-2014
|
473
|
+
|
432
474
|
- Version 1.0.5
|
433
475
|
- Fix: missing custom headers from long polls
|
434
476
|
|
435
477
|
23-09-2014
|
478
|
+
|
436
479
|
- Version 1.0.4
|
437
480
|
- Change: MessageBus.access_control_allow_origin_lookup to extra_response_headers_lookup
|
438
481
|
|
439
482
|
23-09-2014
|
483
|
+
|
440
484
|
- Version 1.0.3
|
441
485
|
- Change: MessageBus.access_control_allow_origin to MessageBus.access_control_allow_origin_lookup
|
442
486
|
|
443
487
|
23-09-2014
|
488
|
+
|
444
489
|
- Version 1.0.2
|
445
490
|
- Feature: MessageBus.access_control_allow_origin to control origin header
|
446
491
|
|
447
492
|
23-09-2014
|
493
|
+
|
448
494
|
- Version 1.0.1
|
449
495
|
- Feature: $.ajax dependency can be passed in.
|
450
496
|
- Feature: unsubscribe accepts a second param for the function to unsubscribe.
|
451
497
|
|
452
498
|
22-09-2014
|
499
|
+
|
453
500
|
- Version 1.0.0
|
454
501
|
- Feature: add backgroundCallbackInterval - interval to send polls when page is in the background
|
455
502
|
- Feature: issue a long poll as soon as page moves into the foreground
|
456
503
|
|
457
504
|
11-08-2014
|
505
|
+
|
458
506
|
- Version 0.9.5
|
459
507
|
- Fix: release db connection a lot earlier for long polling (rails defer closes)
|
460
508
|
|
461
509
|
13-01-2014
|
510
|
+
|
462
511
|
- Version 0.9.4
|
463
512
|
- Added support for /global/ channel to publish messages across a multisite
|
464
513
|
- Cleaned up test harness so it uses local bus as opposed to global
|
@@ -467,19 +516,23 @@
|
|
467
516
|
- ensure_reactor could say the reactor is running, but it was not, on first call
|
468
517
|
|
469
518
|
06-12-2013
|
519
|
+
|
470
520
|
- Version 0.9.3.2
|
471
521
|
- Fix permissions in gem
|
472
522
|
|
473
523
|
05-12-2013
|
524
|
+
|
474
525
|
- Version 0.9.3.1
|
475
526
|
- Add MessageBus.diagnostics() for diagnosing bus issues client side
|
476
527
|
- Add more robustness to JavaScript, if callbacks used to fail they would halt the chain
|
477
528
|
|
478
529
|
03-12-2013
|
530
|
+
|
479
531
|
- Version 0.9.3
|
480
532
|
- Remove thin dependency
|
481
533
|
- Improve robustness under failure conditions
|
482
534
|
|
483
535
|
30-09-2013
|
536
|
+
|
484
537
|
- Fix failures in Ruby 1.9
|
485
538
|
- Set up rack hijack by default in light of passengers new setting
|
data/README.md
CHANGED
@@ -26,15 +26,21 @@ MessageBus only support officially supported versions of Ruby; as of [2021-03-31
|
|
26
26
|
|
27
27
|
Add this line to your application's Gemfile:
|
28
28
|
|
29
|
-
|
29
|
+
```ruby
|
30
|
+
gem 'message_bus'
|
31
|
+
```
|
30
32
|
|
31
33
|
And then execute:
|
32
34
|
|
33
|
-
|
35
|
+
```shell
|
36
|
+
$ bundle
|
37
|
+
```
|
34
38
|
|
35
39
|
Or install it yourself as:
|
36
40
|
|
37
|
-
|
41
|
+
```shell
|
42
|
+
$ gem install message_bus
|
43
|
+
```
|
38
44
|
|
39
45
|
## Usage
|
40
46
|
|
@@ -109,7 +115,7 @@ MessageBus.user_id_lookup do |env|
|
|
109
115
|
end
|
110
116
|
```
|
111
117
|
|
112
|
-
If both `user_ids` and `group_ids` options are supplied when publishing a message, the message will be targeted at clients with lookup return values that
|
118
|
+
If both `user_ids` and `group_ids` options are supplied when publishing a message, the message will be targeted at clients with lookup return values that matches on either the `user_ids` **or** the `group_ids` options.
|
113
119
|
|
114
120
|
```ruby
|
115
121
|
MessageBus.publish "/channel", "hello", user_ids: [1, 2, 3], group_ids: [1, 2, 3]
|
@@ -129,7 +135,7 @@ Custom client message filters can be registered via `MessageBus#register_client_
|
|
129
135
|
|
130
136
|
For example, ensuring that only messages seen by the server in the last 20 seconds are published to the client:
|
131
137
|
|
132
|
-
```
|
138
|
+
```ruby
|
133
139
|
MessageBus.register_client_message_filter('/test') do |message|
|
134
140
|
(Time.now.to_i - message.data[:published_at]) <= 20
|
135
141
|
end
|
@@ -163,32 +169,6 @@ curl -H "Content-Type: application/x-www-form-urlencoded" -X POST --data "/messa
|
|
163
169
|
|
164
170
|
You should see a reply with the messages of that channel you requested (in this case `/message`) starting at the message ID you requested (`0`). The URL parameter `dlp=t` disables long-polling: we do not want this request to stay open.
|
165
171
|
|
166
|
-
### Diagnostics
|
167
|
-
|
168
|
-
MessageBus comes with a diagnostics interface, which you can access at `/message-bus/_diagnostics`. This interface allows you visibility into the runtime behaviour of message_bus.
|
169
|
-
|
170
|
-
In order to use the diagnostics UI in your application, it is necessary to:
|
171
|
-
|
172
|
-
* Enable it
|
173
|
-
* Define a user ID for requests
|
174
|
-
* Define a check for admin role
|
175
|
-
|
176
|
-
as an example, you can do something like this:
|
177
|
-
|
178
|
-
```ruby
|
179
|
-
MessageBus.enable_diagnostics # Must be called after `MessageBus.after_fork` if using a forking webserver
|
180
|
-
|
181
|
-
MessageBus.user_id_lookup do |_env|
|
182
|
-
1
|
183
|
-
end
|
184
|
-
|
185
|
-
MessageBus.is_admin_lookup do |_env|
|
186
|
-
true
|
187
|
-
end
|
188
|
-
```
|
189
|
-
|
190
|
-
Of course, in your real-world application, you would define these values according to your authentication/authorization logic.
|
191
|
-
|
192
172
|
### Transport
|
193
173
|
|
194
174
|
MessageBus ships with 3 transport mechanisms.
|
@@ -280,7 +260,7 @@ MessageBus.start(); // call once at startup
|
|
280
260
|
MessageBus.callbackInterval = 500;
|
281
261
|
|
282
262
|
// you will get all new messages sent to channel
|
283
|
-
MessageBus.subscribe("/channel", function(data){
|
263
|
+
MessageBus.subscribe("/channel", function (data) {
|
284
264
|
// data shipped from server
|
285
265
|
});
|
286
266
|
|
@@ -386,6 +366,16 @@ headers|{}|Extra headers to be include with requests. Properties and values of o
|
|
386
366
|
|
387
367
|
message_bus can be configured to use one of several available storage backends, and each has its own configuration options.
|
388
368
|
|
369
|
+
### Keepalive
|
370
|
+
|
371
|
+
To ensure correct operation of message_bus, every 60 seconds a message is broadcast to itself. If for any reason the message is not consumed by the same process within 3 keepalive intervals a warning log message is raised.
|
372
|
+
|
373
|
+
To control keepalive interval use
|
374
|
+
|
375
|
+
```ruby
|
376
|
+
MessageBus.configure(keepalive_interval: 60)
|
377
|
+
```
|
378
|
+
|
389
379
|
### Redis
|
390
380
|
|
391
381
|
message_bus supports using Redis as a storage backend, and you can configure message_bus to use redis in `config/initializers/message_bus.rb`, like so:
|
@@ -400,17 +390,17 @@ The redis client message_bus uses is [redis-rb](https://github.com/redis/redis-r
|
|
400
390
|
|
401
391
|
Out of the box Redis keeps track of 2000 messages in the global backlog and 1000 messages in a per-channel backlog. Per-channel backlogs get cleared automatically after 7 days of inactivity.
|
402
392
|
|
403
|
-
This is configurable via accessors on the
|
393
|
+
This is configurable via accessors on the Backend instance.
|
404
394
|
|
405
395
|
```ruby
|
406
396
|
# only store 100 messages per channel
|
407
|
-
MessageBus.
|
397
|
+
MessageBus.backend_instance.max_backlog_size = 100
|
408
398
|
|
409
399
|
# only store 100 global messages
|
410
|
-
MessageBus.
|
400
|
+
MessageBus.backend_instance.max_global_backlog_size = 100
|
411
401
|
|
412
402
|
# flush per-channel backlog after 100 seconds of inactivity
|
413
|
-
MessageBus.
|
403
|
+
MessageBus.backend_instance.max_backlog_age = 100
|
414
404
|
```
|
415
405
|
|
416
406
|
### PostgreSQL
|
@@ -435,7 +425,6 @@ MessageBus.configure(backend: :memory)
|
|
435
425
|
|
436
426
|
The `:clear_every` option supported by the PostgreSQL backend is also supported by the in-memory backend.
|
437
427
|
|
438
|
-
|
439
428
|
### Transport codecs
|
440
429
|
|
441
430
|
By default MessageBus serializes messages to the backend using JSON. Under most situation this performs extremely well.
|
@@ -456,7 +445,7 @@ Keep in mind, much of MessageBus internals and supporting tools expect data to b
|
|
456
445
|
|
457
446
|
Another example may be very large and complicated messages where Oj in compatibility mode outperforms JSON. To opt for the Oj codec use:
|
458
447
|
|
459
|
-
```
|
448
|
+
```ruby
|
460
449
|
MessageBus.configure(transport_codec: MessageBus::Codec::Oj.new)
|
461
450
|
```
|
462
451
|
|
@@ -503,7 +492,6 @@ For more information see the [Passenger documentation](https://www.phusionpassen
|
|
503
492
|
|
504
493
|
```ruby
|
505
494
|
# path/to/your/config/puma.rb
|
506
|
-
require 'message_bus' # omit this line for Rails 5
|
507
495
|
on_worker_boot do
|
508
496
|
MessageBus.after_fork
|
509
497
|
end
|
@@ -513,7 +501,6 @@ end
|
|
513
501
|
|
514
502
|
```ruby
|
515
503
|
# path/to/your/config/unicorn.rb
|
516
|
-
require 'message_bus'
|
517
504
|
after_fork do |server, worker|
|
518
505
|
MessageBus.after_fork
|
519
506
|
end
|
@@ -554,26 +541,21 @@ MessageBus ships with an optional `DistributedCache` API which provides a simple
|
|
554
541
|
require 'message_bus/distributed_cache'
|
555
542
|
|
556
543
|
# process 1
|
557
|
-
|
558
544
|
cache = MessageBus::DistributedCache.new("animals")
|
559
545
|
|
560
546
|
# process 2
|
561
|
-
|
562
547
|
cache = MessageBus::DistributedCache.new("animals")
|
563
548
|
|
564
549
|
# process 1
|
565
|
-
|
566
550
|
cache["frogs"] = 5
|
567
551
|
|
568
552
|
# process 2
|
569
|
-
|
570
553
|
puts cache["frogs"]
|
571
554
|
# => 5
|
572
555
|
|
573
556
|
cache["frogs"] = nil
|
574
557
|
|
575
558
|
# process 1
|
576
|
-
|
577
559
|
puts cache["frogs"]
|
578
560
|
# => nil
|
579
561
|
```
|
@@ -631,7 +613,7 @@ In e.g. `config/initializers/message_bus.rb`:
|
|
631
613
|
```ruby
|
632
614
|
MessageBus.extra_response_headers_lookup do |env|
|
633
615
|
[
|
634
|
-
|
616
|
+
["Access-Control-Allow-Origin", "http://example.com:3000"],
|
635
617
|
]
|
636
618
|
end
|
637
619
|
```
|
@@ -692,8 +674,8 @@ In certain conditions, a status message will be delivered and look like this:
|
|
692
674
|
"message_id": -1,
|
693
675
|
"channel": "/__status",
|
694
676
|
"data": {
|
695
|
-
"/some/channel":5,
|
696
|
-
"/other/channel":9
|
677
|
+
"/some/channel": 5,
|
678
|
+
"/other/channel": 9
|
697
679
|
}
|
698
680
|
}
|
699
681
|
```
|
@@ -727,7 +709,7 @@ When submitting a PR, please be sure to include notes on it in the `Unreleased`
|
|
727
709
|
|
728
710
|
To run tests you need both Postgres and Redis installed. By default on Redis the tests connect to `localhost:6379` and on Postgres connect the database `localhost:5432/message_bus_test` with the system username; if you wish to override this, you can set alternative values:
|
729
711
|
|
730
|
-
```
|
712
|
+
```shell
|
731
713
|
PGUSER=some_user PGDATABASE=some_db bundle exec rake
|
732
714
|
```
|
733
715
|
|
@@ -742,7 +724,3 @@ While working on documentation, it is useful to automatically re-build it as you
|
|
742
724
|
### Benchmarks
|
743
725
|
|
744
726
|
Some simple benchmarks are implemented in `spec/performance` and can be executed using `rake performance` (or `docker-compose run tests rake performance`). You should run these before and after your changes to avoid introducing performance regressions.
|
745
|
-
|
746
|
-
### Diagnostics Interface
|
747
|
-
|
748
|
-
It is possible to manually test the diagnostics interface by executing `docker-compose up example` and then `open http://localhost:9292`.
|