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 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