sneakers_handlers 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -3
- data/lib/sneakers_handlers/exponential_backoff_handler.rb +33 -12
- data/lib/sneakers_handlers/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cbe7ce0c08c9dfeccda3bd303f43ecc73d2dabfb
|
4
|
+
data.tar.gz: ca72c9cceddd50e52f76a2c710ed043e098f1b5e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c1937bf40e060b1c0e3f0f874ed196237ba371a1e9d2df17cfa63df8cfc07583d8f03e198dc40f8a10fbd4ecc4be4ea6f9a0465bc554712bd7b2298d64fdc53c
|
7
|
+
data.tar.gz: 8542234aa0d5c19d48207e8e8e03535ceb3fd4868cf409bd614e532f415c4e906cc6693736ca577a74a7ab5ace80887ccd3b8e0c0ae594363ed648ddfe06745e
|
data/README.md
CHANGED
@@ -55,7 +55,7 @@ class RetryWorker
|
|
55
55
|
|
56
56
|
from_queue "sneakers_handlers.my_queue",
|
57
57
|
ack: true,
|
58
|
-
exchange: "
|
58
|
+
exchange: "sneakers_handlers",
|
59
59
|
exchange_type: :topic,
|
60
60
|
routing_key: "sneakers_handlers.retry_test",
|
61
61
|
+ handler: SneakersHandlers::RetryHandler,
|
@@ -86,7 +86,7 @@ class ExponentialBackoffWorker
|
|
86
86
|
|
87
87
|
from_queue "sneakers_handlers.my_queue",
|
88
88
|
ack: true,
|
89
|
-
exchange: "
|
89
|
+
exchange: "sneakers_handlers",
|
90
90
|
exchange_type: :topic,
|
91
91
|
routing_key: "sneakers_handlers.backoff_test",
|
92
92
|
+ handler: SneakersHandlers::ExponentialBackoffHandler,
|
@@ -109,7 +109,7 @@ class ExponentialBackoffWorker
|
|
109
109
|
|
110
110
|
from_queue "sneakers_handlers.my_queue",
|
111
111
|
ack: true,
|
112
|
-
exchange: "
|
112
|
+
exchange: "sneakers_handlers",
|
113
113
|
exchange_type: :topic,
|
114
114
|
routing_key: "sneakers_handlers.backoff_test",
|
115
115
|
handler: SneakersHandlers::ExponentialBackoffHandler,
|
@@ -63,6 +63,8 @@ module SneakersHandlers
|
|
63
63
|
|
64
64
|
def retry_message(delivery_info, properties, message, reason)
|
65
65
|
attempt_number = death_count(properties[:headers])
|
66
|
+
headers = (properties[:headers] || {}).merge(rejection_reason: reason.to_s)
|
67
|
+
headers = remove_delayed_message_header(headers)
|
66
68
|
|
67
69
|
if attempt_number < max_retries
|
68
70
|
delay = backoff_function.call(attempt_number)
|
@@ -74,13 +76,25 @@ module SneakersHandlers
|
|
74
76
|
retry_queue = create_retry_queue!(delay)
|
75
77
|
retry_queue.bind(primary_exchange, routing_key: routing_key)
|
76
78
|
|
77
|
-
headers = (properties[:headers] || {}).merge(rejection_reason: reason.to_s)
|
78
79
|
primary_exchange.publish(message, routing_key: routing_key, headers: headers)
|
79
|
-
acknowledge(delivery_info, properties, message)
|
80
80
|
else
|
81
81
|
log("msg=erroring, count=#{attempt_number}, properties=#{properties}")
|
82
|
-
|
82
|
+
error_exchange.publish(message, routing_key: dlx_routing_key, headers: headers)
|
83
83
|
end
|
84
|
+
|
85
|
+
acknowledge(delivery_info, properties, message)
|
86
|
+
end
|
87
|
+
|
88
|
+
# This is the header used by the `rabbitmq-delayed-message-exchange`
|
89
|
+
# plugin. We need to remove it otherwise the messages that are published
|
90
|
+
# to the retry queues would also be delayed. This becomes a bigger problem
|
91
|
+
# when we have queues that expire (using `x-expires`) shortly after they
|
92
|
+
# are created. If, for instance, we have a retry queue that expires in 5
|
93
|
+
# seconds, and we publish a message with `x-delay` of `6000`, by the time
|
94
|
+
# this message is ready to be published, the queue doesn't exist anymore,
|
95
|
+
# resulting in a message loss.
|
96
|
+
def remove_delayed_message_header(headers)
|
97
|
+
headers.reject { |k| k == "x-delay" }
|
84
98
|
end
|
85
99
|
|
86
100
|
def death_count(headers)
|
@@ -97,28 +111,35 @@ module SneakersHandlers
|
|
97
111
|
end
|
98
112
|
end
|
99
113
|
|
100
|
-
def create_exchange(name)
|
114
|
+
def create_exchange(name, type = "topic")
|
101
115
|
log("creating exchange=#{name}")
|
102
116
|
|
103
|
-
channel.exchange(name, type:
|
117
|
+
channel.exchange(name, type: type, durable: options[:exchange_options][:durable])
|
104
118
|
end
|
105
119
|
|
106
120
|
def primary_exchange
|
107
|
-
@primary_exchange ||= create_exchange(
|
121
|
+
@primary_exchange ||= create_exchange(options[:exchange], options[:exchange_options][:type])
|
108
122
|
end
|
109
123
|
|
110
|
-
def
|
111
|
-
|
112
|
-
|
113
|
-
dlx_exchange_name = arguments.fetch("x-dead-letter-exchange")
|
114
|
-
dlx_routing_key = arguments.fetch("x-dead-letter-routing-key")
|
124
|
+
def error_exchange
|
125
|
+
@error_exchange ||= create_error_exchange!
|
126
|
+
end
|
115
127
|
|
116
|
-
|
128
|
+
def create_error_exchange!
|
129
|
+
create_exchange(dlx_exchange_name).tap do |exchange|
|
117
130
|
queue = channel.queue("#{@queue.name}.error", durable: options[:queue_options][:durable])
|
118
131
|
queue.bind(exchange, routing_key: dlx_routing_key)
|
119
132
|
end
|
120
133
|
end
|
121
134
|
|
135
|
+
def dlx_routing_key
|
136
|
+
options[:queue_options][:arguments].fetch("x-dead-letter-routing-key")
|
137
|
+
end
|
138
|
+
|
139
|
+
def dlx_exchange_name
|
140
|
+
options[:queue_options][:arguments].fetch("x-dead-letter-exchange")
|
141
|
+
end
|
142
|
+
|
122
143
|
def create_retry_queue!(delay)
|
123
144
|
clear_queues_cache
|
124
145
|
channel.queue("#{queue.name}.retry.#{delay}",
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sneakers_handlers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Bohn, Abe Petrillo, Brian Storti
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-12-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sneakers
|