karafka 2.0.0 → 2.1.0
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/.github/FUNDING.yml +1 -0
- data/.github/workflows/ci.yml +40 -16
- data/.rspec +4 -0
- data/.ruby-version +1 -1
- data/CHANGELOG.md +459 -796
- data/Gemfile +3 -2
- data/Gemfile.lock +44 -32
- data/LICENSE +1 -1
- data/README.md +22 -17
- data/bin/integrations +86 -26
- data/bin/karafka +1 -13
- data/bin/rspecs +6 -0
- data/bin/verify_license_integrity +37 -0
- data/certs/cert_chain.pem +26 -0
- data/config/{errors.yml → locales/errors.yml} +34 -6
- data/config/locales/pro_errors.yml +34 -0
- data/docker-compose.yml +4 -30
- data/karafka.gemspec +17 -10
- data/lib/active_job/karafka.rb +3 -7
- data/lib/active_job/queue_adapters/karafka_adapter.rb +7 -1
- data/lib/karafka/active_job/consumer.rb +29 -6
- data/lib/karafka/active_job/current_attributes/loading.rb +36 -0
- data/lib/karafka/active_job/current_attributes/persistence.rb +28 -0
- data/lib/karafka/active_job/current_attributes.rb +42 -0
- data/lib/karafka/active_job/dispatcher.rb +34 -3
- data/lib/karafka/active_job/job_options_contract.rb +13 -2
- data/lib/karafka/admin.rb +246 -0
- data/lib/karafka/app.rb +30 -7
- data/lib/karafka/base_consumer.rb +124 -82
- data/lib/karafka/cli/base.rb +20 -0
- data/lib/karafka/cli/console.rb +13 -8
- data/lib/karafka/cli/info.rb +3 -2
- data/lib/karafka/cli/server.rb +55 -8
- data/lib/karafka/cli/topics.rb +146 -0
- data/lib/karafka/connection/client.rb +118 -61
- data/lib/karafka/connection/consumer_group_coordinator.rb +48 -0
- data/lib/karafka/connection/listener.rb +78 -30
- data/lib/karafka/connection/listeners_batch.rb +18 -2
- data/lib/karafka/connection/rebalance_manager.rb +3 -0
- data/lib/karafka/contracts/config.rb +1 -1
- data/lib/karafka/contracts/consumer_group.rb +22 -9
- data/lib/karafka/contracts/server_cli_options.rb +71 -11
- data/lib/karafka/contracts/topic.rb +65 -0
- data/lib/karafka/contracts.rb +1 -1
- data/lib/karafka/embedded.rb +36 -0
- data/lib/karafka/errors.rb +6 -4
- data/lib/karafka/helpers/colorize.rb +6 -0
- data/lib/karafka/instrumentation/callbacks/error.rb +3 -4
- data/lib/karafka/instrumentation/callbacks/statistics.rb +14 -4
- data/lib/karafka/instrumentation/logger_listener.rb +151 -22
- data/lib/karafka/instrumentation/notifications.rb +26 -7
- data/lib/karafka/instrumentation/proctitle_listener.rb +7 -16
- data/lib/karafka/instrumentation/vendors/datadog/dashboard.json +1 -1
- data/lib/karafka/instrumentation/vendors/datadog/logger_listener.rb +153 -0
- data/lib/karafka/instrumentation/vendors/datadog/{listener.rb → metrics_listener.rb} +62 -35
- data/lib/karafka/instrumentation/vendors/kubernetes/liveness_listener.rb +166 -0
- data/lib/karafka/licenser.rb +53 -50
- data/lib/karafka/messages/builders/batch_metadata.rb +8 -8
- data/lib/karafka/messages/builders/messages.rb +6 -2
- data/lib/karafka/messages/message.rb +14 -2
- data/lib/karafka/messages/messages.rb +5 -0
- data/lib/karafka/messages/parser.rb +14 -0
- data/lib/karafka/patches/rdkafka/bindings.rb +132 -0
- data/lib/karafka/pro/active_job/consumer.rb +10 -9
- data/lib/karafka/pro/active_job/dispatcher.rb +28 -3
- data/lib/karafka/pro/active_job/job_options_contract.rb +16 -3
- data/lib/karafka/pro/encryption/cipher.rb +58 -0
- data/lib/karafka/pro/encryption/contracts/config.rb +79 -0
- data/lib/karafka/pro/encryption/errors.rb +24 -0
- data/lib/karafka/pro/encryption/messages/middleware.rb +46 -0
- data/lib/karafka/pro/encryption/messages/parser.rb +56 -0
- data/lib/karafka/pro/encryption/setup/config.rb +48 -0
- data/lib/karafka/pro/encryption.rb +47 -0
- data/lib/karafka/pro/iterator.rb +253 -0
- data/lib/karafka/pro/loader.rb +52 -26
- data/lib/karafka/pro/performance_tracker.rb +10 -6
- data/lib/karafka/pro/processing/collapser.rb +62 -0
- data/lib/karafka/pro/processing/coordinator.rb +92 -16
- data/lib/karafka/pro/processing/filters/base.rb +61 -0
- data/lib/karafka/pro/processing/filters/delayer.rb +70 -0
- data/lib/karafka/pro/processing/filters/expirer.rb +51 -0
- data/lib/karafka/pro/processing/filters/throttler.rb +84 -0
- data/lib/karafka/pro/processing/filters/virtual_limiter.rb +52 -0
- data/lib/karafka/pro/processing/filters_applier.rb +104 -0
- data/lib/karafka/pro/processing/jobs/consume_non_blocking.rb +7 -5
- data/lib/karafka/pro/processing/jobs/revoked_non_blocking.rb +37 -0
- data/lib/karafka/pro/processing/jobs_builder.rb +22 -4
- data/lib/karafka/pro/processing/partitioner.rb +33 -24
- data/lib/karafka/pro/processing/scheduler.rb +27 -8
- data/lib/karafka/pro/processing/strategies/aj/dlq_ftr_lrj_mom.rb +68 -0
- data/lib/karafka/pro/processing/strategies/aj/dlq_ftr_lrj_mom_vp.rb +74 -0
- data/lib/karafka/pro/processing/strategies/aj/dlq_ftr_mom.rb +72 -0
- data/lib/karafka/pro/processing/strategies/aj/dlq_ftr_mom_vp.rb +76 -0
- data/lib/karafka/pro/processing/strategies/aj/dlq_lrj_mom.rb +64 -0
- data/lib/karafka/pro/processing/strategies/aj/dlq_lrj_mom_vp.rb +68 -0
- data/lib/karafka/pro/processing/strategies/aj/dlq_mom.rb +64 -0
- data/lib/karafka/pro/processing/strategies/aj/dlq_mom_vp.rb +69 -0
- data/lib/karafka/pro/processing/strategies/aj/ftr_lrj_mom.rb +38 -0
- data/lib/karafka/pro/processing/strategies/aj/ftr_lrj_mom_vp.rb +64 -0
- data/lib/karafka/pro/processing/strategies/aj/ftr_mom.rb +38 -0
- data/lib/karafka/pro/processing/strategies/aj/ftr_mom_vp.rb +58 -0
- data/lib/karafka/pro/processing/strategies/aj/lrj_mom.rb +37 -0
- data/lib/karafka/pro/processing/strategies/aj/lrj_mom_vp.rb +79 -0
- data/lib/karafka/pro/processing/strategies/aj/mom.rb +36 -0
- data/lib/karafka/pro/processing/strategies/aj/mom_vp.rb +52 -0
- data/lib/karafka/pro/processing/strategies/base.rb +26 -0
- data/lib/karafka/pro/processing/strategies/default.rb +105 -0
- data/lib/karafka/pro/processing/strategies/dlq/default.rb +131 -0
- data/lib/karafka/pro/processing/strategies/dlq/ftr.rb +61 -0
- data/lib/karafka/pro/processing/strategies/dlq/ftr_lrj.rb +75 -0
- data/lib/karafka/pro/processing/strategies/dlq/ftr_lrj_mom.rb +71 -0
- data/lib/karafka/pro/processing/strategies/dlq/ftr_lrj_mom_vp.rb +43 -0
- data/lib/karafka/pro/processing/strategies/dlq/ftr_lrj_vp.rb +41 -0
- data/lib/karafka/pro/processing/strategies/dlq/ftr_mom.rb +69 -0
- data/lib/karafka/pro/processing/strategies/dlq/ftr_mom_vp.rb +41 -0
- data/lib/karafka/pro/processing/strategies/dlq/ftr_vp.rb +40 -0
- data/lib/karafka/pro/processing/strategies/dlq/lrj.rb +63 -0
- data/lib/karafka/pro/processing/strategies/dlq/lrj_mom.rb +63 -0
- data/lib/karafka/pro/processing/strategies/dlq/lrj_mom_vp.rb +36 -0
- data/lib/karafka/pro/processing/strategies/dlq/lrj_vp.rb +39 -0
- data/lib/karafka/pro/processing/strategies/dlq/mom.rb +68 -0
- data/lib/karafka/pro/processing/strategies/dlq/mom_vp.rb +37 -0
- data/lib/karafka/pro/processing/strategies/dlq/vp.rb +40 -0
- data/lib/karafka/pro/processing/strategies/ftr/default.rb +104 -0
- data/lib/karafka/pro/processing/strategies/ftr/vp.rb +40 -0
- data/lib/karafka/pro/processing/strategies/lrj/default.rb +87 -0
- data/lib/karafka/pro/processing/strategies/lrj/ftr.rb +69 -0
- data/lib/karafka/pro/processing/strategies/lrj/ftr_mom.rb +67 -0
- data/lib/karafka/pro/processing/strategies/lrj/ftr_mom_vp.rb +40 -0
- data/lib/karafka/pro/processing/strategies/lrj/ftr_vp.rb +39 -0
- data/lib/karafka/pro/processing/strategies/lrj/mom.rb +80 -0
- data/lib/karafka/pro/processing/strategies/lrj/mom_vp.rb +38 -0
- data/lib/karafka/pro/processing/strategies/lrj/vp.rb +36 -0
- data/lib/karafka/pro/processing/strategies/mom/default.rb +46 -0
- data/lib/karafka/pro/processing/strategies/mom/ftr.rb +53 -0
- data/lib/karafka/pro/processing/strategies/mom/ftr_vp.rb +37 -0
- data/lib/karafka/pro/processing/strategies/mom/vp.rb +35 -0
- data/lib/karafka/pro/processing/strategies/vp/default.rb +104 -0
- data/lib/karafka/pro/{contracts/base.rb → processing/strategies.rb} +6 -5
- data/lib/karafka/pro/processing/strategy_selector.rb +84 -0
- data/lib/karafka/pro/processing/virtual_offset_manager.rb +147 -0
- data/lib/karafka/pro/routing/features/base.rb +24 -0
- data/lib/karafka/pro/routing/features/dead_letter_queue/contract.rb +50 -0
- data/lib/karafka/pro/routing/features/dead_letter_queue.rb +27 -0
- data/lib/karafka/pro/routing/{builder_extensions.rb → features/delaying/config.rb} +8 -11
- data/lib/karafka/pro/routing/features/delaying/contract.rb +38 -0
- data/lib/karafka/pro/routing/features/delaying/topic.rb +59 -0
- data/lib/karafka/pro/routing/features/delaying.rb +29 -0
- data/lib/karafka/pro/routing/features/expiring/config.rb +27 -0
- data/lib/karafka/pro/routing/features/expiring/contract.rb +38 -0
- data/lib/karafka/pro/routing/features/expiring/topic.rb +59 -0
- data/lib/karafka/pro/routing/features/expiring.rb +27 -0
- data/lib/karafka/pro/routing/features/filtering/config.rb +40 -0
- data/lib/karafka/pro/routing/features/filtering/contract.rb +41 -0
- data/lib/karafka/pro/routing/features/filtering/topic.rb +51 -0
- data/lib/karafka/pro/routing/features/filtering.rb +27 -0
- data/lib/karafka/pro/routing/features/long_running_job/config.rb +28 -0
- data/lib/karafka/pro/routing/features/long_running_job/contract.rb +37 -0
- data/lib/karafka/pro/routing/features/long_running_job/topic.rb +42 -0
- data/lib/karafka/pro/routing/features/long_running_job.rb +28 -0
- data/lib/karafka/pro/routing/features/throttling/config.rb +32 -0
- data/lib/karafka/pro/routing/features/throttling/contract.rb +41 -0
- data/lib/karafka/pro/routing/features/throttling/topic.rb +69 -0
- data/lib/karafka/pro/routing/features/throttling.rb +30 -0
- data/lib/karafka/pro/routing/features/virtual_partitions/config.rb +30 -0
- data/lib/karafka/pro/routing/features/virtual_partitions/contract.rb +52 -0
- data/lib/karafka/pro/routing/features/virtual_partitions/topic.rb +56 -0
- data/lib/karafka/pro/routing/features/virtual_partitions.rb +27 -0
- data/lib/karafka/process.rb +23 -8
- data/lib/karafka/processing/coordinator.rb +102 -23
- data/lib/karafka/processing/coordinators_buffer.rb +5 -1
- data/lib/karafka/processing/executor.rb +51 -21
- data/lib/karafka/processing/executors_buffer.rb +10 -26
- data/lib/karafka/processing/jobs/base.rb +6 -2
- data/lib/karafka/processing/jobs/consume.rb +8 -5
- data/lib/karafka/processing/jobs/idle.rb +24 -0
- data/lib/karafka/processing/jobs_builder.rb +2 -3
- data/lib/karafka/processing/jobs_queue.rb +14 -8
- data/lib/karafka/processing/partitioner.rb +3 -1
- data/lib/karafka/processing/result.rb +14 -1
- data/lib/karafka/processing/strategies/aj_dlq_mom.rb +44 -0
- data/lib/karafka/processing/strategies/aj_mom.rb +21 -0
- data/lib/karafka/processing/strategies/base.rb +52 -0
- data/lib/karafka/processing/strategies/default.rb +142 -0
- data/lib/karafka/processing/strategies/dlq.rb +88 -0
- data/lib/karafka/processing/strategies/dlq_mom.rb +49 -0
- data/lib/karafka/processing/strategies/mom.rb +29 -0
- data/lib/karafka/processing/strategy_selector.rb +47 -0
- data/lib/karafka/processing/worker.rb +8 -3
- data/lib/karafka/railtie.rb +24 -12
- data/lib/karafka/routing/activity_manager.rb +84 -0
- data/lib/karafka/routing/builder.rb +20 -0
- data/lib/karafka/routing/consumer_group.rb +38 -4
- data/lib/karafka/routing/consumer_mapper.rb +0 -10
- data/lib/karafka/routing/features/active_job/builder.rb +33 -0
- data/lib/karafka/routing/features/active_job/config.rb +15 -0
- data/lib/karafka/routing/features/active_job/contract.rb +41 -0
- data/lib/karafka/routing/features/active_job/topic.rb +33 -0
- data/lib/karafka/routing/features/active_job.rb +13 -0
- data/lib/karafka/routing/features/base/expander.rb +53 -0
- data/lib/karafka/routing/features/base.rb +34 -0
- data/lib/karafka/routing/features/dead_letter_queue/config.rb +19 -0
- data/lib/karafka/routing/features/dead_letter_queue/contract.rb +42 -0
- data/lib/karafka/routing/features/dead_letter_queue/topic.rb +41 -0
- data/lib/karafka/routing/features/dead_letter_queue.rb +16 -0
- data/lib/karafka/routing/features/declaratives/config.rb +18 -0
- data/lib/karafka/routing/features/declaratives/contract.rb +30 -0
- data/lib/karafka/routing/features/declaratives/topic.rb +44 -0
- data/lib/karafka/routing/features/declaratives.rb +14 -0
- data/lib/karafka/routing/features/manual_offset_management/config.rb +15 -0
- data/lib/karafka/routing/features/manual_offset_management/contract.rb +24 -0
- data/lib/karafka/routing/features/manual_offset_management/topic.rb +35 -0
- data/lib/karafka/routing/features/manual_offset_management.rb +18 -0
- data/lib/karafka/routing/proxy.rb +18 -20
- data/lib/karafka/routing/router.rb +27 -2
- data/lib/karafka/routing/subscription_group.rb +43 -5
- data/lib/karafka/routing/subscription_groups_builder.rb +6 -1
- data/lib/karafka/routing/topic.rb +17 -5
- data/lib/karafka/routing/topics.rb +8 -0
- data/lib/karafka/runner.rb +1 -0
- data/lib/karafka/serialization/json/deserializer.rb +1 -0
- data/lib/karafka/server.rb +58 -28
- data/lib/karafka/setup/attributes_map.rb +344 -0
- data/lib/karafka/setup/config.rb +48 -19
- data/lib/karafka/status.rb +35 -7
- data/lib/karafka/templates/karafka.rb.erb +14 -6
- data/lib/karafka/time_trackers/base.rb +1 -6
- data/lib/karafka/time_trackers/pause.rb +49 -19
- data/lib/karafka/time_trackers/poll.rb +7 -3
- data/lib/karafka/version.rb +1 -1
- data/lib/karafka.rb +56 -3
- data/renovate.json +6 -0
- data.tar.gz.sig +0 -0
- metadata +189 -61
- metadata.gz.sig +0 -0
- data/bin/wait_for_kafka +0 -20
- data/certs/mensfeld.pem +0 -25
- data/lib/karafka/active_job/routing/extensions.rb +0 -31
- data/lib/karafka/contracts/consumer_group_topic.rb +0 -42
- data/lib/karafka/instrumentation.rb +0 -21
- data/lib/karafka/pro/base_consumer.rb +0 -82
- data/lib/karafka/pro/contracts/consumer_group.rb +0 -34
- data/lib/karafka/pro/contracts/consumer_group_topic.rb +0 -33
- data/lib/karafka/pro/routing/topic_extensions.rb +0 -38
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# This Karafka component is a Pro component under a commercial license.
|
|
4
|
+
# This Karafka component is NOT licensed under LGPL.
|
|
5
|
+
#
|
|
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 of
|
|
12
|
+
# your code to Maciej Mensfeld.
|
|
13
|
+
|
|
14
|
+
module Karafka
|
|
15
|
+
module Pro
|
|
16
|
+
module Processing
|
|
17
|
+
module Strategies
|
|
18
|
+
# Filtering related init strategies
|
|
19
|
+
module Lrj
|
|
20
|
+
# Filtering enabled
|
|
21
|
+
# LRJ enabled
|
|
22
|
+
# MoM enabled
|
|
23
|
+
# VPs enabled
|
|
24
|
+
module FtrMomVp
|
|
25
|
+
# Filtering + LRJ + Mom + VPs
|
|
26
|
+
FEATURES = %i[
|
|
27
|
+
filtering
|
|
28
|
+
long_running_job
|
|
29
|
+
manual_offset_management
|
|
30
|
+
virtual_partitions
|
|
31
|
+
].freeze
|
|
32
|
+
|
|
33
|
+
include Strategies::Lrj::MomVp
|
|
34
|
+
include Strategies::Lrj::FtrMom
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# This Karafka component is a Pro component under a commercial license.
|
|
4
|
+
# This Karafka component is NOT licensed under LGPL.
|
|
5
|
+
#
|
|
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 of
|
|
12
|
+
# your code to Maciej Mensfeld.
|
|
13
|
+
|
|
14
|
+
module Karafka
|
|
15
|
+
module Pro
|
|
16
|
+
module Processing
|
|
17
|
+
module Strategies
|
|
18
|
+
module Lrj
|
|
19
|
+
# Long-Running Job enabled
|
|
20
|
+
# Filtering enabled
|
|
21
|
+
# Virtual Partitions enabled
|
|
22
|
+
#
|
|
23
|
+
# Behaves same as non-VP because of the aggregated flow in the coordinator.
|
|
24
|
+
module FtrVp
|
|
25
|
+
include Strategies::Vp::Default
|
|
26
|
+
include Strategies::Lrj::Ftr
|
|
27
|
+
|
|
28
|
+
# Features for this strategy
|
|
29
|
+
FEATURES = %i[
|
|
30
|
+
filtering
|
|
31
|
+
long_running_job
|
|
32
|
+
virtual_partitions
|
|
33
|
+
].freeze
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# This Karafka component is a Pro component under a commercial license.
|
|
4
|
+
# This Karafka component is NOT licensed under LGPL.
|
|
5
|
+
#
|
|
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 of
|
|
12
|
+
# your code to Maciej Mensfeld.
|
|
13
|
+
|
|
14
|
+
module Karafka
|
|
15
|
+
module Pro
|
|
16
|
+
module Processing
|
|
17
|
+
module Strategies
|
|
18
|
+
# Namespace for all the LRJ starting strategies
|
|
19
|
+
module Lrj
|
|
20
|
+
# Long-Running Job enabled
|
|
21
|
+
# Manual offset management enabled
|
|
22
|
+
module Mom
|
|
23
|
+
include Strategies::Default
|
|
24
|
+
|
|
25
|
+
# Features for this strategy
|
|
26
|
+
FEATURES = %i[
|
|
27
|
+
long_running_job
|
|
28
|
+
manual_offset_management
|
|
29
|
+
].freeze
|
|
30
|
+
|
|
31
|
+
# We always need to pause prior to doing any jobs for LRJ
|
|
32
|
+
def handle_before_enqueue
|
|
33
|
+
super
|
|
34
|
+
|
|
35
|
+
# This ensures that when running LRJ with VP, things operate as expected run only
|
|
36
|
+
# once for all the virtual partitions collectively
|
|
37
|
+
coordinator.on_enqueued do
|
|
38
|
+
# Pause at the first message in a batch. That way in case of a crash, we will not
|
|
39
|
+
# loose any messages.
|
|
40
|
+
#
|
|
41
|
+
# For VP it applies the same way and since VP cannot be used with MOM we should not
|
|
42
|
+
# have any edge cases here.
|
|
43
|
+
pause(coordinator.seek_offset, Strategies::Lrj::Default::MAX_PAUSE_TIME, false)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# No offset management, aside from that typical LRJ
|
|
48
|
+
def handle_after_consume
|
|
49
|
+
coordinator.on_finished do |last_group_message|
|
|
50
|
+
if coordinator.success?
|
|
51
|
+
coordinator.pause_tracker.reset
|
|
52
|
+
|
|
53
|
+
return if coordinator.manual_pause?
|
|
54
|
+
|
|
55
|
+
seek(last_group_message.offset + 1) unless revoked?
|
|
56
|
+
|
|
57
|
+
resume
|
|
58
|
+
else
|
|
59
|
+
retry_after_pause
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# We do not un-pause on revokations for LRJ
|
|
65
|
+
def handle_revoked
|
|
66
|
+
coordinator.on_revoked do
|
|
67
|
+
coordinator.revoke
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
Karafka.monitor.instrument('consumer.revoke', caller: self)
|
|
71
|
+
Karafka.monitor.instrument('consumer.revoked', caller: self) do
|
|
72
|
+
revoked
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# This Karafka component is a Pro component under a commercial license.
|
|
4
|
+
# This Karafka component is NOT licensed under LGPL.
|
|
5
|
+
#
|
|
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 of
|
|
12
|
+
# your code to Maciej Mensfeld.
|
|
13
|
+
|
|
14
|
+
module Karafka
|
|
15
|
+
module Pro
|
|
16
|
+
module Processing
|
|
17
|
+
module Strategies
|
|
18
|
+
# Namespace for all the LRJ starting strategies
|
|
19
|
+
module Lrj
|
|
20
|
+
# Long-Running Job enabled
|
|
21
|
+
# Manual offset management enabled
|
|
22
|
+
# Virtual Partitions enabled
|
|
23
|
+
module MomVp
|
|
24
|
+
include Strategies::Mom::Vp
|
|
25
|
+
include Strategies::Lrj::Mom
|
|
26
|
+
|
|
27
|
+
# Features for this strategy
|
|
28
|
+
FEATURES = %i[
|
|
29
|
+
long_running_job
|
|
30
|
+
manual_offset_management
|
|
31
|
+
virtual_partitions
|
|
32
|
+
].freeze
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# This Karafka component is a Pro component under a commercial license.
|
|
4
|
+
# This Karafka component is NOT licensed under LGPL.
|
|
5
|
+
#
|
|
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 of
|
|
12
|
+
# your code to Maciej Mensfeld.
|
|
13
|
+
|
|
14
|
+
module Karafka
|
|
15
|
+
module Pro
|
|
16
|
+
module Processing
|
|
17
|
+
module Strategies
|
|
18
|
+
module Lrj
|
|
19
|
+
# Long-Running Job enabled
|
|
20
|
+
# Virtual Partitions enabled
|
|
21
|
+
module Vp
|
|
22
|
+
# Same flow as the standard Lrj
|
|
23
|
+
include Strategies::Vp::Default
|
|
24
|
+
include Strategies::Lrj::Default
|
|
25
|
+
|
|
26
|
+
# Features for this strategy
|
|
27
|
+
FEATURES = %i[
|
|
28
|
+
long_running_job
|
|
29
|
+
virtual_partitions
|
|
30
|
+
].freeze
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# This Karafka component is a Pro component under a commercial license.
|
|
4
|
+
# This Karafka component is NOT licensed under LGPL.
|
|
5
|
+
#
|
|
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 of
|
|
12
|
+
# your code to Maciej Mensfeld.
|
|
13
|
+
|
|
14
|
+
module Karafka
|
|
15
|
+
module Pro
|
|
16
|
+
module Processing
|
|
17
|
+
module Strategies
|
|
18
|
+
# Namespace for Mom starting strategies
|
|
19
|
+
module Mom
|
|
20
|
+
# Manual offset management enabled
|
|
21
|
+
module Default
|
|
22
|
+
include Strategies::Default
|
|
23
|
+
|
|
24
|
+
# Features for this strategy
|
|
25
|
+
FEATURES = %i[
|
|
26
|
+
manual_offset_management
|
|
27
|
+
].freeze
|
|
28
|
+
|
|
29
|
+
# When mom is enabled, we do not mark messages as consumed after processing
|
|
30
|
+
def handle_after_consume
|
|
31
|
+
coordinator.on_finished do
|
|
32
|
+
return if revoked?
|
|
33
|
+
|
|
34
|
+
if coordinator.success?
|
|
35
|
+
coordinator.pause_tracker.reset
|
|
36
|
+
else
|
|
37
|
+
retry_after_pause
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# This Karafka component is a Pro component under a commercial license.
|
|
4
|
+
# This Karafka component is NOT licensed under LGPL.
|
|
5
|
+
#
|
|
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 of
|
|
12
|
+
# your code to Maciej Mensfeld.
|
|
13
|
+
|
|
14
|
+
module Karafka
|
|
15
|
+
module Pro
|
|
16
|
+
module Processing
|
|
17
|
+
module Strategies
|
|
18
|
+
module Mom
|
|
19
|
+
# Filtering support for MoM
|
|
20
|
+
module Ftr
|
|
21
|
+
include Strategies::Ftr::Default
|
|
22
|
+
include Strategies::Mom::Default
|
|
23
|
+
|
|
24
|
+
# MoM + Ftr
|
|
25
|
+
FEATURES = %i[
|
|
26
|
+
filtering
|
|
27
|
+
manual_offset_management
|
|
28
|
+
].freeze
|
|
29
|
+
|
|
30
|
+
# When mom is enabled, we do not mark messages as consumed after processing
|
|
31
|
+
# but we also need to keep in mind throttling here
|
|
32
|
+
def handle_after_consume
|
|
33
|
+
coordinator.on_finished do
|
|
34
|
+
return if revoked?
|
|
35
|
+
|
|
36
|
+
if coordinator.success?
|
|
37
|
+
coordinator.pause_tracker.reset
|
|
38
|
+
|
|
39
|
+
# Do not throttle if paused
|
|
40
|
+
return if coordinator.manual_pause?
|
|
41
|
+
|
|
42
|
+
handle_post_filtering
|
|
43
|
+
else
|
|
44
|
+
retry_after_pause
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# This Karafka component is a Pro component under a commercial license.
|
|
4
|
+
# This Karafka component is NOT licensed under LGPL.
|
|
5
|
+
#
|
|
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 of
|
|
12
|
+
# your code to Maciej Mensfeld.
|
|
13
|
+
|
|
14
|
+
module Karafka
|
|
15
|
+
module Pro
|
|
16
|
+
module Processing
|
|
17
|
+
module Strategies
|
|
18
|
+
module Mom
|
|
19
|
+
# - Mom enabled
|
|
20
|
+
# - Ftr enabled
|
|
21
|
+
# - Vp enabled
|
|
22
|
+
module FtrVp
|
|
23
|
+
include Strategies::Mom::Vp
|
|
24
|
+
include Strategies::Mom::Ftr
|
|
25
|
+
|
|
26
|
+
# Features of this strategy
|
|
27
|
+
FEATURES = %i[
|
|
28
|
+
filtering
|
|
29
|
+
manual_offset_management
|
|
30
|
+
virtual_partitions
|
|
31
|
+
].freeze
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# This Karafka component is a Pro component under a commercial license.
|
|
4
|
+
# This Karafka component is NOT licensed under LGPL.
|
|
5
|
+
#
|
|
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 of
|
|
12
|
+
# your code to Maciej Mensfeld.
|
|
13
|
+
|
|
14
|
+
module Karafka
|
|
15
|
+
module Pro
|
|
16
|
+
module Processing
|
|
17
|
+
module Strategies
|
|
18
|
+
module Mom
|
|
19
|
+
# - Mom enabled
|
|
20
|
+
# - Vp enabled
|
|
21
|
+
module Vp
|
|
22
|
+
include Strategies::Vp::Default
|
|
23
|
+
include Strategies::Mom::Default
|
|
24
|
+
|
|
25
|
+
# Features of this strategy
|
|
26
|
+
FEATURES = %i[
|
|
27
|
+
manual_offset_management
|
|
28
|
+
virtual_partitions
|
|
29
|
+
].freeze
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# This Karafka component is a Pro component under a commercial license.
|
|
4
|
+
# This Karafka component is NOT licensed under LGPL.
|
|
5
|
+
#
|
|
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 of
|
|
12
|
+
# your code to Maciej Mensfeld.
|
|
13
|
+
|
|
14
|
+
module Karafka
|
|
15
|
+
module Pro
|
|
16
|
+
module Processing
|
|
17
|
+
module Strategies
|
|
18
|
+
# VP starting strategies
|
|
19
|
+
module Vp
|
|
20
|
+
# Just Virtual Partitions enabled
|
|
21
|
+
module Default
|
|
22
|
+
# This flow is exactly the same as the default one because the default one is wrapper
|
|
23
|
+
# with `coordinator#on_finished`
|
|
24
|
+
include Strategies::Default
|
|
25
|
+
|
|
26
|
+
# Features for this strategy
|
|
27
|
+
FEATURES = %i[
|
|
28
|
+
virtual_partitions
|
|
29
|
+
].freeze
|
|
30
|
+
|
|
31
|
+
# @param message [Karafka::Messages::Message] marks message as consumed
|
|
32
|
+
# @note This virtual offset management uses a regular default marking API underneath.
|
|
33
|
+
# We do not alter the "real" marking API, as VPs are just one of many cases we want
|
|
34
|
+
# to support and we do not want to impact them with collective offsets management
|
|
35
|
+
def mark_as_consumed(message)
|
|
36
|
+
return super if collapsed?
|
|
37
|
+
|
|
38
|
+
manager = coordinator.virtual_offset_manager
|
|
39
|
+
|
|
40
|
+
coordinator.synchronize do
|
|
41
|
+
manager.mark(message)
|
|
42
|
+
# If this is last marking on a finished flow, we can use the original
|
|
43
|
+
# last message and in order to do so, we need to mark all previous messages as
|
|
44
|
+
# consumed as otherwise the computed offset could be different
|
|
45
|
+
# We mark until our offset just in case of a DLQ flow or similar, where we do not
|
|
46
|
+
# want to mark all but until the expected location
|
|
47
|
+
manager.mark_until(message) if coordinator.finished?
|
|
48
|
+
|
|
49
|
+
return revoked? unless manager.markable?
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
manager.markable? ? super(manager.markable) : revoked?
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# @param message [Karafka::Messages::Message] blocking marks message as consumed
|
|
56
|
+
def mark_as_consumed!(message)
|
|
57
|
+
return super if collapsed?
|
|
58
|
+
|
|
59
|
+
manager = coordinator.virtual_offset_manager
|
|
60
|
+
|
|
61
|
+
coordinator.synchronize do
|
|
62
|
+
manager.mark(message)
|
|
63
|
+
manager.mark_until(message) if coordinator.finished?
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
manager.markable? ? super(manager.markable) : revoked?
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# @return [Boolean] is the virtual processing collapsed in the context of given
|
|
70
|
+
# consumer.
|
|
71
|
+
def collapsed?
|
|
72
|
+
coordinator.collapsed?
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# @return [Boolean] true if any of virtual partition we're operating in the entangled
|
|
76
|
+
# mode has already failed and we know we are failing collectively.
|
|
77
|
+
# Useful for early stop to minimize number of things processed twice.
|
|
78
|
+
#
|
|
79
|
+
# @note We've named it `#failing?` instead of `#failure?` because it aims to be used
|
|
80
|
+
# from within virtual partitions where we want to have notion of collective failing
|
|
81
|
+
# not just "local" to our processing. We "are" failing with other virtual partitions
|
|
82
|
+
# raising an error, but locally we are still processing.
|
|
83
|
+
def failing?
|
|
84
|
+
coordinator.failure?
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
private
|
|
88
|
+
|
|
89
|
+
# Prior to adding work to the queue, registers all the messages offsets into the
|
|
90
|
+
# virtual offset group.
|
|
91
|
+
#
|
|
92
|
+
# @note This can be done without the mutex, because it happens from the same thread
|
|
93
|
+
# for all the work (listener thread)
|
|
94
|
+
def handle_before_enqueue
|
|
95
|
+
coordinator.virtual_offset_manager.register(
|
|
96
|
+
messages.map(&:offset)
|
|
97
|
+
)
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
# This Karafka component is a Pro component.
|
|
3
|
+
# This Karafka component is a Pro component under a commercial license.
|
|
4
|
+
# This Karafka component is NOT licensed under LGPL.
|
|
5
|
+
#
|
|
4
6
|
# All of the commercial components are present in the lib/karafka/pro directory of this
|
|
5
7
|
# repository and their usage requires commercial license agreement.
|
|
6
8
|
#
|
|
@@ -11,10 +13,9 @@
|
|
|
11
13
|
|
|
12
14
|
module Karafka
|
|
13
15
|
module Pro
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class Base < ::Karafka::Contracts::Base
|
|
16
|
+
module Processing
|
|
17
|
+
# Pro processing strategies namespace
|
|
18
|
+
module Strategies
|
|
18
19
|
end
|
|
19
20
|
end
|
|
20
21
|
end
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# This Karafka component is a Pro component under a commercial license.
|
|
4
|
+
# This Karafka component is NOT licensed under LGPL.
|
|
5
|
+
#
|
|
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 of
|
|
12
|
+
# your code to Maciej Mensfeld.
|
|
13
|
+
|
|
14
|
+
module Karafka
|
|
15
|
+
module Pro
|
|
16
|
+
module Processing
|
|
17
|
+
# Selector of appropriate processing strategy matching topic combinations
|
|
18
|
+
# When using Karafka Pro, there is a different set of strategies than for regular, as there
|
|
19
|
+
# are different features.
|
|
20
|
+
class StrategySelector
|
|
21
|
+
attr_reader :strategies
|
|
22
|
+
|
|
23
|
+
# Strategies that we support in the Pro offering
|
|
24
|
+
# They can be combined
|
|
25
|
+
SUPPORTED_FEATURES = %i[
|
|
26
|
+
active_job
|
|
27
|
+
long_running_job
|
|
28
|
+
manual_offset_management
|
|
29
|
+
virtual_partitions
|
|
30
|
+
dead_letter_queue
|
|
31
|
+
filtering
|
|
32
|
+
].freeze
|
|
33
|
+
|
|
34
|
+
def initialize
|
|
35
|
+
# Preload the strategies
|
|
36
|
+
# We load them once for performance reasons not to do too many lookups
|
|
37
|
+
@strategies = find_all
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# @param topic [Karafka::Routing::Topic] topic with settings based on which we find
|
|
41
|
+
# the strategy
|
|
42
|
+
# @return [Module] module with proper strategy
|
|
43
|
+
def find(topic)
|
|
44
|
+
feature_set = SUPPORTED_FEATURES.map do |feature_name|
|
|
45
|
+
topic.public_send("#{feature_name}?") ? feature_name : nil
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
feature_set.compact!
|
|
49
|
+
feature_set.sort!
|
|
50
|
+
|
|
51
|
+
@strategies.find do |strategy|
|
|
52
|
+
strategy::FEATURES.sort == feature_set
|
|
53
|
+
end || raise(Errors::StrategyNotFoundError, topic.name)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
private
|
|
57
|
+
|
|
58
|
+
# @return [Array<Module>] all available strategies
|
|
59
|
+
def find_all
|
|
60
|
+
scopes = [Strategies]
|
|
61
|
+
modules = Strategies.constants
|
|
62
|
+
|
|
63
|
+
modules.each do |const|
|
|
64
|
+
scopes << Strategies.const_get(const)
|
|
65
|
+
modules += scopes.last.constants
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
scopes.flat_map do |scope|
|
|
69
|
+
modules.map do |const|
|
|
70
|
+
next if const == :FEATURES
|
|
71
|
+
next unless scope.const_defined?(const)
|
|
72
|
+
|
|
73
|
+
candidate = scope.const_get(const)
|
|
74
|
+
|
|
75
|
+
next unless candidate.const_defined?(:FEATURES)
|
|
76
|
+
|
|
77
|
+
candidate
|
|
78
|
+
end
|
|
79
|
+
end.uniq.compact
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|