karafka 2.0.8 → 2.0.9
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
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +12 -0
- data/Gemfile.lock +9 -8
- data/bin/integrations +38 -13
- data/config/errors.yml +1 -0
- data/lib/karafka/active_job/routing/extensions.rb +2 -0
- data/lib/karafka/base_consumer.rb +3 -3
- data/lib/karafka/connection/client.rb +24 -14
- data/lib/karafka/pro/base_consumer.rb +15 -19
- data/lib/karafka/pro/contracts/consumer_group_topic.rb +16 -0
- data/lib/karafka/pro/processing/coordinator.rb +3 -4
- data/lib/karafka/processing/coordinator.rb +17 -2
- data/lib/karafka/routing/builder.rb +3 -2
- data/lib/karafka/routing/topic.rb +4 -2
- data/lib/karafka/version.rb +1 -1
- data/lib/karafka.rb +1 -0
- data.tar.gz.sig +0 -0
- metadata +2 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ee9c609249fea5e996d9506bd3e04435dbcc189addcd6383a092b080e776f525
|
4
|
+
data.tar.gz: 6ed354b21361966f1988bb90b29cea14d842fb02299f12bd30ab4ec57eaf8cc1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a20a1bf2d2b86fcd63bf2e036d535c1d7aa4d06943cc00a414851e8f0a0054054eff621b67bfd355456ac93f1561931aec598b43c0ca535ceaa57c9d94957378
|
7
|
+
data.tar.gz: '05996101b929a143926508a0afb69e6e6b09de04fd088dd06c83cba122efc9cfecdd7586892c80ab5409964737dd4a74b0ecea0f8a30ff1dfbf032f6bb289288'
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
# Karafka framework changelog
|
2
2
|
|
3
|
+
## 2.0.9 (2022-09-22)
|
4
|
+
- Fix Singleton not visible when used in PORO (#1034)
|
5
|
+
- Divide pristine specs into pristine and poro. Pristine will still have helpers loaded, poro will have nothing.
|
6
|
+
- Fix a case where `manual_offset_management` offset upon error is not reverted to the first message in a case where there were no markings as consumed at all for multiple batches.
|
7
|
+
- Implement small reliability improvements around marking as consumed.
|
8
|
+
- Introduce a config sanity check to make sure Virtual Partitions are not used with manual offset management.
|
9
|
+
- Fix a possibility of using `active_job_topic` with Virtual Partitions and manual offset management (ActiveJob still can use due to atomicity of jobs).
|
10
|
+
- Move seek offset ownership to the coordinator to allow Virtual Partitions further development.
|
11
|
+
- Improve client shutdown in specs.
|
12
|
+
- Do not reset client on network issue and rely on `librdkafka` to do so.
|
13
|
+
- Allow for nameless (anonymous) subscription groups (#1033)
|
14
|
+
|
3
15
|
## 2.0.8 (2022-09-19)
|
4
16
|
- [Breaking change] Rename Virtual Partitions `concurrency` to `max_partitions` to avoid confusion (#1023).
|
5
17
|
- Allow for block based subscription groups management (#1030).
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
karafka (2.0.
|
4
|
+
karafka (2.0.9)
|
5
5
|
karafka-core (>= 2.0.2, < 3.0.0)
|
6
6
|
rdkafka (>= 0.12)
|
7
7
|
thor (>= 0.20)
|
@@ -11,10 +11,10 @@ PATH
|
|
11
11
|
GEM
|
12
12
|
remote: https://rubygems.org/
|
13
13
|
specs:
|
14
|
-
activejob (7.0.
|
15
|
-
activesupport (= 7.0.
|
14
|
+
activejob (7.0.4)
|
15
|
+
activesupport (= 7.0.4)
|
16
16
|
globalid (>= 0.3.6)
|
17
|
-
activesupport (7.0.
|
17
|
+
activesupport (7.0.4)
|
18
18
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
19
19
|
i18n (>= 1.6, < 2)
|
20
20
|
minitest (>= 5.1)
|
@@ -33,7 +33,7 @@ GEM
|
|
33
33
|
karafka-core (2.0.2)
|
34
34
|
concurrent-ruby (>= 1.1)
|
35
35
|
mini_portile2 (2.8.0)
|
36
|
-
minitest (5.16.
|
36
|
+
minitest (5.16.3)
|
37
37
|
rake (13.0.6)
|
38
38
|
rdkafka (0.12.0)
|
39
39
|
ffi (~> 1.15)
|
@@ -45,13 +45,13 @@ GEM
|
|
45
45
|
rspec-mocks (~> 3.11.0)
|
46
46
|
rspec-core (3.11.0)
|
47
47
|
rspec-support (~> 3.11.0)
|
48
|
-
rspec-expectations (3.11.
|
48
|
+
rspec-expectations (3.11.1)
|
49
49
|
diff-lcs (>= 1.2.0, < 2.0)
|
50
50
|
rspec-support (~> 3.11.0)
|
51
51
|
rspec-mocks (3.11.1)
|
52
52
|
diff-lcs (>= 1.2.0, < 2.0)
|
53
53
|
rspec-support (~> 3.11.0)
|
54
|
-
rspec-support (3.11.
|
54
|
+
rspec-support (3.11.1)
|
55
55
|
simplecov (0.21.2)
|
56
56
|
docile (~> 1.1)
|
57
57
|
simplecov-html (~> 0.11)
|
@@ -68,6 +68,7 @@ GEM
|
|
68
68
|
zeitwerk (2.6.0)
|
69
69
|
|
70
70
|
PLATFORMS
|
71
|
+
arm64-darwin
|
71
72
|
x86_64-linux
|
72
73
|
|
73
74
|
DEPENDENCIES
|
@@ -79,4 +80,4 @@ DEPENDENCIES
|
|
79
80
|
simplecov
|
80
81
|
|
81
82
|
BUNDLED WITH
|
82
|
-
2.3.
|
83
|
+
2.3.22
|
data/bin/integrations
CHANGED
@@ -2,9 +2,14 @@
|
|
2
2
|
|
3
3
|
# Runner to run integration specs in parallel
|
4
4
|
|
5
|
-
# Part of integration specs run
|
5
|
+
# Part of integration specs run linear without bundler.
|
6
6
|
# If we would run bundle exec when running this code, bundler would inject its own context
|
7
7
|
# into them, messing things up heavily
|
8
|
+
#
|
9
|
+
# Types of specs:
|
10
|
+
# - regular - can run in parallel, includes all the helpers
|
11
|
+
# - pristine - cannot run in parallel, uses custom bundler but includes helpers
|
12
|
+
# - poro - cannot run in parallel, uses custom bundler, does not include any helpers
|
8
13
|
raise 'This code needs to be executed WITHOUT bundle exec' if Kernel.const_defined?(:Bundler)
|
9
14
|
|
10
15
|
require 'open3'
|
@@ -64,13 +69,19 @@ class Scenario
|
|
64
69
|
@path.gsub("#{ROOT_PATH}/spec/integrations/", '')
|
65
70
|
end
|
66
71
|
|
67
|
-
# @return [
|
68
|
-
def
|
72
|
+
# @return [Symbol] type of spec
|
73
|
+
def type
|
69
74
|
scenario_dir = File.dirname(@path)
|
70
75
|
|
71
|
-
|
72
|
-
|
73
|
-
|
76
|
+
return :poro if scenario_dir.end_with?('_poro')
|
77
|
+
return :pristine if scenario_dir.end_with?('_pristine')
|
78
|
+
|
79
|
+
:regular
|
80
|
+
end
|
81
|
+
|
82
|
+
# @return [Boolean] any spec that is not a regular one should not run in parallel with others
|
83
|
+
def linear?
|
84
|
+
!type == :regular
|
74
85
|
end
|
75
86
|
|
76
87
|
# @return [Boolean] did this scenario finished or is it still running
|
@@ -145,9 +156,23 @@ class Scenario
|
|
145
156
|
# Sets up a proper environment for a given spec to run and returns the run command
|
146
157
|
# @return [String] run command
|
147
158
|
def init_and_build_cmd
|
148
|
-
|
149
|
-
|
150
|
-
|
159
|
+
case type
|
160
|
+
when :poro
|
161
|
+
scenario_dir = File.dirname(@path)
|
162
|
+
# We copy the spec into a temp dir, not to pollute the spec location with logs, etc
|
163
|
+
temp_dir = Dir.mktmpdir
|
164
|
+
file_name = File.basename(@path)
|
165
|
+
|
166
|
+
FileUtils.cp_r("#{scenario_dir}/.", temp_dir)
|
167
|
+
|
168
|
+
<<~CMD
|
169
|
+
cd #{temp_dir} &&
|
170
|
+
KARAFKA_GEM_DIR=#{ROOT_PATH} \
|
171
|
+
BUNDLE_AUTO_INSTALL=true \
|
172
|
+
PRISTINE_MODE=true \
|
173
|
+
bundle exec ruby #{file_name}
|
174
|
+
CMD
|
175
|
+
when :pristine
|
151
176
|
scenario_dir = File.dirname(@path)
|
152
177
|
# We copy the spec into a temp dir, not to pollute the spec location with logs, etc
|
153
178
|
temp_dir = Dir.mktmpdir
|
@@ -196,8 +221,8 @@ scenarios = specs
|
|
196
221
|
.shuffle(random: Random.new(seed))
|
197
222
|
.map { |integration_test| Scenario.new(integration_test) }
|
198
223
|
|
199
|
-
regulars = scenarios.reject(&:
|
200
|
-
|
224
|
+
regulars = scenarios.reject(&:linear?)
|
225
|
+
linears = scenarios - regulars
|
201
226
|
|
202
227
|
active_scenarios = []
|
203
228
|
finished_scenarios = []
|
@@ -206,10 +231,10 @@ while finished_scenarios.size < scenarios.size
|
|
206
231
|
# If we have space to run another scenario, we add it
|
207
232
|
if active_scenarios.size < CONCURRENCY
|
208
233
|
scenario = nil
|
209
|
-
# We can run only one
|
234
|
+
# We can run only one linear at the same time due to concurrency issues within bundler
|
210
235
|
# Since they usually take longer than others, we try to run them as fast as possible when there
|
211
236
|
# is a slot
|
212
|
-
scenario =
|
237
|
+
scenario = linears.pop unless active_scenarios.any?(&:linear?)
|
213
238
|
scenario ||= regulars.pop
|
214
239
|
|
215
240
|
if scenario
|
data/config/errors.yml
CHANGED
@@ -57,3 +57,4 @@ en:
|
|
57
57
|
consumer_format: needs to inherit from Karafka::Pro::BaseConsumer and not Karafka::Consumer
|
58
58
|
virtual_partitions.partitioner_respond_to_call: needs to be defined and needs to respond to `#call`
|
59
59
|
virtual_partitions.max_partitions_format: needs to be equl or more than 1
|
60
|
+
manual_offset_management_not_with_virtual_partitions: cannot be used together with Virtual Partitions
|
@@ -19,6 +19,8 @@ module Karafka
|
|
19
19
|
|
20
20
|
instance_eval(&block)
|
21
21
|
|
22
|
+
target.tags << :active_job
|
23
|
+
|
22
24
|
# This is handled by our custom ActiveJob consumer
|
23
25
|
# Without this, default behaviour would cause messages to skip upon shutdown as the
|
24
26
|
# offset would be committed for the last message
|
@@ -77,7 +77,7 @@ module Karafka
|
|
77
77
|
# with manual offset management
|
78
78
|
mark_as_consumed(messages.last)
|
79
79
|
else
|
80
|
-
pause(
|
80
|
+
pause(coordinator.seek_offset)
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
@@ -155,7 +155,7 @@ module Karafka
|
|
155
155
|
return false
|
156
156
|
end
|
157
157
|
|
158
|
-
|
158
|
+
coordinator.seek_offset = message.offset + 1
|
159
159
|
|
160
160
|
true
|
161
161
|
end
|
@@ -172,7 +172,7 @@ module Karafka
|
|
172
172
|
return false
|
173
173
|
end
|
174
174
|
|
175
|
-
|
175
|
+
coordinator.seek_offset = message.offset + 1
|
176
176
|
|
177
177
|
true
|
178
178
|
end
|
@@ -153,7 +153,7 @@ module Karafka
|
|
153
153
|
|
154
154
|
pause_msg = Messages::Seek.new(topic, partition, offset)
|
155
155
|
|
156
|
-
internal_commit_offsets(async:
|
156
|
+
internal_commit_offsets(async: true)
|
157
157
|
|
158
158
|
# Here we do not use our cached tpls because we should not try to pause something we do
|
159
159
|
# not own anymore.
|
@@ -267,8 +267,15 @@ module Karafka
|
|
267
267
|
|
268
268
|
true
|
269
269
|
rescue Rdkafka::RdkafkaError => e
|
270
|
-
|
271
|
-
|
270
|
+
case e.code
|
271
|
+
when :assignment_lost
|
272
|
+
return false
|
273
|
+
when :no_offset
|
274
|
+
return true
|
275
|
+
when :coordinator_load_in_progress
|
276
|
+
sleep(1)
|
277
|
+
retry
|
278
|
+
end
|
272
279
|
|
273
280
|
raise e
|
274
281
|
end
|
@@ -329,25 +336,27 @@ module Karafka
|
|
329
336
|
#
|
330
337
|
# If we would retry here, the client reset would become transparent and we would not have
|
331
338
|
# a chance to take any actions
|
339
|
+
early_return = false
|
340
|
+
|
332
341
|
case e.code
|
333
342
|
when :max_poll_exceeded # -147
|
334
343
|
reset
|
335
|
-
|
344
|
+
early_return = true
|
336
345
|
when :transport # -195
|
337
346
|
reset
|
338
|
-
|
339
|
-
when :rebalance_in_progress # -27
|
340
|
-
reset
|
341
|
-
return nil
|
347
|
+
early_return = true
|
342
348
|
when :not_coordinator # 16
|
343
349
|
reset
|
344
|
-
|
350
|
+
early_return = true
|
345
351
|
when :network_exception # 13
|
346
|
-
|
347
|
-
|
352
|
+
early_return = true
|
353
|
+
when :rebalance_in_progress # -27
|
354
|
+
early_return = true
|
355
|
+
when :coordinator_load_in_progress # 14
|
356
|
+
early_return = true
|
348
357
|
when :unknown_topic_or_part
|
349
358
|
# This is expected and temporary until rdkafka catches up with metadata
|
350
|
-
|
359
|
+
early_return = true
|
351
360
|
end
|
352
361
|
|
353
362
|
raise if time_poll.attempts > MAX_POLL_RETRIES
|
@@ -356,8 +365,9 @@ module Karafka
|
|
356
365
|
time_poll.checkpoint
|
357
366
|
time_poll.backoff
|
358
367
|
|
359
|
-
# On unknown errors we do our best to retry and handle them before raising
|
360
|
-
|
368
|
+
# On unknown errors we do our best to retry and handle them before raising unless we
|
369
|
+
# decide to early return
|
370
|
+
early_return ? nil : retry
|
361
371
|
end
|
362
372
|
|
363
373
|
# Builds a new rdkafka consumer instance based on the subscription group configuration
|
@@ -32,19 +32,23 @@ module Karafka
|
|
32
32
|
def on_before_enqueue
|
33
33
|
return unless topic.long_running_job?
|
34
34
|
|
35
|
-
# This ensures
|
36
|
-
|
35
|
+
# This ensures that when running LRJ with VP, things operate as expected run only once
|
36
|
+
# for all the virtual partitions collectively
|
37
|
+
coordinator.on_enqueued do
|
37
38
|
# Pause at the first message in a batch. That way in case of a crash, we will not loose
|
38
|
-
# any messages
|
39
|
-
|
39
|
+
# any messages.
|
40
|
+
#
|
41
|
+
# For VP it applies the same way and since VP cannot be used with MOM we should not have
|
42
|
+
# any edge cases here.
|
43
|
+
pause(coordinator.seek_offset, MAX_PAUSE_TIME)
|
40
44
|
end
|
41
45
|
end
|
42
46
|
|
43
47
|
# Runs extra logic after consumption that is related to handling long-running jobs
|
44
48
|
# @note This overwrites the '#on_after_consume' from the base consumer
|
45
49
|
def on_after_consume
|
46
|
-
coordinator.on_finished do |
|
47
|
-
on_after_consume_regular(
|
50
|
+
coordinator.on_finished do |last_group_message|
|
51
|
+
on_after_consume_regular(last_group_message)
|
48
52
|
end
|
49
53
|
end
|
50
54
|
|
@@ -75,35 +79,27 @@ module Karafka
|
|
75
79
|
|
76
80
|
# Handles the post-consumption flow depending on topic settings
|
77
81
|
#
|
78
|
-
# @param
|
79
|
-
|
80
|
-
def on_after_consume_regular(first_message, last_message)
|
82
|
+
# @param last_group_message [Karafka::Messages::Message]
|
83
|
+
def on_after_consume_regular(last_group_message)
|
81
84
|
if coordinator.success?
|
82
85
|
coordinator.pause_tracker.reset
|
83
86
|
|
84
87
|
# We use the non-blocking one here. If someone needs the blocking one, can implement it
|
85
88
|
# with manual offset management
|
86
89
|
# Mark as consumed only if manual offset management is not on
|
87
|
-
mark_as_consumed(
|
90
|
+
mark_as_consumed(last_group_message) unless topic.manual_offset_management? || revoked?
|
88
91
|
|
89
92
|
# If this is not a long-running job there is nothing for us to do here
|
90
93
|
return unless topic.long_running_job?
|
91
94
|
|
92
|
-
|
93
|
-
# Here, in case manual offset management is off, we have the new proper offset of a
|
94
|
-
# first message from another batch from `@seek_offset`. If manual offset management
|
95
|
-
# is on, we move to place where the user indicated it was finished. This can create an
|
96
|
-
# interesting (yet valid) corner case, where with manual offset management on and no
|
97
|
-
# marking as consumed, we end up with an infinite loop processing same messages over and
|
98
|
-
# over again
|
99
|
-
seek(@seek_offset || first_message.offset)
|
95
|
+
seek(coordinator.seek_offset)
|
100
96
|
|
101
97
|
resume
|
102
98
|
else
|
103
99
|
# If processing failed, we need to pause
|
104
100
|
# For long running job this will overwrite the default never-ending pause and will cause
|
105
101
|
# the processing to keep going after the error backoff
|
106
|
-
pause(
|
102
|
+
pause(coordinator.seek_offset)
|
107
103
|
end
|
108
104
|
end
|
109
105
|
end
|
@@ -47,6 +47,22 @@ module Karafka
|
|
47
47
|
|
48
48
|
[[%i[virtual_partitions partitioner], :respond_to_call]]
|
49
49
|
end
|
50
|
+
|
51
|
+
# Make sure that manual offset management is not used together with Virtual Partitions
|
52
|
+
# This would not make any sense as there would be edge cases related to skipping
|
53
|
+
# messages even if there were errors.
|
54
|
+
virtual do |data, errors|
|
55
|
+
next unless errors.empty?
|
56
|
+
|
57
|
+
virtual_partitions = data[:virtual_partitions]
|
58
|
+
manual_offset_management = data[:manual_offset_management]
|
59
|
+
|
60
|
+
next unless virtual_partitions[:active]
|
61
|
+
next unless manual_offset_management
|
62
|
+
next if data[:tags].include?(:active_job)
|
63
|
+
|
64
|
+
[[%i[manual_offset_management], :not_with_virtual_partitions]]
|
65
|
+
end
|
50
66
|
end
|
51
67
|
end
|
52
68
|
end
|
@@ -34,7 +34,6 @@ module Karafka
|
|
34
34
|
@on_enqueued_invoked = false
|
35
35
|
@on_started_invoked = false
|
36
36
|
@on_finished_invoked = false
|
37
|
-
@first_message = messages.first
|
38
37
|
@last_message = messages.last
|
39
38
|
end
|
40
39
|
end
|
@@ -52,7 +51,7 @@ module Karafka
|
|
52
51
|
|
53
52
|
@on_enqueued_invoked = true
|
54
53
|
|
55
|
-
yield(@
|
54
|
+
yield(@last_message)
|
56
55
|
end
|
57
56
|
end
|
58
57
|
|
@@ -63,7 +62,7 @@ module Karafka
|
|
63
62
|
|
64
63
|
@on_started_invoked = true
|
65
64
|
|
66
|
-
yield(@
|
65
|
+
yield(@last_message)
|
67
66
|
end
|
68
67
|
end
|
69
68
|
|
@@ -77,7 +76,7 @@ module Karafka
|
|
77
76
|
|
78
77
|
@on_finished_invoked = true
|
79
78
|
|
80
|
-
yield(@
|
79
|
+
yield(@last_message)
|
81
80
|
end
|
82
81
|
end
|
83
82
|
end
|
@@ -13,6 +13,8 @@ module Karafka
|
|
13
13
|
# @return [Karafka::TimeTrackers::Pause]
|
14
14
|
attr_reader :pause_tracker
|
15
15
|
|
16
|
+
attr_reader :seek_offset
|
17
|
+
|
16
18
|
# @param pause_tracker [Karafka::TimeTrackers::Pause] pause tracker for given topic partition
|
17
19
|
def initialize(pause_tracker)
|
18
20
|
@pause_tracker = pause_tracker
|
@@ -23,17 +25,30 @@ module Karafka
|
|
23
25
|
end
|
24
26
|
|
25
27
|
# Starts the coordinator for given consumption jobs
|
26
|
-
# @param
|
28
|
+
# @param messages [Array<Karafka::Messages::Message>] batch of message for which we are
|
27
29
|
# going to coordinate work. Not used with regular coordinator.
|
28
|
-
def start(
|
30
|
+
def start(messages)
|
29
31
|
@mutex.synchronize do
|
30
32
|
@running_jobs = 0
|
31
33
|
# We need to clear the consumption results hash here, otherwise we could end up storing
|
32
34
|
# consumption results of consumer instances we no longer control
|
33
35
|
@consumptions.clear
|
36
|
+
|
37
|
+
# We set it on the first encounter and never again, because then the offset setting
|
38
|
+
# should be up to the consumers logic (our or the end user)
|
39
|
+
# Seek offset needs to be always initialized as for case where manual offset management
|
40
|
+
# is turned on, we need to have reference to the first offset even in case of running
|
41
|
+
# multiple batches without marking any messages as consumed. Rollback needs to happen to
|
42
|
+
# the last place we know of or the last message + 1 that was marked
|
43
|
+
@seek_offset ||= messages.first.offset
|
34
44
|
end
|
35
45
|
end
|
36
46
|
|
47
|
+
# @param offset [Integer] message offset
|
48
|
+
def seek_offset=(offset)
|
49
|
+
@mutex.synchronize { @seek_offset = offset }
|
50
|
+
end
|
51
|
+
|
37
52
|
# Increases number of jobs that we handle with this coordinator
|
38
53
|
def increment
|
39
54
|
@mutex.synchronize { @running_jobs += 1 }
|
@@ -68,9 +68,10 @@ module Karafka
|
|
68
68
|
|
69
69
|
# Handles the simple routing case where we create one consumer group and allow for further
|
70
70
|
# subscription group customization
|
71
|
-
# @param subscription_group_name [String, Symbol] subscription group id
|
71
|
+
# @param subscription_group_name [String, Symbol] subscription group id. When not provided,
|
72
|
+
# a random uuid will be used
|
72
73
|
# @param block [Proc] further topics definitions
|
73
|
-
def subscription_group(subscription_group_name, &block)
|
74
|
+
def subscription_group(subscription_group_name = SecureRandom.uuid, &block)
|
74
75
|
consumer_group('app') do
|
75
76
|
target.public_send(:subscription_group=, subscription_group_name, &block)
|
76
77
|
end
|
@@ -6,7 +6,7 @@ module Karafka
|
|
6
6
|
# It belongs to a consumer group as from 0.6 all the topics can work in the same consumer group
|
7
7
|
# It is a part of Karafka's DSL.
|
8
8
|
class Topic
|
9
|
-
attr_reader :id, :name, :consumer_group
|
9
|
+
attr_reader :id, :name, :consumer_group, :tags
|
10
10
|
attr_writer :consumer
|
11
11
|
attr_accessor :subscription_group
|
12
12
|
|
@@ -32,6 +32,7 @@ module Karafka
|
|
32
32
|
# Karafka 0.6 we can handle multiple Kafka instances with the same process and we can
|
33
33
|
# have same topic name across multiple consumer groups
|
34
34
|
@id = "#{consumer_group.id}_#{@name}"
|
35
|
+
@tags = []
|
35
36
|
end
|
36
37
|
|
37
38
|
INHERITABLE_ATTRIBUTES.each do |attribute|
|
@@ -93,7 +94,8 @@ module Karafka
|
|
93
94
|
name: name,
|
94
95
|
consumer: consumer,
|
95
96
|
consumer_group_id: consumer_group.id,
|
96
|
-
subscription_group: subscription_group
|
97
|
+
subscription_group: subscription_group,
|
98
|
+
tags: tags
|
97
99
|
).freeze
|
98
100
|
end
|
99
101
|
end
|
data/lib/karafka/version.rb
CHANGED
data/lib/karafka.rb
CHANGED
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.0.
|
4
|
+
version: 2.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Maciej Mensfeld
|
@@ -35,7 +35,7 @@ cert_chain:
|
|
35
35
|
Qf04B9ceLUaC4fPVEz10FyobjaFoY4i32xRto3XnrzeAgfEe4swLq8bQsR3w/EF3
|
36
36
|
MGU0FeSV2Yj7Xc2x/7BzLK8xQn5l7Yy75iPF+KP3vVmDHnNl
|
37
37
|
-----END CERTIFICATE-----
|
38
|
-
date: 2022-09-
|
38
|
+
date: 2022-09-22 00:00:00.000000000 Z
|
39
39
|
dependencies:
|
40
40
|
- !ruby/object:Gem::Dependency
|
41
41
|
name: karafka-core
|
metadata.gz.sig
CHANGED
Binary file
|