karafka 2.2.14 → 2.3.0.alpha2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (107) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/.github/workflows/ci.yml +38 -12
  4. data/.ruby-version +1 -1
  5. data/CHANGELOG.md +24 -0
  6. data/Gemfile.lock +16 -16
  7. data/README.md +0 -2
  8. data/SECURITY.md +23 -0
  9. data/bin/integrations +1 -1
  10. data/config/locales/errors.yml +7 -1
  11. data/config/locales/pro_errors.yml +22 -0
  12. data/docker-compose.yml +1 -1
  13. data/karafka.gemspec +2 -2
  14. data/lib/karafka/admin/acl.rb +287 -0
  15. data/lib/karafka/admin.rb +9 -13
  16. data/lib/karafka/app.rb +5 -3
  17. data/lib/karafka/base_consumer.rb +9 -1
  18. data/lib/karafka/cli/base.rb +1 -1
  19. data/lib/karafka/connection/client.rb +83 -76
  20. data/lib/karafka/connection/conductor.rb +28 -0
  21. data/lib/karafka/connection/listener.rb +159 -42
  22. data/lib/karafka/connection/listeners_batch.rb +5 -11
  23. data/lib/karafka/connection/manager.rb +72 -0
  24. data/lib/karafka/connection/messages_buffer.rb +12 -0
  25. data/lib/karafka/connection/proxy.rb +17 -0
  26. data/lib/karafka/connection/status.rb +75 -0
  27. data/lib/karafka/contracts/config.rb +14 -10
  28. data/lib/karafka/contracts/consumer_group.rb +9 -1
  29. data/lib/karafka/contracts/topic.rb +3 -1
  30. data/lib/karafka/errors.rb +17 -0
  31. data/lib/karafka/instrumentation/logger_listener.rb +3 -0
  32. data/lib/karafka/instrumentation/notifications.rb +13 -5
  33. data/lib/karafka/instrumentation/vendors/appsignal/metrics_listener.rb +31 -28
  34. data/lib/karafka/instrumentation/vendors/datadog/logger_listener.rb +20 -1
  35. data/lib/karafka/instrumentation/vendors/datadog/metrics_listener.rb +15 -12
  36. data/lib/karafka/instrumentation/vendors/kubernetes/liveness_listener.rb +39 -36
  37. data/lib/karafka/pro/base_consumer.rb +47 -0
  38. data/lib/karafka/pro/connection/manager.rb +269 -0
  39. data/lib/karafka/pro/connection/multiplexing/listener.rb +40 -0
  40. data/lib/karafka/pro/iterator/tpl_builder.rb +1 -1
  41. data/lib/karafka/pro/iterator.rb +1 -6
  42. data/lib/karafka/pro/loader.rb +14 -0
  43. data/lib/karafka/pro/processing/coordinator.rb +2 -1
  44. data/lib/karafka/pro/processing/executor.rb +37 -0
  45. data/lib/karafka/pro/processing/expansions_selector.rb +32 -0
  46. data/lib/karafka/pro/processing/jobs/periodic.rb +41 -0
  47. data/lib/karafka/pro/processing/jobs/periodic_non_blocking.rb +32 -0
  48. data/lib/karafka/pro/processing/jobs_builder.rb +14 -3
  49. data/lib/karafka/pro/processing/offset_metadata/consumer.rb +44 -0
  50. data/lib/karafka/pro/processing/offset_metadata/fetcher.rb +131 -0
  51. data/lib/karafka/pro/processing/offset_metadata/listener.rb +46 -0
  52. data/lib/karafka/pro/processing/schedulers/base.rb +39 -23
  53. data/lib/karafka/pro/processing/schedulers/default.rb +12 -14
  54. data/lib/karafka/pro/processing/strategies/default.rb +154 -1
  55. data/lib/karafka/pro/processing/strategies/dlq/default.rb +39 -0
  56. data/lib/karafka/pro/processing/strategies/vp/default.rb +65 -25
  57. data/lib/karafka/pro/processing/virtual_offset_manager.rb +41 -11
  58. data/lib/karafka/pro/routing/features/long_running_job/topic.rb +2 -0
  59. data/lib/karafka/pro/routing/features/multiplexing/config.rb +38 -0
  60. data/lib/karafka/pro/routing/features/multiplexing/contracts/topic.rb +114 -0
  61. data/lib/karafka/pro/routing/features/multiplexing/patches/contracts/consumer_group.rb +42 -0
  62. data/lib/karafka/pro/routing/features/multiplexing/proxy.rb +38 -0
  63. data/lib/karafka/pro/routing/features/multiplexing/subscription_group.rb +42 -0
  64. data/lib/karafka/pro/routing/features/multiplexing/subscription_groups_builder.rb +40 -0
  65. data/lib/karafka/pro/routing/features/multiplexing.rb +59 -0
  66. data/lib/karafka/pro/routing/features/non_blocking_job/topic.rb +32 -0
  67. data/lib/karafka/pro/routing/features/non_blocking_job.rb +37 -0
  68. data/lib/karafka/pro/routing/features/offset_metadata/config.rb +33 -0
  69. data/lib/karafka/pro/routing/features/offset_metadata/contracts/topic.rb +42 -0
  70. data/lib/karafka/pro/routing/features/offset_metadata/topic.rb +65 -0
  71. data/lib/karafka/pro/routing/features/offset_metadata.rb +40 -0
  72. data/lib/karafka/pro/routing/features/patterns/contracts/consumer_group.rb +4 -0
  73. data/lib/karafka/pro/routing/features/patterns/detector.rb +18 -10
  74. data/lib/karafka/pro/routing/features/periodic_job/config.rb +37 -0
  75. data/lib/karafka/pro/routing/features/periodic_job/contracts/topic.rb +44 -0
  76. data/lib/karafka/pro/routing/features/periodic_job/topic.rb +94 -0
  77. data/lib/karafka/pro/routing/features/periodic_job.rb +27 -0
  78. data/lib/karafka/pro/routing/features/virtual_partitions/config.rb +1 -0
  79. data/lib/karafka/pro/routing/features/virtual_partitions/contracts/topic.rb +1 -0
  80. data/lib/karafka/pro/routing/features/virtual_partitions/topic.rb +7 -2
  81. data/lib/karafka/process.rb +5 -3
  82. data/lib/karafka/processing/coordinator.rb +5 -1
  83. data/lib/karafka/processing/executor.rb +16 -10
  84. data/lib/karafka/processing/executors_buffer.rb +19 -4
  85. data/lib/karafka/processing/schedulers/default.rb +3 -2
  86. data/lib/karafka/processing/strategies/default.rb +6 -0
  87. data/lib/karafka/processing/strategies/dlq.rb +36 -0
  88. data/lib/karafka/routing/builder.rb +12 -2
  89. data/lib/karafka/routing/consumer_group.rb +5 -5
  90. data/lib/karafka/routing/features/base.rb +44 -8
  91. data/lib/karafka/routing/features/dead_letter_queue/config.rb +6 -1
  92. data/lib/karafka/routing/features/dead_letter_queue/contracts/topic.rb +1 -0
  93. data/lib/karafka/routing/features/dead_letter_queue/topic.rb +9 -2
  94. data/lib/karafka/routing/subscription_group.rb +2 -2
  95. data/lib/karafka/routing/subscription_groups_builder.rb +11 -2
  96. data/lib/karafka/routing/topic.rb +8 -10
  97. data/lib/karafka/runner.rb +13 -3
  98. data/lib/karafka/server.rb +5 -9
  99. data/lib/karafka/setup/config.rb +17 -0
  100. data/lib/karafka/status.rb +23 -14
  101. data/lib/karafka/templates/karafka.rb.erb +7 -0
  102. data/lib/karafka/time_trackers/partition_usage.rb +56 -0
  103. data/lib/karafka/version.rb +1 -1
  104. data.tar.gz.sig +0 -0
  105. metadata +42 -10
  106. metadata.gz.sig +0 -0
  107. data/lib/karafka/connection/consumer_group_coordinator.rb +0 -48
