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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a6171b028c2674e05b3e2c3f0ae4d0a5eff055a4
4
- data.tar.gz: f0c361710063ef3aabf29ca22ea253e69420e606
3
+ metadata.gz: cbe7ce0c08c9dfeccda3bd303f43ecc73d2dabfb
4
+ data.tar.gz: ca72c9cceddd50e52f76a2c710ed043e098f1b5e
5
5
  SHA512:
6
- metadata.gz: 40cd50b730aec166522c3d2a11bae66f86d36b41c13012981008dc85537759b34a40eb0f960acddee0c4c57bba02df2fef25f750021d8dbfd370248a079b1e67
7
- data.tar.gz: d1c68dbb52716b7b1d17c61b46aedf2b7e482630b411b686a38fcf1dd67bf59dab8092f48c8dcd3b8e5cb2c41a16fa5bd7f4dd0378414f37f36710d0c1032d9c
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: "sneaker_handlers",
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: "sneaker_handlers",
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: "sneaker_handlers",
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
- channel.reject(delivery_info.delivery_tag)
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: "topic", durable: options[:exchange_options][:durable])
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("#{options[:exchange]}")
121
+ @primary_exchange ||= create_exchange(options[:exchange], options[:exchange_options][:type])
108
122
  end
109
123
 
110
- def create_error_exchange!
111
- arguments = options[:queue_options][:arguments]
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
- @error_exchange ||= create_exchange(dlx_exchange_name).tap do |exchange|
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}",
@@ -1,3 +1,3 @@
1
1
  module SneakersHandlers
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.6"
3
3
  end
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.5
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-02 00:00:00.000000000 Z
11
+ date: 2017-12-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sneakers