sneakers_handlers 0.0.5 → 0.0.6
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 +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
|