hutch 0.27.0 → 1.1.1
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/.github/workflows/test.yml +42 -0
- data/CHANGELOG.md +144 -2
- data/Gemfile +4 -1
- data/LICENSE +1 -0
- data/README.md +97 -6
- data/bin/ci/before_build.sh +20 -0
- data/bin/ci/before_build_docker.sh +20 -0
- data/bin/ci/install_on_debian.sh +36 -7
- data/hutch.gemspec +7 -9
- data/lib/hutch/adapters/bunny.rb +4 -0
- data/lib/hutch/adapters/march_hare.rb +4 -0
- data/lib/hutch/broker.rb +13 -9
- data/lib/hutch/cli.rb +17 -10
- data/lib/hutch/config.rb +20 -9
- data/lib/hutch/consumer.rb +46 -2
- data/lib/hutch/error_handlers/bugsnag.rb +30 -0
- data/lib/hutch/error_handlers/sentry.rb +6 -11
- data/lib/hutch/error_handlers/sentry_raven.rb +31 -0
- data/lib/hutch/error_handlers.rb +2 -0
- data/lib/hutch/publisher.rb +1 -1
- data/lib/hutch/serializers/json.rb +1 -1
- data/lib/hutch/tracers/datadog.rb +17 -0
- data/lib/hutch/tracers.rb +1 -0
- data/lib/hutch/version.rb +1 -1
- data/lib/hutch/worker.rb +1 -1
- data/spec/hutch/broker_spec.rb +1 -1
- data/spec/hutch/config_spec.rb +38 -0
- data/spec/hutch/consumer_spec.rb +82 -4
- data/spec/hutch/error_handlers/bugsnag_spec.rb +55 -0
- data/spec/hutch/error_handlers/sentry_raven_spec.rb +37 -0
- data/spec/hutch/error_handlers/sentry_spec.rb +4 -2
- data/spec/hutch/tracers/datadog_spec.rb +44 -0
- data/spec/hutch/worker_spec.rb +2 -2
- metadata +30 -19
- data/.travis.yml +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9725ddb3e39e305bad95abd6c8605c1d9828691904bb2ae31430fd22d88bd180
|
4
|
+
data.tar.gz: db1d87d81de0f89c84b1ec387c66443aa9ead6be2d71b50b6cee32e9146dd080
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 296138c5cb4c08340f4a72bb8d30009402272f9843efffd0dc1d647328ca1531d188fd3b5a9a15f891f4a8447dbf5f72a7a583aa702f1c999fc557c1ab4ac024
|
7
|
+
data.tar.gz: 2c0406261d2535d5e5d00037e20e29f5cb781e337732491cf36195231e5d647b75c0d96d74c0861afa36cfb24575a0e2b34ce06f59693a98b84342cf1d52ad95
|
@@ -0,0 +1,42 @@
|
|
1
|
+
name: Test
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches: [ master ]
|
6
|
+
pull_request:
|
7
|
+
branches: [ master ]
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
test:
|
11
|
+
|
12
|
+
runs-on: ubuntu-latest
|
13
|
+
|
14
|
+
services:
|
15
|
+
rabbitmq:
|
16
|
+
image: rabbitmq:3-management
|
17
|
+
ports:
|
18
|
+
- 5672:5672
|
19
|
+
- 15672:15672
|
20
|
+
options: --name rabbitmq
|
21
|
+
|
22
|
+
strategy:
|
23
|
+
fail-fast: false
|
24
|
+
matrix:
|
25
|
+
ruby-version: ['jruby-9.2.19.0', 'jruby-9.3.0.0', 'jruby-head']
|
26
|
+
|
27
|
+
steps:
|
28
|
+
- uses: actions/checkout@v2
|
29
|
+
- name: Set up Ruby
|
30
|
+
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
|
31
|
+
# change this to (see https://github.com/ruby/setup-ruby#versioning):
|
32
|
+
uses: ruby/setup-ruby@v1
|
33
|
+
# uses: ruby/setup-ruby@473e4d8fe5dd94ee328fdfca9f8c9c7afc9dae5e
|
34
|
+
with:
|
35
|
+
ruby-version: ${{ matrix.ruby-version }}
|
36
|
+
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
37
|
+
- name: Set up RabbitMQ
|
38
|
+
run: |
|
39
|
+
until sudo lsof -i:5672; do echo "Waiting for RabbitMQ to start..."; sleep 1; done
|
40
|
+
./bin/ci/before_build_docker.sh
|
41
|
+
- name: Run tests
|
42
|
+
run: bundle exec rspec spec
|
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,150 @@
|
|
1
|
-
##
|
1
|
+
## 1.1.1 (March 18th, 2022)
|
2
|
+
### Dependency Bump
|
2
3
|
|
3
|
-
|
4
|
+
Hutch now allows ActiveSupport 7.x.
|
4
5
|
|
5
6
|
|
7
|
+
## 1.1.0 (July 26th, 2021)
|
8
|
+
|
9
|
+
### Bugsnag Error Handler
|
10
|
+
|
11
|
+
Contributed by @ivanhuang1.
|
12
|
+
|
13
|
+
GitHub issue: [#362](https://github.com/ruby-amqp/hutch/pull/362)
|
14
|
+
|
15
|
+
### Datadog Tracer
|
16
|
+
|
17
|
+
Contributed by Karol @Azdaroth Galanciak.
|
18
|
+
|
19
|
+
GitHub issue: [#360](https://github.com/ruby-amqp/hutch/pull/360)
|
20
|
+
|
21
|
+
### Updated Sentry Error Handler
|
22
|
+
|
23
|
+
Contributed by Karol @Azdaroth Galanciak.
|
24
|
+
|
25
|
+
GitHub issue: [#363](https://github.com/ruby-amqp/hutch/pull/363)
|
26
|
+
|
27
|
+
### Type Casting for Values Set Using Hutch::Config.set
|
28
|
+
|
29
|
+
Values set with `Hutch::Config.set` now have expected setting type casting
|
30
|
+
applied to them.
|
31
|
+
|
32
|
+
Contributed by Karol @Azdaroth Galanciak.
|
33
|
+
|
34
|
+
GitHub issue: [#358](https://github.com/ruby-amqp/hutch/pull/358)
|
35
|
+
|
36
|
+
### Wider MultiJson Adoption
|
37
|
+
|
38
|
+
Contributed by Ulysse @BuonOmo Buonomo.
|
39
|
+
|
40
|
+
GitHub issue: [#356](https://github.com/ruby-amqp/hutch/pull/356)
|
41
|
+
|
42
|
+
### README Corrections
|
43
|
+
|
44
|
+
Contributed by Johan @johankok Kok.
|
45
|
+
|
46
|
+
GitHub issue: [#353](https://github.com/ruby-amqp/hutch/pull/353)
|
47
|
+
|
48
|
+
## 1.0.0 (April 8th, 2020)
|
49
|
+
|
50
|
+
Hutch has been around for several years. It is time to ship a 1.0. With it we try to correct
|
51
|
+
a few of overly opinionated decisions from recent releases. This means this release
|
52
|
+
contains potentially breaking changes.
|
53
|
+
|
54
|
+
### Breaking Changes
|
55
|
+
|
56
|
+
* Hutch will no longer configure any queue type (such as [quorum queues](https://www.rabbitmq.com/quorum-queues.html))
|
57
|
+
or queue mode (used by classic [lazy queues](https://www.rabbitmq.com/lazy-queues.html))
|
58
|
+
by default as that can be breaking change for existing Hutch and RabbitMQ installations due to the
|
59
|
+
[property equivalence requirement](https://www.rabbitmq.com/queues.html#property-equivalence) in AMQP 0-9-1.
|
60
|
+
|
61
|
+
This means **some defaults introduced in `0.28.0` ([gocardless/hutch#341](https://github.com/gocardless/hutch/pull/341)) were reverted**.
|
62
|
+
The user has to opt in to configure the queue type and mode and other [optional arguments](https://www.rabbitmq.com/queues.html#optional-arguments) they need to use.
|
63
|
+
Most optional arguments can be set via [policies](https://www.rabbitmq.com/parameters.html#policies) which is always the recommended approach.
|
64
|
+
Queue type, unfortunately, is not one of them as different queue types have completely different
|
65
|
+
implementation details, on disk data formats and so on.
|
66
|
+
|
67
|
+
To use a quorum queue, use the `quorum_queue` consumer DSL method:
|
68
|
+
|
69
|
+
``` ruby
|
70
|
+
class ConsumerUsingQuorumQueue
|
71
|
+
include Hutch::Consumer
|
72
|
+
consume 'hutch.test1'
|
73
|
+
# when in doubt, prefer using a policy to this DSL
|
74
|
+
# https://www.rabbitmq.com/parameters.html#policies
|
75
|
+
arguments 'x-key': :value
|
76
|
+
|
77
|
+
quorum_queue
|
78
|
+
end
|
79
|
+
```
|
80
|
+
|
81
|
+
To use a classic lazy queue, use the `lazy_queue` consumer DSL method:
|
82
|
+
|
83
|
+
``` ruby
|
84
|
+
class ConsumerUsingLazyQueue
|
85
|
+
include Hutch::Consumer
|
86
|
+
consume 'hutch.test1'
|
87
|
+
# when in doubt, prefer using a policy to this DSL
|
88
|
+
# https://www.rabbitmq.com/parameters.html#policies
|
89
|
+
arguments 'x-key': :value
|
90
|
+
|
91
|
+
lazy_queue
|
92
|
+
classic_queue
|
93
|
+
end
|
94
|
+
```
|
95
|
+
|
96
|
+
By default Hutch will not configure any `x-queue-type` or `x-queue-mode` optional arguments
|
97
|
+
which is identical to RabbitMQ defaults (a regular classic queue).
|
98
|
+
|
99
|
+
Note that as of RabbitMQ 3.8.2, an omitted `x-queue-type` is [considered to be identical](https://github.com/rabbitmq/rabbitmq-common/issues/341)
|
100
|
+
to `x-queue-type` set to `classic` by RabbitMQ server.
|
101
|
+
|
102
|
+
|
103
|
+
#### Enhancements
|
104
|
+
|
105
|
+
* Exchange type is now configurable via the `mq_exchange_type` config setting. Supported exchanges must be
|
106
|
+
compatible with topic exchanges (e.g. wrap it). Default value is `topic`.
|
107
|
+
|
108
|
+
This feature is limited to topic and delayed message exchange plugins and is mostly
|
109
|
+
useful for forward compatibility.
|
110
|
+
|
111
|
+
Contributed by Michael Bumann.
|
112
|
+
|
113
|
+
GitHub issue: [gocardless/hutch#349](https://github.com/gocardless/hutch/pull/349)
|
114
|
+
|
115
|
+
|
116
|
+
## 0.28.0 (March 17, 2020)
|
117
|
+
|
118
|
+
### Enhancements
|
119
|
+
|
120
|
+
* Add lazy and quorum options for queues.
|
121
|
+
|
122
|
+
GitHub issue: [gocardless/hutch#341](https://github.com/gocardless/hutch/pull/341)
|
123
|
+
|
124
|
+
Contributed by: Arthur Del Esposte
|
125
|
+
|
126
|
+
* Log level in the message publisher switched to DEBUG.
|
127
|
+
|
128
|
+
GitHub issue: [gocardless/hutch#343](https://github.com/gocardless/hutch/pull/343)
|
129
|
+
|
130
|
+
Contributed by: Codruț Constantin Gușoi
|
131
|
+
|
132
|
+
### Documentation
|
133
|
+
|
134
|
+
* Add zeitwerk note to README.
|
135
|
+
|
136
|
+
GitHub issue: [gocardless/hutch#342](https://github.com/gocardless/hutch/pull/342)
|
137
|
+
|
138
|
+
Contributed by: Paolo Zaccagnini
|
139
|
+
|
140
|
+
### CI
|
141
|
+
|
142
|
+
* Use jruby-9.2.9.0
|
143
|
+
|
144
|
+
GitHub issue: [gocardless/hutch#336](https://github.com/gocardless/hutch/pull/336)
|
145
|
+
|
146
|
+
Contributed by: Olle Jonsson
|
147
|
+
|
6
148
|
## 0.27.0 (September 9th, 2019)
|
7
149
|
|
8
150
|
### Enhancements
|
data/Gemfile
CHANGED
@@ -20,11 +20,14 @@ group :development, :test do
|
|
20
20
|
gem "simplecov", "~> 0.12"
|
21
21
|
|
22
22
|
gem "sentry-raven"
|
23
|
+
gem "sentry-ruby"
|
23
24
|
gem "honeybadger"
|
24
25
|
gem "coveralls", "~> 0.8.15", require: false
|
25
26
|
gem "newrelic_rpm"
|
26
|
-
gem "
|
27
|
+
gem "ddtrace"
|
28
|
+
gem "airbrake", "~> 10.0"
|
27
29
|
gem "rollbar"
|
30
|
+
gem "bugsnag"
|
28
31
|
end
|
29
32
|
|
30
33
|
group :development, :darwin do
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|

|
2
2
|
|
3
3
|
[](http://badge.fury.io/rb/hutch)
|
4
|
-
[](https://travis-ci.org/gocardless/hutch)
|
5
4
|
[](https://codeclimate.com/github/gocardless/hutch)
|
6
5
|
|
7
6
|
Hutch is a Ruby library for enabling asynchronous inter-service communication
|
@@ -39,7 +38,7 @@ gem install hutch
|
|
39
38
|
|
40
39
|
## Requirements
|
41
40
|
|
42
|
-
- Hutch requires Ruby 2.
|
41
|
+
- Hutch requires Ruby 2.4+ or JRuby 9K.
|
43
42
|
- Hutch requires RabbitMQ 3.3 or later.
|
44
43
|
|
45
44
|
## Overview
|
@@ -59,8 +58,8 @@ Hutch uses [Bunny](http://rubybunny.info) or [March Hare](http://rubymarchhare.i
|
|
59
58
|
### Project Maturity
|
60
59
|
|
61
60
|
Hutch is a mature project that was originally extracted from production systems
|
62
|
-
at [GoCardless](https://gocardless.com) in 2013 and is now maintained by
|
63
|
-
|
61
|
+
at [GoCardless](https://gocardless.com) in 2013 and is now maintained by its contributors
|
62
|
+
and users.
|
64
63
|
|
65
64
|
## Consumers
|
66
65
|
|
@@ -109,6 +108,28 @@ class FailedPaymentConsumer
|
|
109
108
|
end
|
110
109
|
```
|
111
110
|
|
111
|
+
It is possible to set some custom options to consumer's queue explicitly.
|
112
|
+
This example sets the consumer's queue as a
|
113
|
+
[quorum queue](https://www.rabbitmq.com/quorum-queues.html)
|
114
|
+
and to operate in the [lazy mode](https://www.rabbitmq.com/lazy-queues.html).
|
115
|
+
The `initial_group_size`
|
116
|
+
[argument](https://www.rabbitmq.com/quorum-queues.html#replication-factor) is
|
117
|
+
optional.
|
118
|
+
|
119
|
+
```ruby
|
120
|
+
class FailedPaymentConsumer
|
121
|
+
include Hutch::Consumer
|
122
|
+
consume 'gc.ps.payment.failed'
|
123
|
+
queue_name 'failed_payments'
|
124
|
+
lazy_queue
|
125
|
+
quorum_queue initial_group_size: 3
|
126
|
+
|
127
|
+
def process(message)
|
128
|
+
mark_payment_as_failed(message[:id])
|
129
|
+
end
|
130
|
+
end
|
131
|
+
```
|
132
|
+
|
112
133
|
You can also set custom arguments per consumer. This example declares a consumer with
|
113
134
|
a maximum length of 10 messages:
|
114
135
|
|
@@ -166,6 +187,12 @@ This will enable NewRelic custom instrumentation:
|
|
166
187
|
Hutch::Config.set(:tracer, Hutch::Tracers::NewRelic)
|
167
188
|
```
|
168
189
|
|
190
|
+
And this will enable Datadog custom instrumentation:
|
191
|
+
|
192
|
+
```ruby
|
193
|
+
Hutch::Config.set(:tracer, Hutch::Tracers::Datadog)
|
194
|
+
```
|
195
|
+
|
169
196
|
Batteries included!
|
170
197
|
|
171
198
|
## Running Hutch
|
@@ -219,13 +246,55 @@ directory of a Rails app, or pass the path to a Rails app in with the
|
|
219
246
|
the `app/consumers/` directory, to allow them to be auto-loaded when Rails
|
220
247
|
boots.
|
221
248
|
|
249
|
+
If you're using the new Zeitwerk autoloader (enabled by default in Rails 6)
|
250
|
+
and the consumers are not loaded in development environment you will need to
|
251
|
+
trigger the autoloading in an initializer with
|
252
|
+
|
253
|
+
```ruby
|
254
|
+
::Zeitwerk::Loader.eager_load_all
|
255
|
+
```
|
256
|
+
|
257
|
+
or with something more specific like
|
258
|
+
|
259
|
+
```ruby
|
260
|
+
autoloader = Rails.autoloaders.main
|
261
|
+
|
262
|
+
Dir.glob(File.join('app/consumers', '*_consumer.rb')).each do |consumer|
|
263
|
+
autoloader.preload(consumer)
|
264
|
+
end
|
265
|
+
```
|
266
|
+
|
267
|
+
### Consumer Groups
|
268
|
+
|
269
|
+
It is possible to load only a subset of consumers. This is done by defining a consumer
|
270
|
+
group under the `consumer_groups` configuration key:
|
271
|
+
|
272
|
+
``` yaml
|
273
|
+
consumer_groups:
|
274
|
+
payments:
|
275
|
+
- DepositConsumer
|
276
|
+
- CashoutConsumer
|
277
|
+
notification:
|
278
|
+
- EmailNotificationConsumer
|
279
|
+
```
|
280
|
+
|
281
|
+
To only load a group of consumers, use the `--only-group` option:
|
282
|
+
|
283
|
+
``` shell
|
284
|
+
hutch --only-group=payments --config=/path/to/hutch.yaml
|
285
|
+
```
|
286
|
+
|
287
|
+
### Loading Consumers Manually (One-by-One)
|
288
|
+
|
222
289
|
To require files that define consumers manually, simply pass each file as an
|
223
290
|
option to `--require`. Hutch will automatically detect whether you've provided
|
224
291
|
a Rails app or a standard file, and take the appropriate behaviour:
|
225
292
|
|
226
293
|
```bash
|
227
|
-
|
228
|
-
|
294
|
+
# loads a rails app
|
295
|
+
hutch --require path/to/rails-app
|
296
|
+
# loads a ruby file
|
297
|
+
hutch --require path/to/file.rb
|
229
298
|
```
|
230
299
|
|
231
300
|
### Stopping Hutch
|
@@ -344,6 +413,7 @@ Known configuration parameters are:
|
|
344
413
|
* `automatically_recover`: Bunny's enable/disable network recovery (default: `true`)
|
345
414
|
* `network_recovery_interval`: Bunny's reconnect interval (default: `1`)
|
346
415
|
* `tracer`: tracer to use to track message processing
|
416
|
+
* `namespace`: A namespace string to help group your queues (default: `nil`)
|
347
417
|
|
348
418
|
### Environment variables
|
349
419
|
|
@@ -402,6 +472,13 @@ Generate with
|
|
402
472
|
<td><tt>HUTCH_MQ_EXCHANGE</tt></td>
|
403
473
|
<td><p>RabbitMQ Exchange to use for publishing</p></td>
|
404
474
|
</tr>
|
475
|
+
<tr>
|
476
|
+
<td><tt>mq_exchange_type</tt></td>
|
477
|
+
<td>topic</td>
|
478
|
+
<td>String</td>
|
479
|
+
<td><tt>HUTCH_MQ_EXCHANGE_TYPE</tt></td>
|
480
|
+
<td><p>RabbitMQ Exchange type to use for publishing</p></td>
|
481
|
+
</tr>
|
405
482
|
<tr>
|
406
483
|
<td><tt>mq_vhost</tt></td>
|
407
484
|
<td>/</td>
|
@@ -584,5 +661,19 @@ Generate with
|
|
584
661
|
<td><tt>HUTCH_CONSUMER_TAG_PREFIX</tt></td>
|
585
662
|
<td><p>Prefix displayed on the consumers tags.</p></td>
|
586
663
|
</tr>
|
664
|
+
<tr>
|
665
|
+
<td><tt>namespace</tt></td>
|
666
|
+
<td>nil</td>
|
667
|
+
<td>String</td>
|
668
|
+
<td><tt>HUTCH_NAMESPACE</tt></td>
|
669
|
+
<td><p>A namespace to help group your queues</p></td>
|
670
|
+
</tr>
|
671
|
+
<tr>
|
672
|
+
<td><tt>group</tt></td>
|
673
|
+
<td>''</td>
|
674
|
+
<td>String</td>
|
675
|
+
<td><tt>HUTCH_GROUP</tt></td>
|
676
|
+
<td></td>
|
677
|
+
</tr>
|
587
678
|
</tbody>
|
588
679
|
</table>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/usr/bin/env sh
|
2
|
+
|
3
|
+
CTL=${BUNNY_RABBITMQCTL:-"sudo rabbitmqctl"}
|
4
|
+
PLUGINS=${BUNNY_RABBITMQ_PLUGINS:-"sudo rabbitmq-plugins"}
|
5
|
+
|
6
|
+
echo "Will use rabbitmqctl at ${CTL}"
|
7
|
+
echo "Will use rabbitmq-plugins at ${PLUGINS}"
|
8
|
+
|
9
|
+
$PLUGINS enable rabbitmq_management
|
10
|
+
|
11
|
+
sleep 3
|
12
|
+
|
13
|
+
# guest:guest has full access to /
|
14
|
+
$CTL add_vhost /
|
15
|
+
$CTL add_user guest guest
|
16
|
+
$CTL set_permissions -p / guest ".*" ".*" ".*"
|
17
|
+
|
18
|
+
# Reduce retention policy for faster publishing of stats
|
19
|
+
$CTL eval 'supervisor2:terminate_child(rabbit_mgmt_sup_sup, rabbit_mgmt_sup), application:set_env(rabbitmq_management, sample_retention_policies, [{global, [{605, 1}]}, {basic, [{605, 1}]}, {detailed, [{10, 1}]}]), rabbit_mgmt_sup_sup:start_child().' || true
|
20
|
+
$CTL eval 'supervisor2:terminate_child(rabbit_mgmt_agent_sup_sup, rabbit_mgmt_agent_sup), application:set_env(rabbitmq_management_agent, sample_retention_policies, [{global, [{605, 1}]}, {basic, [{605, 1}]}, {detailed, [{10, 1}]}]), rabbit_mgmt_agent_sup_sup:start_child().' || true
|
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
|
3
|
+
CTL=${MARCH_HARE_RABBITMQCTL:="docker exec rabbitmq rabbitmqctl"}
|
4
|
+
PLUGINS=${MARCH_HARE_RABBITMQ_PLUGINS:="docker exec rabbitmq rabbitmq-plugins"}
|
5
|
+
|
6
|
+
$PLUGINS enable rabbitmq_management
|
7
|
+
|
8
|
+
sleep 3
|
9
|
+
|
10
|
+
# guest:guest has full access to /
|
11
|
+
|
12
|
+
$CTL add_vhost /
|
13
|
+
# $CTL add_user guest guest # already exists
|
14
|
+
$CTL set_permissions -p / guest ".*" ".*" ".*"
|
15
|
+
|
16
|
+
# Reduce retention policy for faster publishing of stats
|
17
|
+
$CTL eval 'supervisor2:terminate_child(rabbit_mgmt_sup_sup, rabbit_mgmt_sup), application:set_env(rabbitmq_management, sample_retention_policies, [{global, [{605, 1}]}, {basic, [{605, 1}]}, {detailed, [{10, 1}]}]), rabbit_mgmt_sup_sup:start_child().'
|
18
|
+
$CTL eval 'supervisor2:terminate_child(rabbit_mgmt_agent_sup_sup, rabbit_mgmt_agent_sup), application:set_env(rabbitmq_management_agent, sample_retention_policies, [{global, [{605, 1}]}, {basic, [{605, 1}]}, {detailed, [{10, 1}]}]), rabbit_mgmt_agent_sup_sup:start_child().'
|
19
|
+
|
20
|
+
sleep 3
|
data/bin/ci/install_on_debian.sh
CHANGED
@@ -1,17 +1,46 @@
|
|
1
1
|
#!/bin/sh
|
2
2
|
|
3
|
-
sudo apt-get install -y
|
4
|
-
wget -O - "https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc" | sudo apt-key add -
|
3
|
+
sudo apt-get install curl gnupg debian-keyring debian-archive-keyring apt-transport-https -y
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
## Team RabbitMQ's main signing key
|
6
|
+
sudo apt-key adv --keyserver "hkps://keys.openpgp.org" --recv-keys "0x0A9AF2115F4687BD29803A206B73A36E6026DFCA"
|
7
|
+
## Launchpad PPA that provides modern Erlang releases
|
8
|
+
sudo apt-key adv --keyserver "keyserver.ubuntu.com" --recv-keys "F77F1EDA57EBB1CC"
|
9
|
+
## PackageCloud RabbitMQ repository
|
10
|
+
sudo apt-key adv --keyserver "keyserver.ubuntu.com" --recv-keys "F6609E60DC62814E"
|
11
|
+
|
12
|
+
## Add apt repositories maintained by Team RabbitMQ
|
13
|
+
sudo tee /etc/apt/sources.list.d/rabbitmq.list <<EOF
|
14
|
+
## Provides modern Erlang/OTP releases
|
15
|
+
##
|
16
|
+
## "bionic" as distribution name should work for any reasonably recent Ubuntu or Debian release.
|
17
|
+
## See the release to distribution mapping table in RabbitMQ doc guides to learn more.
|
18
|
+
deb http://ppa.launchpad.net/rabbitmq/rabbitmq-erlang/ubuntu bionic main
|
19
|
+
deb-src http://ppa.launchpad.net/rabbitmq/rabbitmq-erlang/ubuntu bionic main
|
20
|
+
|
21
|
+
## Provides RabbitMQ
|
22
|
+
##
|
23
|
+
## "bionic" as distribution name should work for any reasonably recent Ubuntu or Debian release.
|
24
|
+
## See the release to distribution mapping table in RabbitMQ doc guides to learn more.
|
25
|
+
deb https://packagecloud.io/rabbitmq/rabbitmq-server/ubuntu/ bionic main
|
26
|
+
deb-src https://packagecloud.io/rabbitmq/rabbitmq-server/ubuntu/ bionic main
|
9
27
|
EOF
|
10
28
|
|
29
|
+
## Update package indices
|
11
30
|
sudo apt-get update -y
|
12
|
-
|
13
|
-
|
31
|
+
|
32
|
+
## Install Erlang packages
|
33
|
+
sudo apt-get install -y erlang-base \
|
34
|
+
erlang-asn1 erlang-crypto erlang-eldap erlang-ftp erlang-inets \
|
35
|
+
erlang-mnesia erlang-os-mon erlang-parsetools erlang-public-key \
|
36
|
+
erlang-runtime-tools erlang-snmp erlang-ssl \
|
37
|
+
erlang-syntax-tools erlang-tftp erlang-tools erlang-xmerl
|
38
|
+
|
39
|
+
## Install rabbitmq-server and its dependencies
|
40
|
+
sudo apt-get install rabbitmq-server -y --fix-missing
|
14
41
|
|
15
42
|
sudo service rabbitmq-server start
|
16
43
|
|
44
|
+
sudo rabbitmqctl await_startup --timeout 120
|
45
|
+
|
17
46
|
until sudo lsof -i:5672; do echo "Waiting for RabbitMQ to start..."; sleep 1; done
|
data/hutch.gemspec
CHANGED
@@ -6,21 +6,19 @@ Gem::Specification.new do |gem|
|
|
6
6
|
gem.add_runtime_dependency 'march_hare', '>= 3.0.0'
|
7
7
|
else
|
8
8
|
gem.platform = Gem::Platform::RUBY
|
9
|
-
gem.add_runtime_dependency 'bunny', '>= 2.
|
9
|
+
gem.add_runtime_dependency 'bunny', '>= 2.19', '< 3.0'
|
10
10
|
end
|
11
11
|
gem.add_runtime_dependency 'carrot-top', '~> 0.0.7'
|
12
|
-
gem.add_runtime_dependency 'multi_json', '~> 1.
|
13
|
-
gem.add_runtime_dependency 'activesupport', '>= 4.2', '<
|
12
|
+
gem.add_runtime_dependency 'multi_json', '~> 1.15'
|
13
|
+
gem.add_runtime_dependency 'activesupport', '>= 4.2', '< 8'
|
14
14
|
|
15
15
|
gem.name = 'hutch'
|
16
|
-
gem.summary = '
|
17
|
-
gem.description = 'Hutch is a Ruby library for enabling asynchronous '
|
18
|
-
'inter-service communication using RabbitMQ.'
|
16
|
+
gem.summary = 'Opinionated asynchronous inter-service communication using RabbitMQ'
|
17
|
+
gem.description = 'Hutch is a Ruby library for enabling asynchronous inter-service communication using RabbitMQ'
|
19
18
|
gem.version = Hutch::VERSION.dup
|
20
19
|
gem.required_ruby_version = '>= 2.2'
|
21
|
-
gem.authors = ['Harry Marr']
|
22
|
-
gem.
|
23
|
-
gem.homepage = 'https://github.com/gocardless/hutch'
|
20
|
+
gem.authors = ['Harry Marr', 'Michael Klishin']
|
21
|
+
gem.homepage = 'https://github.com/ruby-amqp/hutch'
|
24
22
|
gem.require_paths = ['lib']
|
25
23
|
gem.license = 'MIT'
|
26
24
|
gem.executables = ['hutch']
|
data/lib/hutch/adapters/bunny.rb
CHANGED
@@ -32,6 +32,10 @@ module Hutch
|
|
32
32
|
def current_timestamp
|
33
33
|
Time.now
|
34
34
|
end
|
35
|
+
|
36
|
+
def self.new_exchange(ch, exchange_type, exchange_name, exchange_options)
|
37
|
+
MarchHare::Exchange.new(ch, exchange_name, exchange_options.merge(type: exchange_type))
|
38
|
+
end
|
35
39
|
end
|
36
40
|
end
|
37
41
|
end
|
data/lib/hutch/broker.rb
CHANGED
@@ -122,11 +122,12 @@ module Hutch
|
|
122
122
|
|
123
123
|
def declare_exchange(ch = channel)
|
124
124
|
exchange_name = @config[:mq_exchange]
|
125
|
+
exchange_type = @config[:mq_exchange_type]
|
125
126
|
exchange_options = { durable: true }.merge(@config[:mq_exchange_options])
|
126
127
|
logger.info "using topic exchange '#{exchange_name}'"
|
127
128
|
|
128
129
|
with_bunny_precondition_handler('exchange') do
|
129
|
-
|
130
|
+
Adapter.new_exchange(ch, exchange_type, exchange_name, exchange_options)
|
130
131
|
end
|
131
132
|
end
|
132
133
|
|
@@ -170,23 +171,26 @@ module Hutch
|
|
170
171
|
end
|
171
172
|
|
172
173
|
# Create / get a durable queue and apply namespace if it exists.
|
173
|
-
def queue(name,
|
174
|
+
def queue(name, options = {})
|
174
175
|
with_bunny_precondition_handler('queue') do
|
175
176
|
namespace = @config[:namespace].to_s.downcase.gsub(/[^-_:\.\w]/, "")
|
176
177
|
name = name.prepend(namespace + ":") if namespace.present?
|
177
|
-
channel.queue(name,
|
178
|
+
channel.queue(name, **options)
|
178
179
|
end
|
179
180
|
end
|
180
181
|
|
181
182
|
# Return a mapping of queue names to the routing keys they're bound to.
|
182
183
|
def bindings
|
183
184
|
results = Hash.new { |hash, key| hash[key] = [] }
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
185
|
+
|
186
|
+
filtered = api_client.bindings.
|
187
|
+
reject { |b| b['destination'] == b['routing_key'] }.
|
188
|
+
select { |b| b['source'] == @config[:mq_exchange] && b['vhost'] == @config[:mq_vhost] }
|
189
|
+
|
190
|
+
filtered.each do |binding|
|
188
191
|
results[binding['destination']] << binding['routing_key']
|
189
192
|
end
|
193
|
+
|
190
194
|
results
|
191
195
|
end
|
192
196
|
|
@@ -194,8 +198,8 @@ module Hutch
|
|
194
198
|
def unbind_redundant_bindings(queue, routing_keys)
|
195
199
|
return unless http_api_use_enabled?
|
196
200
|
|
197
|
-
bindings.
|
198
|
-
|
201
|
+
filtered = bindings.select { |dest, keys| dest == queue.name }
|
202
|
+
filtered.each do |dest, keys|
|
199
203
|
keys.reject { |key| routing_keys.include?(key) }.each do |key|
|
200
204
|
logger.debug "removing redundant binding #{queue.name} <--> #{key}"
|
201
205
|
queue.unbind(exchange, routing_key: key)
|
data/lib/hutch/cli.rb
CHANGED
@@ -33,6 +33,23 @@ module Hutch
|
|
33
33
|
def load_app
|
34
34
|
# Try to load a Rails app in the current directory
|
35
35
|
load_rails_app('.') if Hutch::Config.autoload_rails
|
36
|
+
set_up_code_paths!
|
37
|
+
|
38
|
+
# Because of the order things are required when we run the Hutch binary
|
39
|
+
# in hutch/bin, the Sentry Raven gem gets required **after** the error
|
40
|
+
# handlers are set up. Due to this, we never got any Sentry notifications
|
41
|
+
# when an error occurred in any of the consumers.
|
42
|
+
if defined?(Raven)
|
43
|
+
Hutch::Config[:error_handlers] << Hutch::ErrorHandlers::SentryRaven.new
|
44
|
+
end
|
45
|
+
if defined?(Sentry)
|
46
|
+
Hutch::Config[:error_handlers] << Hutch::ErrorHandlers::Sentry.new
|
47
|
+
end
|
48
|
+
|
49
|
+
true
|
50
|
+
end
|
51
|
+
|
52
|
+
def set_up_code_paths!
|
36
53
|
Hutch::Config.require_paths.each do |path|
|
37
54
|
# See if each path is a Rails app. If so, try to load it.
|
38
55
|
next if load_rails_app(path)
|
@@ -51,16 +68,6 @@ module Hutch
|
|
51
68
|
$LOAD_PATH.pop
|
52
69
|
end
|
53
70
|
end
|
54
|
-
|
55
|
-
# Because of the order things are required when we run the Hutch binary
|
56
|
-
# in hutch/bin, the Sentry Raven gem gets required **after** the error
|
57
|
-
# handlers are set up. Due to this, we never got any Sentry notifications
|
58
|
-
# when an error occurred in any of the consumers.
|
59
|
-
if defined?(Raven)
|
60
|
-
Hutch::Config[:error_handlers] << Hutch::ErrorHandlers::Sentry.new
|
61
|
-
end
|
62
|
-
|
63
|
-
true
|
64
71
|
end
|
65
72
|
|
66
73
|
def load_rails_app(path)
|