@@ -184,8 +184,23 @@ module Karafka
184
184
 
185
185
  # Namespace for internal connection related settings
186
186
  setting :connection do
187
+ # Manages starting up and stopping Kafka connections
188
+ setting :manager, default: Connection::Manager.new
189
+ # Controls frequency of connections management checks
190
+ setting :conductor, default: Connection::Conductor.new
191
+
187
192
  # Settings that are altered by our client proxy layer
188
193
  setting :proxy do
194
+ # Committed offsets for given CG query
195
+ setting :committed do
196
+ # timeout for this request. For busy or remote clusters, this should be high enough
197
+ setting :timeout, default: 5_000
198
+ # How many times should we try to run this call before raising an error
199
+ setting :max_attempts, default: 3
200
+ # How long should we wait before next attempt in case of a failure
201
+ setting :wait_time, default: 1_000
202
+ end
203
+
189
204
  # Watermark offsets request settings
190
205
  setting :query_watermark_offsets do
191
206
  # timeout for this request. For busy or remote clusters, this should be high enough
@@ -222,6 +237,8 @@ module Karafka
222
237
  setting :strategy_selector, default: Processing::StrategySelector.new
223
238
  # option expansions_selector [Object] processing expansions selector to be used
224
239
  setting :expansions_selector, default: Processing::ExpansionsSelector.new
