nulogy_message_bus_consumer 2.0.0 → 2.0.1

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
  SHA256:
3
- metadata.gz: bc67ef0e9ad8a12ee285d6bf7898e262d5af7140ddfc50ce1265086f313dab5d
4
- data.tar.gz: 968ef8091b7ba117dad2a90f265a9e89844f1604404449d703868f343f41c35d
3
+ metadata.gz: b061b1d275f3492d62c8ecfd64caaae755f9d9b60a0a4f7466ad72833788ea6b
4
+ data.tar.gz: df51d614f618b900c5cd432668d68bf1843ba74b4bf54a8ad39544812dd56ede
5
5
  SHA512:
6
- metadata.gz: 7def0d572755c4b66d8f3ca603fadc64dd3aa159a3a6e868ec38efa589d08d50bdd9ba187cb89ef8773fbe02a5616dea705b6366b4c7371bec3e3979788fca39
7
- data.tar.gz: 89b43ff862329c5710f5441a765e20924d0411a0f012905d2e697fb6029b3f9df716b9704d290e37e357bbd4f196d30dd86774ae25bcc017cb6087ad1a2e7845
6
+ metadata.gz: dd39cb403d86779b3466f7b95ca1403adc6ed464c36c6270e6a37b5dca92117c0507ca3b9d1e4fb6632f737db57ebb2178cd484e65c163083e2ffab321d0775c
7
+ data.tar.gz: 8548a30f820e217a2bcfd1467d5967767649f096298c5fe6d5b407f6bc0da4aefd4a9170da9b9109b3621c7facc6bd3b9dcad03d5dcea337c3dd9443c4e61718
@@ -10,17 +10,18 @@ module NulogyMessageBusConsumer
10
10
  wait_for { consumer.assignment.empty? }
11
11
  end
12
12
 
13
- def wait_for(attempts: 100, interval: 0.1)
13
+ def wait_for(attempts: 1000, interval: 0.1)
14
14
  attempts.times do
15
- break if yield
15
+ return if yield
16
16
 
17
17
  sleep interval
18
18
  end
19
+ raise "wait_for timed out!"
19
20
  end
20
21
 
21
- def every_message_until_none_are_left(consumer)
22
+ def every_message_until_none_are_left(consumer, timeout = 250)
22
23
  Enumerator.new do |yielder|
23
- while (message = consumer.poll(250))
24
+ while (message = consumer.poll(timeout))
24
25
  yielder.yield(message)
25
26
  end
26
27
  end
@@ -41,9 +41,9 @@ module NulogyMessageBusConsumer
41
41
  end
42
42
 
43
43
  def to_h
44
- instance_variable_names.each_with_object({}) do |attribute_name, hash|
45
- attribute_name.sub!("@", "")
46
- hash[attribute_name] = public_send(attribute_name)
44
+ instance_variables.each_with_object({}) do |instance_variable, hash|
45
+ attribute_name = instance_variable.to_s.delete("@")
46
+ hash[attribute_name.to_sym] = public_send(attribute_name)
47
47
  end
48
48
  end
49
49
  end
@@ -1,6 +1,10 @@
1
1
  module NulogyMessageBusConsumer
2
2
  module Steps
3
3
  class CommitOnSuccess
4
+ def initialize(logger)
5
+ @logger = logger
6
+ end
7
+
4
8
  def call(kafka_consumer:, message:, **_)
5
9
  result = yield
6
10
 
@@ -9,8 +13,18 @@ module NulogyMessageBusConsumer
9
13
  if result == :success
10
14
  kafka_consumer.store_offset(message)
11
15
  kafka_consumer.commit
16
+ @logger.info(JSON.dump({
17
+ event: "message_committed",
18
+ kafka_message_id: message.id,
19
+ message: message.to_h
20
+ }))
12
21
  else
13
22
  reconnect_to_reprocess_same_message(kafka_consumer)
23
+ @logger.info(JSON.dump({
24
+ event: "message_failed",
25
+ kafka_message_id: message.id,
26
+ message: message.to_h
27
+ }))
14
28
  end
15
29
 
16
30
  result
@@ -22,6 +36,7 @@ module NulogyMessageBusConsumer
22
36
  subscriptions = kafka_consumer.subscription
23
37
  kafka_consumer.unsubscribe
24
38
  kafka_consumer.subscribe(*subscriptions.to_h.keys)
39
+ KafkaUtils.wait_for_assignment(kafka_consumer)
25
40
  end
26
41
 
27
42
  def raise_if_invalid(result)
@@ -1,17 +1,23 @@
1
1
  module NulogyMessageBusConsumer
2
2
  module Steps
3
3
  class StreamMessagesUntilNoneAreLeft
4
- def initialize(logger)
4
+ def initialize(logger, timeout = 250)
5
5
  @logger = logger
6
+ @timeout = timeout
6
7
  end
7
8
 
8
9
  def call(kafka_consumer:, **_)
9
- KafkaUtils.every_message_until_none_are_left(kafka_consumer).each do |kafka_message|
10
- yield(
10
+ KafkaUtils.every_message_until_none_are_left(kafka_consumer, @timeout).each do |kafka_message|
11
+ result = yield(
11
12
  message: Message.from_kafka(kafka_message),
12
13
  kafka_message: kafka_message
13
14
  )
15
+ if result == :failure
16
+ # stop reading on failure or else we'll get stuck in a loop
17
+ return :failure
18
+ end
14
19
  end
20
+ :success
15
21
  rescue => e
16
22
  @logger.error(JSON.dump({
17
23
  event: "message_processing_errored",
@@ -1,3 +1,3 @@
1
1
  module NulogyMessageBusConsumer
2
- VERSION = "2.0.0"
2
+ VERSION = "2.0.1"
3
3
  end
@@ -67,7 +67,7 @@ module NulogyMessageBusConsumer
67
67
  Steps::StreamMessages.new(logger),
68
68
  # Message processing steps start here.
69
69
  Steps::LogMessages.new(logger),
70
- Steps::CommitOnSuccess.new,
70
+ Steps::CommitOnSuccess.new(logger),
71
71
  Steps::DeduplicateMessages.new(logger)
72
72
  ])
73
73
  end
@@ -10,7 +10,7 @@
10
10
  #
11
11
  # It's strongly recommended that you check this file into your version control system.
12
12
 
13
- ActiveRecord::Schema.define(version: 20_200_612_184_425) do
13
+ ActiveRecord::Schema.define(version: 2020_06_12_184425) do
14
14
  # These are extensions that must be enabled in order to support this database
15
15
  enable_extension "plpgsql"
16
16
  enable_extension "uuid-ossp"