karafka 2.0.0.beta2 → 2.0.0.beta3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +20 -0
- data/Gemfile.lock +4 -4
- data/bin/integrations +36 -14
- data/bin/scenario +29 -0
- data/docker-compose.yml +2 -0
- data/karafka.gemspec +1 -1
- data/lib/karafka/active_job/routing/extensions.rb +11 -1
- data/lib/karafka/base_consumer.rb +41 -26
- data/lib/karafka/connection/client.rb +38 -15
- data/lib/karafka/connection/listener.rb +17 -13
- data/lib/karafka/contracts/config.rb +2 -1
- data/lib/karafka/instrumentation/logger_listener.rb +37 -10
- data/lib/karafka/instrumentation/monitor.rb +3 -0
- data/lib/karafka/licenser.rb +26 -7
- data/lib/karafka/pro/active_job/consumer.rb +36 -9
- data/lib/karafka/pro/active_job/dispatcher.rb +9 -9
- data/lib/karafka/pro/active_job/job_options_contract.rb +9 -9
- data/lib/karafka/pro/base_consumer_extensions.rb +66 -0
- data/lib/karafka/pro/loader.rb +29 -15
- data/lib/karafka/pro/performance_tracker.rb +9 -9
- data/lib/karafka/pro/processing/jobs/consume_non_blocking.rb +9 -10
- data/lib/karafka/pro/processing/jobs_builder.rb +31 -0
- data/lib/karafka/pro/routing/extensions.rb +32 -0
- data/lib/karafka/pro/scheduler.rb +9 -9
- data/lib/karafka/processing/executor.rb +8 -1
- data/lib/karafka/processing/jobs_builder.rb +28 -0
- data/lib/karafka/processing/worker.rb +17 -9
- data/lib/karafka/routing/subscription_group.rb +1 -1
- data/lib/karafka/setup/config.rb +3 -1
- data/lib/karafka/status.rb +1 -3
- data/lib/karafka/version.rb +1 -1
- data.tar.gz.sig +0 -0
- metadata +8 -2
- metadata.gz.sig +0 -0
data/lib/karafka/licenser.rb
CHANGED
@@ -33,6 +33,8 @@ module Karafka
|
|
33
33
|
|
34
34
|
return if license_config.expires_on > Date.today
|
35
35
|
|
36
|
+
raise_expired_license_token_in_dev(license_config.expires_on)
|
37
|
+
|
36
38
|
notify_if_license_expired(license_config.expires_on)
|
37
39
|
end
|
38
40
|
|
@@ -53,24 +55,41 @@ module Karafka
|
|
53
55
|
)
|
54
56
|
end
|
55
57
|
|
58
|
+
# Raises an error for test and dev environments if running pro with expired license
|
59
|
+
# We never want to cause any non-dev problems and we should never crash anything else than
|
60
|
+
# tests and development envs.
|
61
|
+
#
|
62
|
+
# @param expires_on [Date] when the license expires
|
63
|
+
def raise_expired_license_token_in_dev(expires_on)
|
64
|
+
env = Karafka::App.env
|
65
|
+
|
66
|
+
return unless env.development? || env.test?
|
67
|
+
|
68
|
+
raise Errors::ExpiredLicenseTokenError.new, expired_message(expires_on)
|
69
|
+
end
|
70
|
+
|
56
71
|
# We do not raise an error here as we don't want to cause any problems to someone that runs
|
57
72
|
# Karafka on production. Error message is enough.
|
58
73
|
#
|
59
74
|
# @param expires_on [Date] when the license expires
|
60
75
|
def notify_if_license_expired(expires_on)
|
61
|
-
|
62
|
-
Your license expired on #{expires_on}.
|
63
|
-
Please reach us at contact@karafka.io or visit https://karafka.io to obtain a valid one.
|
64
|
-
MSG
|
65
|
-
|
66
|
-
Karafka.logger.error(message)
|
76
|
+
Karafka.logger.error(expired_message(expires_on))
|
67
77
|
|
68
78
|
Karafka.monitor.instrument(
|
69
79
|
'error.occurred',
|
70
80
|
caller: self,
|
71
|
-
error: Errors::ExpiredLicenseTokenError.new(
|
81
|
+
error: Errors::ExpiredLicenseTokenError.new(expired_message(expires_on)),
|
72
82
|
type: 'licenser.expired'
|
73
83
|
)
|
74
84
|
end
|
85
|
+
|
86
|
+
# @param expires_on [Date] when the license expires
|
87
|
+
# @return [String] expired message
|
88
|
+
def expired_message(expires_on)
|
89
|
+
<<~MSG.tr("\n", ' ')
|
90
|
+
Your license expired on #{expires_on}.
|
91
|
+
Please reach us at contact@karafka.io or visit https://karafka.io to obtain a valid one.
|
92
|
+
MSG
|
93
|
+
end
|
75
94
|
end
|
76
95
|
end
|
@@ -1,20 +1,47 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# This Karafka component is a Pro component.
|
4
|
+
# All of the commercial components are present in the lib/karafka/pro directory of this
|
5
|
+
# repository and their usage requires commercial license agreement.
|
6
|
+
#
|
7
|
+
# Karafka has also commercial-friendly license, commercial support and commercial components.
|
8
|
+
#
|
9
|
+
# By sending a pull request to the pro components, you are agreeing to transfer the copyright of
|
10
|
+
# your code to Maciej Mensfeld.
|
11
|
+
|
3
12
|
module Karafka
|
4
13
|
module Pro
|
5
14
|
module ActiveJob
|
6
|
-
# This Karafka component is a Pro component.
|
7
|
-
# All of the commercial components are present in the lib/karafka/pro directory of this
|
8
|
-
# repository and their usage requires commercial license agreement.
|
9
|
-
#
|
10
|
-
# Karafka has also commercial-friendly license, commercial support and commercial components.
|
11
|
-
#
|
12
|
-
# By sending a pull request to the pro components, you are agreeing to transfer the copyright
|
13
|
-
# of your code to Maciej Mensfeld.
|
14
|
-
|
15
15
|
# Pro ActiveJob consumer that is suppose to handle long-running jobs as well as short
|
16
16
|
# running jobs
|
17
|
+
#
|
18
|
+
# When in LRJ, it will pause a given partition forever and will resume its processing only
|
19
|
+
# when all the jobs are done processing.
|
20
|
+
#
|
21
|
+
# It contains slightly better revocation warranties than the regular blocking consumer as
|
22
|
+
# it can stop processing batch of jobs in the middle after the revocation.
|
17
23
|
class Consumer < Karafka::ActiveJob::Consumer
|
24
|
+
# Runs ActiveJob jobs processing and handles lrj if needed
|
25
|
+
def consume
|
26
|
+
messages.each do |message|
|
27
|
+
# If for any reason we've lost this partition, not worth iterating over new messages
|
28
|
+
# as they are no longer ours
|
29
|
+
return if revoked?
|
30
|
+
break if Karafka::App.stopping?
|
31
|
+
|
32
|
+
::ActiveJob::Base.execute(
|
33
|
+
::ActiveSupport::JSON.decode(message.raw_payload)
|
34
|
+
)
|
35
|
+
|
36
|
+
# We check it twice as the job may be long running
|
37
|
+
return if revoked?
|
38
|
+
|
39
|
+
mark_as_consumed(message)
|
40
|
+
|
41
|
+
# Do not process more if we are shutting down
|
42
|
+
break if Karafka::App.stopping?
|
43
|
+
end
|
44
|
+
end
|
18
45
|
end
|
19
46
|
end
|
20
47
|
end
|
@@ -1,18 +1,18 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# This Karafka component is a Pro component.
|
4
|
+
# All of the commercial components are present in the lib/karafka/pro directory of this
|
5
|
+
# repository and their usage requires commercial license agreement.
|
6
|
+
#
|
7
|
+
# Karafka has also commercial-friendly license, commercial support and commercial components.
|
8
|
+
#
|
9
|
+
# By sending a pull request to the pro components, you are agreeing to transfer the copyright of
|
10
|
+
# your code to Maciej Mensfeld.
|
11
|
+
|
3
12
|
module Karafka
|
4
13
|
module Pro
|
5
14
|
# Karafka Pro ActiveJob components
|
6
15
|
module ActiveJob
|
7
|
-
# This Karafka component is a Pro component.
|
8
|
-
# All of the commercial components are present in the lib/karafka/pro directory of this
|
9
|
-
# repository and their usage requires commercial license agreement.
|
10
|
-
#
|
11
|
-
# Karafka has also commercial-friendly license, commercial support and commercial components.
|
12
|
-
#
|
13
|
-
# By sending a pull request to the pro components, you are agreeing to transfer the copyright
|
14
|
-
# of your code to Maciej Mensfeld.
|
15
|
-
|
16
16
|
# Pro dispatcher that sends the ActiveJob job to a proper topic based on the queue name
|
17
17
|
# and that allows to inject additional options into the producer, effectively allowing for a
|
18
18
|
# much better and more granular control over the dispatch and consumption process.
|
@@ -1,17 +1,17 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# This Karafka component is a Pro component.
|
4
|
+
# All of the commercial components are present in the lib/karafka/pro directory of this
|
5
|
+
# repository and their usage requires commercial license agreement.
|
6
|
+
#
|
7
|
+
# Karafka has also commercial-friendly license, commercial support and commercial components.
|
8
|
+
#
|
9
|
+
# By sending a pull request to the pro components, you are agreeing to transfer the copyright of
|
10
|
+
# your code to Maciej Mensfeld.
|
11
|
+
|
3
12
|
module Karafka
|
4
13
|
module Pro
|
5
14
|
module ActiveJob
|
6
|
-
# This Karafka component is a Pro component.
|
7
|
-
# All of the commercial components are present in the lib/karafka/pro directory of this
|
8
|
-
# repository and their usage requires commercial license agreement.
|
9
|
-
#
|
10
|
-
# Karafka has also commercial-friendly license, commercial support and commercial components.
|
11
|
-
#
|
12
|
-
# By sending a pull request to the pro components, you are agreeing to transfer the copyright
|
13
|
-
# of your code to Maciej Mensfeld.
|
14
|
-
|
15
15
|
# Contract for validating the options that can be altered with `#karafka_options` per job
|
16
16
|
# class that works with Pro features.
|
17
17
|
class JobOptionsContract < ::Karafka::ActiveJob::JobOptionsContract
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# This Karafka component is a Pro component.
|
4
|
+
# All of the commercial components are present in the lib/karafka/pro directory of this
|
5
|
+
# repository and their usage requires commercial license agreement.
|
6
|
+
#
|
7
|
+
# Karafka has also commercial-friendly license, commercial support and commercial components.
|
8
|
+
#
|
9
|
+
# By sending a pull request to the pro components, you are agreeing to transfer the copyright of
|
10
|
+
# your code to Maciej Mensfeld.
|
11
|
+
|
12
|
+
module Karafka
|
13
|
+
module Pro
|
14
|
+
# Extensions to the base consumer that make it more pro and fancy
|
15
|
+
#
|
16
|
+
# @note In case of using lrj, manual pausing may not be the best idea as resume needs to happen
|
17
|
+
# after each batch is processed.
|
18
|
+
#
|
19
|
+
# They need to be added to the consumer via `#prepend`
|
20
|
+
module BaseConsumerExtensions
|
21
|
+
# Pause for tops 31 years
|
22
|
+
MAX_PAUSE_TIME = 1_000_000_000_000
|
23
|
+
|
24
|
+
private_constant :MAX_PAUSE_TIME
|
25
|
+
|
26
|
+
# Pauses processing of a given partition until we're done with the processing
|
27
|
+
# This ensures, that we can easily poll not reaching the `max.poll.interval`
|
28
|
+
def on_prepare
|
29
|
+
# Pause at the first message in a batch. That way in case of a crash, we will not loose
|
30
|
+
# any messages
|
31
|
+
pause(messages.first.offset, MAX_PAUSE_TIME) if topic.long_running_job?
|
32
|
+
|
33
|
+
super
|
34
|
+
end
|
35
|
+
|
36
|
+
# After user code, we seek and un-pause our partition
|
37
|
+
def on_consume
|
38
|
+
# If anything went wrong here, we should not run any partition management as it's Karafka
|
39
|
+
# core that will handle the backoff
|
40
|
+
return unless super
|
41
|
+
|
42
|
+
return unless topic.long_running_job?
|
43
|
+
|
44
|
+
# Nothing to resume if it was revoked
|
45
|
+
return if revoked?
|
46
|
+
|
47
|
+
# Once processing is done, we move to the new offset based on commits
|
48
|
+
seek(@seek_offset || messages.first.offset)
|
49
|
+
resume
|
50
|
+
end
|
51
|
+
|
52
|
+
# Marks this consumer revoked state as true
|
53
|
+
# This allows us for things like lrj to finish early as this state may change during lrj
|
54
|
+
# execution
|
55
|
+
def on_revoked
|
56
|
+
@revoked = true
|
57
|
+
super
|
58
|
+
end
|
59
|
+
|
60
|
+
# @return [Boolean] true if partition was revoked from the current consumer
|
61
|
+
def revoked?
|
62
|
+
@revoked || false
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/lib/karafka/pro/loader.rb
CHANGED
@@ -1,35 +1,49 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# This Karafka component is a Pro component.
|
4
|
+
# All of the commercial components are present in the lib/karafka/pro directory of this
|
5
|
+
# repository and their usage requires commercial license agreement.
|
6
|
+
#
|
7
|
+
# Karafka has also commercial-friendly license, commercial support and commercial components.
|
8
|
+
#
|
9
|
+
# By sending a pull request to the pro components, you are agreeing to transfer the copyright of
|
10
|
+
# your code to Maciej Mensfeld.
|
11
|
+
|
3
12
|
module Karafka
|
4
13
|
module Pro
|
5
|
-
# This Karafka component is a Pro component.
|
6
|
-
# All of the commercial components are present in the lib/karafka/pro directory of this
|
7
|
-
# repository and their usage requires commercial license agreement.
|
8
|
-
#
|
9
|
-
# Karafka has also commercial-friendly license, commercial support and commercial components.
|
10
|
-
#
|
11
|
-
# By sending a pull request to the pro components, you are agreeing to transfer the copyright
|
12
|
-
# of your code to Maciej Mensfeld.
|
13
|
-
|
14
14
|
# Loader requires and loads all the pro components only when they are needed
|
15
15
|
class Loader
|
16
|
+
# All the pro components that need to be loaded
|
17
|
+
COMPONENTS = %w[
|
18
|
+
performance_tracker
|
19
|
+
scheduler
|
20
|
+
base_consumer_extensions
|
21
|
+
processing/jobs/consume_non_blocking
|
22
|
+
processing/jobs_builder
|
23
|
+
routing/extensions
|
24
|
+
active_job/consumer
|
25
|
+
active_job/dispatcher
|
26
|
+
active_job/job_options_contract
|
27
|
+
].freeze
|
28
|
+
|
29
|
+
private_constant :COMPONENTS
|
30
|
+
|
16
31
|
class << self
|
17
32
|
# Loads all the pro components and configures them wherever it is expected
|
18
33
|
# @param config [Dry::Configurable::Config] whole app config that we can alter with pro
|
19
34
|
# components
|
20
35
|
def setup(config)
|
21
|
-
require_relative
|
22
|
-
require_relative 'scheduler'
|
23
|
-
require_relative 'processing/jobs/consume_non_blocking'
|
24
|
-
require_relative 'active_job/consumer'
|
25
|
-
require_relative 'active_job/dispatcher'
|
26
|
-
require_relative 'active_job/job_options_contract'
|
36
|
+
COMPONENTS.each { |component| require_relative(component) }
|
27
37
|
|
28
38
|
config.internal.scheduler = Scheduler.new
|
39
|
+
config.internal.jobs_builder = Processing::JobsBuilder.new
|
29
40
|
config.internal.active_job.consumer = ActiveJob::Consumer
|
30
41
|
config.internal.active_job.dispatcher = ActiveJob::Dispatcher.new
|
31
42
|
config.internal.active_job.job_options_contract = ActiveJob::JobOptionsContract.new
|
32
43
|
|
44
|
+
::Karafka::Routing::Topic.include(Routing::Extensions)
|
45
|
+
::Karafka::BaseConsumer.prepend(BaseConsumerExtensions)
|
46
|
+
|
33
47
|
config.monitor.subscribe(PerformanceTracker.instance)
|
34
48
|
end
|
35
49
|
end
|
@@ -1,16 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# This Karafka component is a Pro component.
|
4
|
+
# All of the commercial components are present in the lib/karafka/pro directory of this
|
5
|
+
# repository and their usage requires commercial license agreement.
|
6
|
+
#
|
7
|
+
# Karafka has also commercial-friendly license, commercial support and commercial components.
|
8
|
+
#
|
9
|
+
# By sending a pull request to the pro components, you are agreeing to transfer the copyright of
|
10
|
+
# your code to Maciej Mensfeld.
|
11
|
+
|
3
12
|
module Karafka
|
4
13
|
module Pro
|
5
|
-
# This Karafka component is a Pro component.
|
6
|
-
# All of the commercial components are present in the lib/karafka/pro directory of this
|
7
|
-
# repository and their usage requires commercial license agreement.
|
8
|
-
#
|
9
|
-
# Karafka has also commercial-friendly license, commercial support and commercial components.
|
10
|
-
#
|
11
|
-
# By sending a pull request to the pro components, you are agreeing to transfer the copyright
|
12
|
-
# of your code to Maciej Mensfeld.
|
13
|
-
|
14
14
|
# Tracker used to keep track of performance metrics
|
15
15
|
# It provides insights that can be used to optimize processing flow
|
16
16
|
class PerformanceTracker
|
@@ -1,21 +1,20 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# This Karafka component is a Pro component.
|
4
|
+
# All of the commercial components are present in the lib/karafka/pro directory of this
|
5
|
+
# repository and their usage requires commercial license agreement.
|
6
|
+
#
|
7
|
+
# Karafka has also commercial-friendly license, commercial support and commercial components.
|
8
|
+
#
|
9
|
+
# By sending a pull request to the pro components, you are agreeing to transfer the copyright of
|
10
|
+
# your code to Maciej Mensfeld.
|
11
|
+
|
3
12
|
module Karafka
|
4
13
|
module Pro
|
5
14
|
# Pro components related to processing part of Karafka
|
6
15
|
module Processing
|
7
16
|
# Pro jobs
|
8
17
|
module Jobs
|
9
|
-
# This Karafka component is a Pro component.
|
10
|
-
# All of the commercial components are present in the lib/karafka/pro directory of this
|
11
|
-
# repository and their usage requires commercial license agreement.
|
12
|
-
#
|
13
|
-
# Karafka has also commercial-friendly license, commercial support and commercial
|
14
|
-
# components.
|
15
|
-
#
|
16
|
-
# By sending a pull request to the pro components, you are agreeing to transfer the
|
17
|
-
# copyright of your code to Maciej Mensfeld.
|
18
|
-
|
19
18
|
# The main job type in a non-blocking variant.
|
20
19
|
# This variant works "like" the regular consumption but pauses the partition for as long
|
21
20
|
# as it is needed until a job is done.
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# This Karafka component is a Pro component.
|
4
|
+
# All of the commercial components are present in the lib/karafka/pro directory of this
|
5
|
+
# repository and their usage requires commercial license agreement.
|
6
|
+
#
|
7
|
+
# Karafka has also commercial-friendly license, commercial support and commercial components.
|
8
|
+
#
|
9
|
+
# By sending a pull request to the pro components, you are agreeing to transfer the copyright of
|
10
|
+
# your code to Maciej Mensfeld.
|
11
|
+
|
12
|
+
module Karafka
|
13
|
+
module Pro
|
14
|
+
module Processing
|
15
|
+
# Pro jobs builder that supports lrj
|
16
|
+
class JobsBuilder < ::Karafka::Processing::JobsBuilder
|
17
|
+
# @param executor [Karafka::Processing::Executor]
|
18
|
+
# @param messages [Karafka::Messages::Messages] messages batch to be consumed
|
19
|
+
# @return [Karafka::Processing::Jobs::Consume] blocking job
|
20
|
+
# @return [Karafka::Pro::Processing::Jobs::ConsumeNonBlocking] non blocking for lrj
|
21
|
+
def consume(executor, messages)
|
22
|
+
if executor.topic.long_running_job?
|
23
|
+
Jobs::ConsumeNonBlocking.new(executor, messages)
|
24
|
+
else
|
25
|
+
super
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# This Karafka component is a Pro component.
|
4
|
+
# All of the commercial components are present in the lib/karafka/pro directory of this
|
5
|
+
# repository and their usage requires commercial license agreement.
|
6
|
+
#
|
7
|
+
# Karafka has also commercial-friendly license, commercial support and commercial components.
|
8
|
+
#
|
9
|
+
# By sending a pull request to the pro components, you are agreeing to transfer the copyright of
|
10
|
+
# your code to Maciej Mensfeld.
|
11
|
+
|
12
|
+
module Karafka
|
13
|
+
module Pro
|
14
|
+
# Pro routing components
|
15
|
+
module Routing
|
16
|
+
# Routing extensions that allow to configure some extra PRO routing options
|
17
|
+
module Extensions
|
18
|
+
class << self
|
19
|
+
# @param base [Class] class we extend
|
20
|
+
def included(base)
|
21
|
+
base.attr_accessor :long_running_job
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# @return [Boolean] is a given job on a topic a long running one
|
26
|
+
def long_running_job?
|
27
|
+
@long_running_job || false
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -1,16 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# This Karafka component is a Pro component.
|
4
|
+
# All of the commercial components are present in the lib/karafka/pro directory of this
|
5
|
+
# repository and their usage requires commercial license agreement.
|
6
|
+
#
|
7
|
+
# Karafka has also commercial-friendly license, commercial support and commercial components.
|
8
|
+
#
|
9
|
+
# By sending a pull request to the pro components, you are agreeing to transfer the copyright of
|
10
|
+
# your code to Maciej Mensfeld.
|
11
|
+
|
3
12
|
module Karafka
|
4
13
|
module Pro
|
5
|
-
# This Karafka component is a Pro component.
|
6
|
-
# All of the commercial components are present in the lib/karafka/pro directory of this
|
7
|
-
# repository and their usage requires commercial license agreement.
|
8
|
-
#
|
9
|
-
# Karafka has also commercial-friendly license, commercial support and commercial components.
|
10
|
-
#
|
11
|
-
# By sending a pull request to the pro components, you are agreeing to transfer the copyright
|
12
|
-
# of your code to Maciej Mensfeld.
|
13
|
-
|
14
14
|
# Optimizes scheduler that takes into consideration of execution time needed to process
|
15
15
|
# messages from given topics partitions. It uses the non-preemptive LJF algorithm
|
16
16
|
#
|
@@ -18,8 +18,15 @@ module Karafka
|
|
18
18
|
# @return [String] subscription group id to which a given executor belongs
|
19
19
|
attr_reader :group_id
|
20
20
|
|
21
|
+
# @return [Karafka::Messages::Messages] messages batch
|
21
22
|
attr_reader :messages
|
22
23
|
|
24
|
+
# Topic accessibility may be needed for the jobs builder to be able to build a proper job
|
25
|
+
# based on the topic settings defined by the end user
|
26
|
+
#
|
27
|
+
# @return [Karafka::Routing::Topic] topic of this executor
|
28
|
+
attr_reader :topic
|
29
|
+
|
23
30
|
# @param group_id [String] id of the subscription group to which the executor belongs
|
24
31
|
# @param client [Karafka::Connection::Client] kafka client
|
25
32
|
# @param topic [Karafka::Routing::Topic] topic for which this executor will run
|
@@ -52,7 +59,7 @@ module Karafka
|
|
52
59
|
received_at
|
53
60
|
)
|
54
61
|
|
55
|
-
consumer.
|
62
|
+
consumer.on_prepare
|
56
63
|
end
|
57
64
|
|
58
65
|
# Runs consumer data processing against given batch and handles failures and errors.
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Karafka
|
4
|
+
module Processing
|
5
|
+
# Class responsible for deciding what type of job should we build to run a given command and
|
6
|
+
# for building a proper job for it.
|
7
|
+
class JobsBuilder
|
8
|
+
# @param executor [Karafka::Processing::Executor]
|
9
|
+
# @param messages [Karafka::Messages::Messages] messages batch to be consumed
|
10
|
+
# @return [Karafka::Processing::Jobs::Consume] consumption job
|
11
|
+
def consume(executor, messages)
|
12
|
+
Jobs::Consume.new(executor, messages)
|
13
|
+
end
|
14
|
+
|
15
|
+
# @param executor [Karafka::Processing::Executor]
|
16
|
+
# @return [Karafka::Processing::Jobs::Revoked] revocation job
|
17
|
+
def revoked(executor)
|
18
|
+
Jobs::Revoked.new(executor)
|
19
|
+
end
|
20
|
+
|
21
|
+
# @param executor [Karafka::Processing::Executor]
|
22
|
+
# @return [Karafka::Processing::Jobs::Shutdown] shutdown job
|
23
|
+
def shutdown(executor)
|
24
|
+
Jobs::Shutdown.new(executor)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -19,9 +19,13 @@ module Karafka
|
|
19
19
|
class Worker
|
20
20
|
include Helpers::Async
|
21
21
|
|
22
|
+
# @return [String] id of this worker
|
23
|
+
attr_reader :id
|
24
|
+
|
22
25
|
# @param jobs_queue [JobsQueue]
|
23
26
|
# @return [Worker]
|
24
27
|
def initialize(jobs_queue)
|
28
|
+
@id = SecureRandom.uuid
|
25
29
|
@jobs_queue = jobs_queue
|
26
30
|
end
|
27
31
|
|
@@ -43,19 +47,23 @@ module Karafka
|
|
43
47
|
job = @jobs_queue.pop
|
44
48
|
|
45
49
|
if job
|
46
|
-
job
|
50
|
+
Karafka.monitor.instrument('worker.process', caller: self, job: job)
|
51
|
+
|
52
|
+
Karafka.monitor.instrument('worker.processed', caller: self, job: job) do
|
53
|
+
job.prepare
|
47
54
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
55
|
+
# If a job is marked as non blocking, we can run a tick in the job queue and if there
|
56
|
+
# are no other blocking factors, the job queue will be unlocked.
|
57
|
+
# If this does not run, all the things will be blocking and job queue won't allow to
|
58
|
+
# pass it until done.
|
59
|
+
@jobs_queue.tick(job.group_id) if job.non_blocking?
|
53
60
|
|
54
|
-
|
61
|
+
job.call
|
55
62
|
|
56
|
-
|
63
|
+
job.teardown
|
57
64
|
|
58
|
-
|
65
|
+
true
|
66
|
+
end
|
59
67
|
else
|
60
68
|
false
|
61
69
|
end
|
@@ -44,7 +44,7 @@ module Karafka
|
|
44
44
|
kafka[:'auto.offset.reset'] ||= @topics.first.initial_offset
|
45
45
|
# Karafka manages the offsets based on the processing state, thus we do not rely on the
|
46
46
|
# rdkafka offset auto-storing
|
47
|
-
kafka[:'enable.auto.offset.store'] =
|
47
|
+
kafka[:'enable.auto.offset.store'] = false
|
48
48
|
kafka.freeze
|
49
49
|
kafka
|
50
50
|
end
|
data/lib/karafka/setup/config.rb
CHANGED
@@ -83,7 +83,7 @@ module Karafka
|
|
83
83
|
# @see https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md
|
84
84
|
setting :kafka, default: {}
|
85
85
|
|
86
|
-
# Namespace for internal settings that should not be modified
|
86
|
+
# Namespace for internal settings that should not be modified directly
|
87
87
|
setting :internal do
|
88
88
|
# option routing_builder [Karafka::Routing::Builder] builder instance
|
89
89
|
setting :routing_builder, default: Routing::Builder.new
|
@@ -98,6 +98,8 @@ module Karafka
|
|
98
98
|
setting :subscription_groups_builder, default: Routing::SubscriptionGroupsBuilder.new
|
99
99
|
# option scheduler [Class] scheduler we will be using
|
100
100
|
setting :scheduler, default: Scheduler.new
|
101
|
+
# option jobs_builder [Class] jobs builder we want to use
|
102
|
+
setting :jobs_builder, default: Processing::JobsBuilder.new
|
101
103
|
|
102
104
|
# Karafka components for ActiveJob
|
103
105
|
setting :active_job do
|
data/lib/karafka/status.rb
CHANGED
@@ -31,9 +31,7 @@ module Karafka
|
|
31
31
|
# We skip as during this state we do not have yet a monitor
|
32
32
|
return if initializing?
|
33
33
|
|
34
|
-
|
35
|
-
# so the state changes are executed from a separate thread
|
36
|
-
Thread.new { Karafka.monitor.instrument("app.#{state}") }.join
|
34
|
+
Karafka.monitor.instrument("app.#{state}")
|
37
35
|
end
|
38
36
|
end
|
39
37
|
end
|
data/lib/karafka/version.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.0.
|
4
|
+
version: 2.0.0.beta3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Maciej Mensfeld
|
@@ -34,7 +34,7 @@ cert_chain:
|
|
34
34
|
R2P11bWoCtr70BsccVrN8jEhzwXngMyI2gVt750Y+dbTu1KgRqZKp/ECe7ZzPzXj
|
35
35
|
pIy9vHxTANKYVyI4qj8OrFdEM5BQNu8oQpL0iQ==
|
36
36
|
-----END CERTIFICATE-----
|
37
|
-
date: 2022-06-
|
37
|
+
date: 2022-06-14 00:00:00.000000000 Z
|
38
38
|
dependencies:
|
39
39
|
- !ruby/object:Gem::Dependency
|
40
40
|
name: dry-configurable
|
@@ -171,6 +171,7 @@ files:
|
|
171
171
|
- bin/create_token
|
172
172
|
- bin/integrations
|
173
173
|
- bin/karafka
|
174
|
+
- bin/scenario
|
174
175
|
- bin/stress
|
175
176
|
- certs/karafka-pro.pem
|
176
177
|
- certs/mensfeld.pem
|
@@ -231,9 +232,12 @@ files:
|
|
231
232
|
- lib/karafka/pro/active_job/consumer.rb
|
232
233
|
- lib/karafka/pro/active_job/dispatcher.rb
|
233
234
|
- lib/karafka/pro/active_job/job_options_contract.rb
|
235
|
+
- lib/karafka/pro/base_consumer_extensions.rb
|
234
236
|
- lib/karafka/pro/loader.rb
|
235
237
|
- lib/karafka/pro/performance_tracker.rb
|
236
238
|
- lib/karafka/pro/processing/jobs/consume_non_blocking.rb
|
239
|
+
- lib/karafka/pro/processing/jobs_builder.rb
|
240
|
+
- lib/karafka/pro/routing/extensions.rb
|
237
241
|
- lib/karafka/pro/scheduler.rb
|
238
242
|
- lib/karafka/process.rb
|
239
243
|
- lib/karafka/processing/executor.rb
|
@@ -242,6 +246,7 @@ files:
|
|
242
246
|
- lib/karafka/processing/jobs/consume.rb
|
243
247
|
- lib/karafka/processing/jobs/revoked.rb
|
244
248
|
- lib/karafka/processing/jobs/shutdown.rb
|
249
|
+
- lib/karafka/processing/jobs_builder.rb
|
245
250
|
- lib/karafka/processing/jobs_queue.rb
|
246
251
|
- lib/karafka/processing/worker.rb
|
247
252
|
- lib/karafka/processing/workers_batch.rb
|
@@ -273,6 +278,7 @@ files:
|
|
273
278
|
homepage: https://karafka.io
|
274
279
|
licenses:
|
275
280
|
- LGPL-3.0
|
281
|
+
- Commercial
|
276
282
|
metadata:
|
277
283
|
source_code_uri: https://github.com/karafka/karafka
|
278
284
|
rubygems_mfa_required: 'true'
|
metadata.gz.sig
CHANGED
Binary file
|