240
+ # option [Class] executor class
241
+ setting :executor_class, default: Processing::Executor
225
242
  end
226
243
 
227
244
  # Things related to operating on messages
@@ -42,25 +42,34 @@ module Karafka
42
42
  end
43
43
 
44
44
  STATES.each do |state, transition|
45
- define_method :"#{state}?" do
46
- @status == state
47
- end
45
+ class_eval <<~RUBY, __FILE__, __LINE__ + 1
46
+ def #{state}?
47
+ @status == :#{state}
48
+ end
49
+
50
+ def #{transition}
51
+ MUTEX.synchronize do
52
+ # Do not allow reverse state transitions (we always go one way) or transition to the same
53
+ # state as currently
54
+ return if @status && STATES.keys.index(:#{state}) <= STATES.keys.index(@status)
48
55
 
49
- define_method transition do
50
- MUTEX.synchronize do
51
- # Do not allow reverse state transitions (we always go one way) or transition to the same
52
- # state as currently
53
- return if @status && STATES.keys.index(state) <= STATES.keys.index(@status)
56
+ @status = :#{state}
54
57
 
55
- @status = state
58
+ # Skip on creation (initializing)
59
+ # We skip as during this state we do not have yet a monitor
60
+ return if initializing?
56
61
 
57
- # Skip on creation (initializing)
58
- # We skip as during this state we do not have yet a monitor
59
- return if initializing?
62
+ # We do not set conductor in the initializer because this status object is created
63
+ # before the configuration kicks in
64
+ # We need to signal conductor on each state change as those may be relevant to
65
+ # listeners operations
66
+ @conductor ||= Karafka::App.config.internal.connection.conductor
67
+ @conductor.signal
60
68
 
61
- Karafka.monitor.instrument("app.#{state}")
69
+ Karafka.monitor.instrument("app.#{state}")
70
+ end
62
71
  end
63
- end
72
+ RUBY
64
73
  end
65
74
 
66
75
  # @return [Boolean] true if we are in any of the status that would indicate we should no longer
@@ -68,3 +68,10 @@ class KarafkaApp < Karafka::App
68
68
  end
69
69
  end
70
70
  end
71
+
72
+ # Karafka now features a Web UI!
73
+ # Visit the setup documentation to get started and enhance your experience.
74
+ #
75
+ # https://karafka.io/docs/Web-UI-Getting-Started
76
+ #
77
+ # Karafka::Web.enable!
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Karafka
4
+ module TimeTrackers
5
+ # Tracker used to keep time reference when we last time dispatched any job related to a given
6
+ # topic partition.
7
+ #
8
+ # We can use it to know when last time a job was scheduled
9
+ #
10
+ # @note We do not track revocation as on revocation we clear given topic partition reference
11
+ # not to have a potential memory leak
12
+ #
13
+ # @note We do not track shutdown jobs as shutdown is finishing the process, so no time
14
+ # sensitive operations remain that would use this
15
+ #
16
+ # @note We consider partition as active if we scheduled any job related to it within the tick
17
+ # interval. This has nothing to do whether a partition is assigned.
18
+ class PartitionUsage < Base
19
+ # Creates new partition usage time tracker
20
+ def initialize
21
+ super
22
+
23
+ @last_usage = Hash.new do |topics_hash, topic_name|
24
+ topics_hash[topic_name] = Hash.new do |partitions_hash, partition_id|
25
+ partitions_hash[partition_id] = 0
26
+ end
27
+ end
28
+ end
29
+
30
+ # @param topic [String]
31
+ # @param partition [Integer]
32
+ # @param interval [Integer] minimum interval
33
+ # @return [Boolean] was this topic partition active
34
+ def active?(topic, partition, interval)
35
+ monotonic_now - @last_usage[topic][partition] < interval
36
+ end
37
+
38
+ # Marks usage of given partition
39
+ #
40
+ # @param topic [String]
41
+ # @param partition [Integer]
42
+ def track(topic, partition)
43
+ @last_usage[topic][partition] = monotonic_now
44
+ end
45
+
46
+ # Clears references about given partition. Useful on revocation so we do not store old
47
+ # unassigned partitions data
48
+ #
49
+ # @param topic [String]
50
+ # @param partition [Integer]
51
+ def revoke(topic, partition)
52
+ @last_usage[topic].delete(partition)
53
+ end
54
+ end
55
+ end
56
+ end
@@ -3,5 +3,5 @@
3
3
  # Main module namespace
4
4
  module Karafka
5
5
  # Current Karafka version
6
- VERSION = '2.2.14'
6
+ VERSION = '2.3.0.alpha2'
7
7
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: karafka
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.14
4
+ version: 2.3.0.alpha2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maciej Mensfeld
@@ -35,7 +35,7 @@ cert_chain:
35
35
  AnG1dJU+yL2BK7vaVytLTstJME5mepSZ46qqIJXMuWob/YPDmVaBF39TDSG9e34s
36
36
  msG3BiCqgOgHAnL23+CN3Rt8MsuRfEtoTKpJVcCfoEoNHOkc
37
37
  -----END CERTIFICATE-----
38
- date: 2023-12-07 00:00:00.000000000 Z
38
+ date: 2024-01-17 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: karafka-core
@@ -43,27 +43,27 @@ dependencies:
43
43
  requirements:
44
44
  - - ">="
45
45
  - !ruby/object:Gem::Version
46
- version: 2.2.7
46
+ version: 2.3.0.alpha1
47
47
  - - "<"
48
48
  - !ruby/object:Gem::Version
49
- version: 2.3.0
49
+ version: 2.4.0
50
50
  type: :runtime
51
51
  prerelease: false
52
52
  version_requirements: !ruby/object:Gem::Requirement
53
53
  requirements:
54
54
  - - ">="
55
55
  - !ruby/object:Gem::Version
56
- version: 2.2.7
56
+ version: 2.3.0.alpha1
57
57
  - - "<"
58
58
  - !ruby/object:Gem::Version
59
- version: 2.3.0
59
+ version: 2.4.0
60
60
  - !ruby/object:Gem::Dependency
61
61
  name: waterdrop
62
62
  requirement: !ruby/object:Gem::Requirement
63
63
  requirements:
64
64
  - - ">="
65
65
  - !ruby/object:Gem::Version
66
- version: 2.6.11
66
+ version: 2.6.12
67
67
  - - "<"
68
68
  - !ruby/object:Gem::Version
69
69
  version: 3.0.0
@@ -73,7 +73,7 @@ dependencies:
73
73
  requirements:
74
74
  - - ">="
75
75
  - !ruby/object:Gem::Version
76
- version: 2.6.11
76
+ version: 2.6.12
77
77
  - - "<"
78
78
  - !ruby/object:Gem::Version
79
79
  version: 3.0.0
@@ -123,6 +123,7 @@ files:
123
123
  - LICENSE-COMM
124
124
  - LICENSE-LGPL
125
125
  - README.md
126
+ - SECURITY.md
126
127
  - bin/benchmarks
127
128
  - bin/create_token
128
129
  - bin/integrations
@@ -151,6 +152,7 @@ files:
151
152
  - lib/karafka/active_job/job_extensions.rb
152
153
  - lib/karafka/active_job/job_options_contract.rb
153
154
  - lib/karafka/admin.rb
155
+ - lib/karafka/admin/acl.rb
154
156
  - lib/karafka/app.rb
155
157
  - lib/karafka/base_consumer.rb
156
158
  - lib/karafka/cli.rb
@@ -162,14 +164,16 @@ files:
162
164
  - lib/karafka/cli/server.rb
163
165
  - lib/karafka/cli/topics.rb
164
166
  - lib/karafka/connection/client.rb
165
- - lib/karafka/connection/consumer_group_coordinator.rb
167
+ - lib/karafka/connection/conductor.rb
166
168
  - lib/karafka/connection/listener.rb
167
169
  - lib/karafka/connection/listeners_batch.rb
170
+ - lib/karafka/connection/manager.rb
168
171
  - lib/karafka/connection/messages_buffer.rb
169
172
  - lib/karafka/connection/pauses_manager.rb
170
173
  - lib/karafka/connection/proxy.rb
171
174
  - lib/karafka/connection/raw_messages_buffer.rb
172
175
  - lib/karafka/connection/rebalance_manager.rb
176
+ - lib/karafka/connection/status.rb
173
177
  - lib/karafka/contracts.rb
174
178
  - lib/karafka/contracts/base.rb
175
179
  - lib/karafka/contracts/config.rb
@@ -217,10 +221,13 @@ files:
217
221
  - lib/karafka/pro/active_job/consumer.rb
218
222
  - lib/karafka/pro/active_job/dispatcher.rb
219
223
  - lib/karafka/pro/active_job/job_options_contract.rb
224
+ - lib/karafka/pro/base_consumer.rb
220
225
  - lib/karafka/pro/cleaner.rb
221
226
  - lib/karafka/pro/cleaner/errors.rb
222
227
  - lib/karafka/pro/cleaner/messages/message.rb
223
228
  - lib/karafka/pro/cleaner/messages/messages.rb
229
+ - lib/karafka/pro/connection/manager.rb
230
+ - lib/karafka/pro/connection/multiplexing/listener.rb
224
231
  - lib/karafka/pro/contracts/base.rb
225
232
  - lib/karafka/pro/contracts/server_cli_options.rb
226
233
  - lib/karafka/pro/encryption.rb
@@ -237,6 +244,8 @@ files:
237
244
  - lib/karafka/pro/loader.rb
238
245
  - lib/karafka/pro/processing/collapser.rb
239
246
  - lib/karafka/pro/processing/coordinator.rb
247
+ - lib/karafka/pro/processing/executor.rb
248
+ - lib/karafka/pro/processing/expansions_selector.rb
240
249
  - lib/karafka/pro/processing/filters/base.rb
241
250
  - lib/karafka/pro/processing/filters/delayer.rb
242
251
  - lib/karafka/pro/processing/filters/expirer.rb
@@ -245,9 +254,14 @@ files:
245
254
  - lib/karafka/pro/processing/filters/virtual_limiter.rb
246
255
  - lib/karafka/pro/processing/filters_applier.rb
247
256
  - lib/karafka/pro/processing/jobs/consume_non_blocking.rb
257
+ - lib/karafka/pro/processing/jobs/periodic.rb
258
+ - lib/karafka/pro/processing/jobs/periodic_non_blocking.rb
248
259
  - lib/karafka/pro/processing/jobs/revoked_non_blocking.rb
249
260
  - lib/karafka/pro/processing/jobs_builder.rb
250
261
  - lib/karafka/pro/processing/jobs_queue.rb
262
+ - lib/karafka/pro/processing/offset_metadata/consumer.rb
263
+ - lib/karafka/pro/processing/offset_metadata/fetcher.rb
264
+ - lib/karafka/pro/processing/offset_metadata/listener.rb
251
265
  - lib/karafka/pro/processing/partitioner.rb
252
266
  - lib/karafka/pro/processing/schedulers/base.rb
253
267
  - lib/karafka/pro/processing/schedulers/default.rb
@@ -328,6 +342,19 @@ files:
328
342
  - lib/karafka/pro/routing/features/long_running_job/config.rb
329
343
  - lib/karafka/pro/routing/features/long_running_job/contracts/topic.rb
330
344
  - lib/karafka/pro/routing/features/long_running_job/topic.rb
345
+ - lib/karafka/pro/routing/features/multiplexing.rb
346
+ - lib/karafka/pro/routing/features/multiplexing/config.rb
347
+ - lib/karafka/pro/routing/features/multiplexing/contracts/topic.rb
348
+ - lib/karafka/pro/routing/features/multiplexing/patches/contracts/consumer_group.rb
349
+ - lib/karafka/pro/routing/features/multiplexing/proxy.rb
350
+ - lib/karafka/pro/routing/features/multiplexing/subscription_group.rb
351
+ - lib/karafka/pro/routing/features/multiplexing/subscription_groups_builder.rb
352
+ - lib/karafka/pro/routing/features/non_blocking_job.rb
353
+ - lib/karafka/pro/routing/features/non_blocking_job/topic.rb
354
+ - lib/karafka/pro/routing/features/offset_metadata.rb
355
+ - lib/karafka/pro/routing/features/offset_metadata/config.rb
356
+ - lib/karafka/pro/routing/features/offset_metadata/contracts/topic.rb
357
+ - lib/karafka/pro/routing/features/offset_metadata/topic.rb
331
358
  - lib/karafka/pro/routing/features/patterns.rb
332
359
  - lib/karafka/pro/routing/features/patterns/builder.rb
333
360
  - lib/karafka/pro/routing/features/patterns/config.rb
@@ -343,6 +370,10 @@ files:
343
370
  - lib/karafka/pro/routing/features/pausing.rb
344
371
  - lib/karafka/pro/routing/features/pausing/contracts/topic.rb
345
372
  - lib/karafka/pro/routing/features/pausing/topic.rb
373
+ - lib/karafka/pro/routing/features/periodic_job.rb
374
+ - lib/karafka/pro/routing/features/periodic_job/config.rb
375
+ - lib/karafka/pro/routing/features/periodic_job/contracts/topic.rb
376
+ - lib/karafka/pro/routing/features/periodic_job/topic.rb
346
377
  - lib/karafka/pro/routing/features/throttling.rb
347
378
  - lib/karafka/pro/routing/features/throttling/config.rb
348
379
  - lib/karafka/pro/routing/features/throttling/contracts/topic.rb
@@ -427,6 +458,7 @@ files:
427
458
  - lib/karafka/templates/example_consumer.rb.erb
428
459
  - lib/karafka/templates/karafka.rb.erb
429
460
  - lib/karafka/time_trackers/base.rb
461
+ - lib/karafka/time_trackers/partition_usage.rb
430
462
  - lib/karafka/time_trackers/pause.rb
431
463
  - lib/karafka/time_trackers/poll.rb
432
464
  - lib/karafka/version.rb
@@ -459,7 +491,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
459
491
  - !ruby/object:Gem::Version
460
492
  version: '0'
461
493
  requirements: []
462
- rubygems_version: 3.4.19
494
+ rubygems_version: 3.5.3
463
495
  signing_key:
464
496
  specification_version: 4
465
497
  summary: Karafka is Ruby and Rails efficient Kafka processing framework.
metadata.gz.sig CHANGED
Binary file
@@ -1,48 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Karafka
4
- module Connection
5
- # This object represents a collective status of execution of group of listeners running inside
6
- # of one consumer group but in separate subscription groups.
7
- #
8
- # There are cases when we do not want to close a given client when others from the same
9
- # consumer group are running because it can cause instabilities due to early shutdown of some
10
- # of the clients out of same consumer group.
11
- #
12
- # We also want to make sure, we close one consumer at a time while others can continue polling.
13
- #
14
- # This prevents a scenario, where a rebalance is not acknowledged and we loose assignment
15
- # without having a chance to commit changes.
16
- class ConsumerGroupCoordinator
17
- # @param group_size [Integer] number of separate subscription groups in a consumer group
18
- def initialize(group_size)
19
- @shutdown_mutex = Mutex.new
20
- @group_size = group_size
21
- @finished = Set.new
22
- end
23
-
24
- # @return [Boolean] true if all the subscription groups from a given consumer group are
25
- # finished
26
- def finished?
27
- @finished.size == @group_size
28
- end
29
-
30
- # @return [Boolean] can we start shutdown on a given listener
31
- # @note If true, will also obtain a lock so no-one else will be closing the same time we do
32
- def shutdown?
33
- finished? && @shutdown_mutex.try_lock
34
- end
35
-
36
- # Unlocks the shutdown lock
37
- def unlock
38
- @shutdown_mutex.unlock if @shutdown_mutex.owned?
39
- end
40
-
41
- # Marks given listener as finished
42
- # @param listener_id [String]
43
- def finish_work(listener_id)
44
- @finished << listener_id
45
- end
46
- end
47
- end
48
- end