karafka 2.5.9 → 2.6.0.beta1
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
- data/CHANGELOG.md +34 -0
- data/certs/expired.txt +83 -0
- data/config/locales/errors.yml +17 -7
- data/karafka.gemspec +3 -3
- data/lib/active_job/queue_adapters/karafka_adapter.rb +1 -2
- data/lib/karafka/active_job/job_extensions.rb +1 -2
- data/lib/karafka/admin/configs/resource.rb +1 -2
- data/lib/karafka/admin/consumer_groups.rb +109 -98
- data/lib/karafka/admin/isolation_levels.rb +22 -0
- data/lib/karafka/admin/topics.rb +103 -8
- data/lib/karafka/admin.rb +59 -31
- data/lib/karafka/app.rb +16 -5
- data/lib/karafka/base_consumer.rb +2 -2
- data/lib/karafka/cli/contracts/server.rb +4 -4
- data/lib/karafka/cli/info.rb +1 -1
- data/lib/karafka/cli/topics/base.rb +10 -18
- data/lib/karafka/cli/topics/repartition.rb +1 -1
- data/lib/karafka/connection/client.rb +40 -9
- data/lib/karafka/connection/consumer_groups/rebalance_manager.rb +120 -0
- data/lib/karafka/connection/listener.rb +8 -7
- data/lib/karafka/connection/listeners_batch.rb +1 -1
- data/lib/karafka/connection/mode.rb +1 -2
- data/lib/karafka/connection/raw_messages_buffer.rb +0 -5
- data/lib/karafka/declaratives/builder.rb +65 -0
- data/lib/karafka/declaratives/contracts/topic.rb +28 -0
- data/lib/karafka/declaratives/repository.rb +52 -0
- data/lib/karafka/declaratives/topic.rb +100 -0
- data/lib/karafka/declaratives.rb +9 -0
- data/lib/karafka/helpers/interval_runner.rb +2 -2
- data/lib/karafka/instrumentation/assignments_tracker.rb +65 -2
- data/lib/karafka/instrumentation/callbacks/consumer_groups/error.rb +56 -0
- data/lib/karafka/instrumentation/callbacks/consumer_groups/rebalance.rb +93 -0
- data/lib/karafka/instrumentation/callbacks/consumer_groups/statistics.rb +59 -0
- data/lib/karafka/instrumentation/logger_listener.rb +27 -9
- data/lib/karafka/instrumentation/notifications.rb +2 -0
- data/lib/karafka/instrumentation/vendors/appsignal/metrics_listener.rb +14 -17
- data/lib/karafka/instrumentation/vendors/datadog/metrics_listener.rb +8 -9
- data/lib/karafka/instrumentation/vendors/kubernetes/base_listener.rb +7 -3
- data/lib/karafka/instrumentation/vendors/kubernetes/liveness_listener.rb +13 -10
- data/lib/karafka/licenser.rb +16 -3
- data/lib/karafka/pro/active_job/consumer.rb +1 -2
- data/lib/karafka/pro/active_job/dispatcher.rb +1 -2
- data/lib/karafka/pro/admin/recovery.rb +19 -19
- data/lib/karafka/pro/base_consumer.rb +3 -3
- data/lib/karafka/pro/cli/contracts/server.rb +5 -5
- data/lib/karafka/pro/cli/parallel_segments/base.rb +7 -7
- data/lib/karafka/pro/cli/parallel_segments/collapse.rb +4 -4
- data/lib/karafka/pro/cli/parallel_segments/distribute.rb +6 -6
- data/lib/karafka/pro/iterator/tpl_builder.rb +38 -18
- data/lib/karafka/pro/loader.rb +15 -12
- data/lib/karafka/pro/processing/consumer_groups/adaptive_iterator/consumer.rb +84 -0
- data/lib/karafka/pro/processing/consumer_groups/adaptive_iterator/tracker.rb +97 -0
- data/lib/karafka/pro/processing/consumer_groups/collapser.rb +84 -0
- data/lib/karafka/pro/processing/consumer_groups/coordinator.rb +202 -0
- data/lib/karafka/pro/processing/consumer_groups/coordinators/errors_tracker.rb +124 -0
- data/lib/karafka/pro/processing/consumer_groups/coordinators/filters_applier.rb +157 -0
- data/lib/karafka/pro/processing/consumer_groups/coordinators/virtual_offset_manager.rb +212 -0
- data/lib/karafka/pro/processing/{filters/expirer.rb → consumer_groups/executor.rb} +17 -31
- data/lib/karafka/pro/processing/{jobs/periodic.rb → consumer_groups/expansions_selector.rb} +18 -21
- data/lib/karafka/pro/processing/consumer_groups/filters/base.rb +103 -0
- data/lib/karafka/pro/processing/consumer_groups/filters/delayer.rb +92 -0
- data/lib/karafka/pro/processing/consumer_groups/filters/expirer.rb +78 -0
- data/lib/karafka/pro/processing/consumer_groups/filters/inline_insights_delayer.rb +99 -0
- data/lib/karafka/pro/processing/consumer_groups/filters/throttler.rb +106 -0
- data/lib/karafka/pro/processing/consumer_groups/filters/virtual_limiter.rb +79 -0
- data/lib/karafka/pro/processing/{jobs → consumer_groups/jobs}/consume_non_blocking.rb +21 -17
- data/lib/karafka/pro/processing/{virtual_partitions/distributors/consistent.rb → consumer_groups/jobs/eofed_non_blocking.rb} +16 -14
- data/lib/karafka/pro/processing/consumer_groups/jobs/periodic.rb +64 -0
- data/lib/karafka/pro/processing/{jobs → consumer_groups/jobs}/periodic_non_blocking.rb +16 -11
- data/lib/karafka/pro/processing/{jobs → consumer_groups/jobs}/revoked_non_blocking.rb +19 -15
- data/lib/karafka/pro/processing/consumer_groups/jobs_builder.rb +95 -0
- data/lib/karafka/pro/processing/consumer_groups/offset_metadata/consumer.rb +66 -0
- data/lib/karafka/pro/processing/consumer_groups/offset_metadata/fetcher.rb +154 -0
- data/lib/karafka/pro/processing/consumer_groups/offset_metadata/listener.rb +68 -0
- data/lib/karafka/pro/processing/consumer_groups/parallel_segments/filters/base.rb +102 -0
- data/lib/karafka/pro/processing/consumer_groups/parallel_segments/filters/default.rb +115 -0
- data/lib/karafka/pro/processing/consumer_groups/parallel_segments/filters/mom.rb +96 -0
- data/lib/karafka/pro/processing/consumer_groups/partitioner.rb +98 -0
- data/lib/karafka/pro/processing/consumer_groups/periodic_job/consumer.rb +90 -0
- data/lib/karafka/pro/processing/consumer_groups/piping/consumer.rb +154 -0
- data/lib/karafka/pro/processing/consumer_groups/strategies/aj/dlq_ftr_lrj_mom.rb +93 -0
- data/lib/karafka/pro/processing/consumer_groups/strategies/aj/dlq_ftr_lrj_mom_vp.rb +99 -0
- data/lib/karafka/pro/processing/consumer_groups/strategies/aj/dlq_ftr_mom.rb +92 -0
- data/lib/karafka/pro/processing/consumer_groups/strategies/aj/dlq_ftr_mom_vp.rb +90 -0
- data/lib/karafka/pro/processing/{strategies/aj/dlq_ftr_lrj_mom.rb → consumer_groups/strategies/aj/dlq_lrj_mom.rb} +37 -39
- data/lib/karafka/pro/processing/consumer_groups/strategies/aj/dlq_lrj_mom_vp.rb +90 -0
- data/lib/karafka/pro/processing/consumer_groups/strategies/aj/dlq_mom.rb +84 -0
- data/lib/karafka/pro/processing/consumer_groups/strategies/aj/dlq_mom_vp.rb +89 -0
- data/lib/karafka/pro/processing/{strategies → consumer_groups/strategies}/aj/ftr_lrj_mom.rb +20 -15
- data/lib/karafka/pro/processing/consumer_groups/strategies/aj/ftr_lrj_mom_vp.rb +91 -0
- data/lib/karafka/pro/processing/{strategies → consumer_groups/strategies}/aj/ftr_mom.rb +20 -15
- data/lib/karafka/pro/processing/consumer_groups/strategies/aj/ftr_mom_vp.rb +80 -0
- data/lib/karafka/pro/processing/{strategies/mom/default.rb → consumer_groups/strategies/aj/lrj_mom.rb} +18 -22
- data/lib/karafka/pro/processing/consumer_groups/strategies/aj/lrj_mom_vp.rb +106 -0
- data/lib/karafka/pro/processing/consumer_groups/strategies/aj/mom.rb +58 -0
- data/lib/karafka/pro/processing/consumer_groups/strategies/aj/mom_vp.rb +74 -0
- data/lib/karafka/pro/processing/{strategies/lrj/vp.rb → consumer_groups/strategies/base.rb} +9 -14
- data/lib/karafka/pro/processing/consumer_groups/strategies/default.rb +421 -0
- data/lib/karafka/pro/processing/consumer_groups/strategies/dlq/default.rb +285 -0
- data/lib/karafka/pro/processing/{strategies/dlq/lrj.rb → consumer_groups/strategies/dlq/ftr.rb} +30 -29
- data/lib/karafka/pro/processing/consumer_groups/strategies/dlq/ftr_lrj.rb +95 -0
- data/lib/karafka/pro/processing/consumer_groups/strategies/dlq/ftr_lrj_mom.rb +97 -0
- data/lib/karafka/pro/processing/{executor.rb → consumer_groups/strategies/dlq/ftr_lrj_mom_vp.rb} +26 -15
- data/lib/karafka/pro/processing/consumer_groups/strategies/dlq/ftr_lrj_vp.rb +63 -0
- data/lib/karafka/pro/processing/consumer_groups/strategies/dlq/ftr_mom.rb +97 -0
- data/lib/karafka/pro/processing/consumer_groups/strategies/dlq/ftr_mom_vp.rb +63 -0
- data/lib/karafka/pro/{routing/features/patterns/patterns.rb → processing/consumer_groups/strategies/dlq/ftr_vp.rb} +22 -12
- data/lib/karafka/pro/processing/consumer_groups/strategies/dlq/lrj.rb +83 -0
- data/lib/karafka/pro/processing/consumer_groups/strategies/dlq/lrj_mom.rb +100 -0
- data/lib/karafka/pro/processing/{strategies → consumer_groups/strategies}/dlq/lrj_mom_vp.rb +18 -13
- data/lib/karafka/pro/processing/consumer_groups/strategies/dlq/lrj_vp.rb +61 -0
- data/lib/karafka/pro/processing/consumer_groups/strategies/dlq/mom.rb +96 -0
- data/lib/karafka/pro/processing/{strategies/lrj → consumer_groups/strategies/dlq}/mom_vp.rb +19 -15
- data/lib/karafka/pro/processing/consumer_groups/strategies/dlq/vp.rb +62 -0
- data/lib/karafka/pro/processing/consumer_groups/strategies/ftr/default.rb +146 -0
- data/lib/karafka/pro/processing/{strategies/mom/ftr.rb → consumer_groups/strategies/ftr/vp.rb} +20 -28
- data/lib/karafka/pro/processing/consumer_groups/strategies/lrj/default.rb +119 -0
- data/lib/karafka/pro/processing/consumer_groups/strategies/lrj/ftr.rb +94 -0
- data/lib/karafka/pro/processing/consumer_groups/strategies/lrj/ftr_mom.rb +92 -0
- data/lib/karafka/pro/processing/consumer_groups/strategies/lrj/ftr_mom_vp.rb +62 -0
- data/lib/karafka/pro/processing/consumer_groups/strategies/lrj/ftr_vp.rb +61 -0
- data/lib/karafka/pro/processing/consumer_groups/strategies/lrj/mom.rb +101 -0
- data/lib/karafka/pro/processing/consumer_groups/strategies/lrj/mom_vp.rb +60 -0
- data/lib/karafka/pro/processing/{strategies/mom → consumer_groups/strategies/lrj}/vp.rb +18 -12
- data/lib/karafka/pro/processing/{strategies/aj/mom_vp.rb → consumer_groups/strategies/mom/default.rb} +22 -23
- data/lib/karafka/pro/processing/{strategies/aj/ftr_mom_vp.rb → consumer_groups/strategies/mom/ftr.rb} +28 -28
- data/lib/karafka/pro/processing/{virtual_partitions/distributors/base.rb → consumer_groups/strategies/mom/ftr_vp.rb} +19 -14
- data/lib/karafka/pro/processing/{strategies/aj/mom.rb → consumer_groups/strategies/mom/vp.rb} +16 -12
- data/lib/karafka/pro/processing/consumer_groups/strategies/vp/default.rb +197 -0
- data/lib/karafka/pro/processing/consumer_groups/strategy_selector.rb +106 -0
- data/lib/karafka/pro/processing/consumer_groups/subscription_groups_coordinator.rb +73 -0
- data/lib/karafka/pro/processing/consumer_groups/virtual_partitions/distributors/balanced.rb +82 -0
- data/lib/karafka/pro/processing/consumer_groups/virtual_partitions/distributors/base.rb +59 -0
- data/lib/karafka/pro/processing/{strategies/dlq/ftr.rb → consumer_groups/virtual_partitions/distributors/consistent.rb} +18 -33
- data/lib/karafka/pro/processing/filters/base.rb +3 -61
- data/lib/karafka/pro/processing/partitioner.rb +2 -57
- data/lib/karafka/pro/processing/schedulers/base.rb +10 -6
- data/lib/karafka/pro/processing/schedulers/default.rb +6 -5
- data/lib/karafka/pro/recurring_tasks/executor.rb +1 -2
- data/lib/karafka/pro/routing/features/{active_job → consumer_groups/active_job}/builder.rb +20 -18
- data/lib/karafka/pro/routing/features/{inline_insights/config.rb → consumer_groups/active_job.rb} +5 -9
- data/lib/karafka/pro/routing/features/consumer_groups/adaptive_iterator/config.rb +53 -0
- data/lib/karafka/pro/routing/features/consumer_groups/adaptive_iterator/contracts/topic.rb +91 -0
- data/lib/karafka/pro/routing/features/consumer_groups/adaptive_iterator/topic.rb +90 -0
- data/lib/karafka/pro/routing/features/consumer_groups/adaptive_iterator.rb +50 -0
- data/lib/karafka/pro/routing/features/{patterns/contracts/consumer_group.rb → consumer_groups/dead_letter_queue/contracts/topic.rb} +25 -30
- data/lib/karafka/pro/routing/features/consumer_groups/dead_letter_queue/topic.rb +70 -0
- data/lib/karafka/pro/routing/features/consumer_groups/dead_letter_queue.rb +46 -0
- data/lib/karafka/pro/routing/features/{direct_assignments → consumer_groups/delaying}/config.rb +6 -4
- data/lib/karafka/pro/routing/features/{patterns/contracts/pattern.rb → consumer_groups/delaying/contracts/topic.rb} +13 -16
- data/lib/karafka/pro/routing/features/consumer_groups/delaying/topic.rb +85 -0
- data/lib/karafka/pro/routing/features/{adaptive_iterator/config.rb → consumer_groups/delaying.rb} +8 -11
- data/lib/karafka/pro/routing/features/consumer_groups/direct_assignments/config.rb +46 -0
- data/lib/karafka/pro/routing/features/consumer_groups/direct_assignments/contracts/consumer_group.rb +68 -0
- data/lib/karafka/pro/routing/features/consumer_groups/direct_assignments/contracts/topic.rb +125 -0
- data/lib/karafka/pro/routing/features/consumer_groups/direct_assignments/subscription_group.rb +97 -0
- data/lib/karafka/pro/routing/features/consumer_groups/direct_assignments/topic.rb +97 -0
- data/lib/karafka/pro/routing/features/consumer_groups/direct_assignments.rb +44 -0
- data/lib/karafka/pro/routing/features/consumer_groups/inline_insights/config.rb +51 -0
- data/lib/karafka/pro/routing/features/consumer_groups/inline_insights/contracts/topic.rb +58 -0
- data/lib/karafka/pro/routing/features/consumer_groups/inline_insights/topic.rb +80 -0
- data/lib/karafka/pro/routing/features/consumer_groups/inline_insights.rb +45 -0
- data/lib/karafka/pro/routing/features/consumer_groups/long_running_job/config.rb +47 -0
- data/lib/karafka/pro/routing/features/{multiplexing/patches/contracts/consumer_group.rb → consumer_groups/long_running_job/contracts/topic.rb} +13 -15
- data/lib/karafka/pro/routing/features/consumer_groups/long_running_job/topic.rb +72 -0
- data/lib/karafka/pro/routing/features/{long_running_job.rb → consumer_groups/long_running_job.rb} +6 -4
- data/lib/karafka/pro/routing/features/consumer_groups/multiplexing/config.rb +58 -0
- data/lib/karafka/pro/routing/features/consumer_groups/multiplexing/contracts/routing.rb +83 -0
- data/lib/karafka/pro/routing/features/consumer_groups/multiplexing/contracts/topic.rb +148 -0
- data/lib/karafka/pro/routing/features/{delaying/contracts/topic.rb → consumer_groups/multiplexing/patches/contracts/consumer_group.rb} +19 -14
- data/lib/karafka/pro/routing/features/{multiplexing/subscription_group.rb → consumer_groups/multiplexing/proxy.rb} +17 -23
- data/lib/karafka/pro/routing/features/consumer_groups/multiplexing/subscription_group.rb +68 -0
- data/lib/karafka/pro/routing/features/{multiplexing → consumer_groups/multiplexing}/subscription_groups_builder.rb +16 -14
- data/lib/karafka/pro/routing/features/consumer_groups/multiplexing.rb +85 -0
- data/lib/karafka/pro/routing/features/consumer_groups/non_blocking_job/topic.rb +51 -0
- data/lib/karafka/pro/routing/features/{non_blocking_job.rb → consumer_groups/non_blocking_job.rb} +15 -13
- data/lib/karafka/pro/routing/features/consumer_groups/offset_metadata/config.rb +52 -0
- data/lib/karafka/pro/routing/features/consumer_groups/offset_metadata/contracts/topic.rb +59 -0
- data/lib/karafka/pro/routing/features/consumer_groups/offset_metadata/topic.rb +93 -0
- data/lib/karafka/pro/routing/features/{offset_metadata.rb → consumer_groups/offset_metadata.rb} +16 -14
- data/lib/karafka/pro/routing/features/consumer_groups/parallel_segments/builder.rb +74 -0
- data/lib/karafka/pro/routing/features/{multiplexing → consumer_groups/parallel_segments}/config.rb +13 -15
- data/lib/karafka/pro/routing/features/consumer_groups/parallel_segments/consumer_group.rb +110 -0
- data/lib/karafka/pro/routing/features/consumer_groups/parallel_segments/contracts/consumer_group.rb +74 -0
- data/lib/karafka/pro/routing/features/{parallel_segments → consumer_groups/parallel_segments}/topic.rb +24 -22
- data/lib/karafka/pro/routing/features/consumer_groups/parallel_segments.rb +51 -0
- data/lib/karafka/pro/routing/features/{patterns → consumer_groups/patterns}/builder.rb +15 -13
- data/lib/karafka/pro/routing/features/{offset_metadata/contracts/topic.rb → consumer_groups/patterns/config.rb} +28 -13
- data/lib/karafka/pro/routing/features/consumer_groups/patterns/consumer_group.rb +91 -0
- data/lib/karafka/pro/routing/features/consumer_groups/patterns/contracts/consumer_group.rb +83 -0
- data/lib/karafka/pro/routing/features/{parallel_segments.rb → consumer_groups/patterns/contracts/pattern.rb} +24 -10
- data/lib/karafka/pro/routing/features/consumer_groups/patterns/contracts/topic.rb +58 -0
- data/lib/karafka/pro/routing/features/consumer_groups/patterns/detector.rb +98 -0
- data/lib/karafka/pro/routing/features/consumer_groups/patterns/pattern.rb +114 -0
- data/lib/karafka/pro/routing/features/{recurring_tasks/contracts/topic.rb → consumer_groups/patterns/patterns.rb} +12 -13
- data/lib/karafka/pro/routing/features/consumer_groups/patterns/topic.rb +78 -0
- data/lib/karafka/pro/routing/features/consumer_groups/patterns/topics.rb +72 -0
- data/lib/karafka/pro/routing/features/consumer_groups/patterns.rb +52 -0
- data/lib/karafka/pro/routing/features/consumer_groups/periodic_job/config.rb +56 -0
- data/lib/karafka/pro/routing/features/{direct_assignments/contracts/consumer_group.rb → consumer_groups/periodic_job/contracts/topic.rb} +17 -22
- data/lib/karafka/pro/routing/features/consumer_groups/periodic_job/topic.rb +122 -0
- data/lib/karafka/pro/routing/features/consumer_groups/periodic_job.rb +46 -0
- data/lib/karafka/pro/routing/features/consumer_groups/recurring_tasks/builder.rb +150 -0
- data/lib/karafka/pro/routing/features/{swarm → consumer_groups/recurring_tasks}/config.rb +7 -8
- data/lib/karafka/pro/routing/features/{inline_insights → consumer_groups/recurring_tasks}/contracts/topic.rb +14 -13
- data/lib/karafka/pro/routing/features/{scheduled_messages → consumer_groups/recurring_tasks}/proxy.rb +6 -4
- data/lib/karafka/pro/routing/features/consumer_groups/recurring_tasks/topic.rb +72 -0
- data/lib/karafka/pro/routing/features/consumer_groups/recurring_tasks.rb +44 -0
- data/lib/karafka/pro/routing/features/consumer_groups/scheduled_messages/builder.rb +154 -0
- data/lib/karafka/pro/routing/features/consumer_groups/scheduled_messages/config.rb +47 -0
- data/lib/karafka/pro/routing/features/{long_running_job → consumer_groups/scheduled_messages}/contracts/topic.rb +14 -12
- data/lib/karafka/pro/routing/features/{delaying/config.rb → consumer_groups/scheduled_messages/proxy.rb} +6 -4
- data/lib/karafka/pro/routing/features/consumer_groups/scheduled_messages/topic.rb +72 -0
- data/lib/karafka/pro/routing/features/{recurring_tasks/proxy.rb → consumer_groups/scheduled_messages.rb} +3 -4
- data/lib/karafka/pro/routing/features/{non_blocking_job/topic.rb → consumer_groups/swarm/config.rb} +9 -8
- data/lib/karafka/pro/routing/features/consumer_groups/swarm/contracts/routing.rb +94 -0
- data/lib/karafka/pro/routing/features/consumer_groups/swarm/contracts/topic.rb +95 -0
- data/lib/karafka/pro/routing/features/consumer_groups/swarm/topic.rb +105 -0
- data/lib/karafka/pro/routing/features/consumer_groups/swarm.rb +58 -0
- data/lib/karafka/pro/routing/features/consumer_groups/virtual_partitions/config.rb +69 -0
- data/lib/karafka/pro/routing/features/{parallel_segments/contracts/consumer_group.rb → consumer_groups/virtual_partitions/contracts/topic.rb} +21 -18
- data/lib/karafka/pro/routing/features/consumer_groups/virtual_partitions/topic.rb +101 -0
- data/lib/karafka/pro/routing/features/consumer_groups/virtual_partitions.rb +46 -0
- data/lib/karafka/pro/routing/features/{scheduled_messages.rb → consumer_groups.rb} +3 -2
- data/lib/karafka/pro/routing/features/expiring/topic.rb +4 -4
- data/lib/karafka/pro/routing/features/filtering/topic.rb +3 -3
- data/lib/karafka/pro/routing/features/pausing/topic.rb +3 -3
- data/lib/karafka/pro/routing/features/throttling/topic.rb +4 -4
- data/lib/karafka/pro/setup/defaults_injector.rb +70 -0
- data/lib/karafka/pro/swarm/liveness_listener.rb +22 -10
- data/lib/karafka/processing/consumer_groups/coordinator.rb +221 -0
- data/lib/karafka/processing/consumer_groups/coordinators_buffer.rb +69 -0
- data/lib/karafka/processing/consumer_groups/executor.rb +220 -0
- data/lib/karafka/processing/consumer_groups/executors_buffer.rb +94 -0
- data/lib/karafka/processing/consumer_groups/expansions_selector.rb +26 -0
- data/lib/karafka/processing/consumer_groups/inline_insights/consumer.rb +47 -0
- data/lib/karafka/processing/consumer_groups/inline_insights/listener.rb +23 -0
- data/lib/karafka/processing/consumer_groups/inline_insights/tracker.rb +132 -0
- data/lib/karafka/processing/consumer_groups/jobs/consume.rb +52 -0
- data/lib/karafka/processing/consumer_groups/jobs/eofed.rb +34 -0
- data/lib/karafka/processing/consumer_groups/jobs/idle.rb +33 -0
- data/lib/karafka/processing/consumer_groups/jobs/revoked.rb +34 -0
- data/lib/karafka/processing/consumer_groups/jobs/shutdown.rb +32 -0
- data/lib/karafka/processing/consumer_groups/jobs_builder.rb +36 -0
- data/lib/karafka/processing/consumer_groups/partitioner.rb +28 -0
- data/lib/karafka/processing/consumer_groups/strategies/aj_dlq_mom.rb +48 -0
- data/lib/karafka/processing/consumer_groups/strategies/aj_mom.rb +25 -0
- data/lib/karafka/processing/consumer_groups/strategies/base.rb +65 -0
- data/lib/karafka/processing/consumer_groups/strategies/default.rb +218 -0
- data/lib/karafka/processing/consumer_groups/strategies/dlq.rb +157 -0
- data/lib/karafka/processing/consumer_groups/strategies/dlq_mom.rb +72 -0
- data/lib/karafka/processing/consumer_groups/strategies/mom.rb +33 -0
- data/lib/karafka/processing/consumer_groups/strategy_selector.rb +53 -0
- data/lib/karafka/processing/coordinator.rb +4 -211
- data/lib/karafka/processing/coordinators_buffer.rb +4 -59
- data/lib/karafka/processing/jobs_queue.rb +12 -4
- data/lib/karafka/processing/partitioner.rb +4 -18
- data/lib/karafka/processing/schedulers/default.rb +2 -1
- data/lib/karafka/processing/strategy_selector.rb +4 -42
- data/lib/karafka/processing/worker.rb +8 -4
- data/lib/karafka/processing/workers_pool.rb +158 -0
- data/lib/karafka/routing/builder.rb +12 -12
- data/lib/karafka/routing/contracts/routing.rb +3 -4
- data/lib/karafka/routing/features/base/expander.rb +5 -5
- data/lib/karafka/routing/features/consumer_groups/active_job/builder.rb +35 -0
- data/lib/karafka/routing/features/consumer_groups/active_job/config.rb +17 -0
- data/lib/karafka/routing/features/consumer_groups/active_job/contracts/topic.rb +44 -0
- data/lib/karafka/routing/features/consumer_groups/active_job/proxy.rb +16 -0
- data/lib/karafka/routing/features/consumer_groups/active_job/topic.rb +50 -0
- data/lib/karafka/routing/features/consumer_groups/active_job.rb +15 -0
- data/lib/karafka/routing/features/consumer_groups/dead_letter_queue/config.rb +39 -0
- data/lib/karafka/routing/features/consumer_groups/dead_letter_queue/contracts/topic.rb +58 -0
- data/lib/karafka/routing/features/consumer_groups/dead_letter_queue/topic.rb +76 -0
- data/lib/karafka/routing/features/consumer_groups/dead_letter_queue.rb +18 -0
- data/lib/karafka/routing/features/consumer_groups/eofed/config.rb +17 -0
- data/lib/karafka/routing/features/consumer_groups/eofed/contracts/topic.rb +39 -0
- data/lib/karafka/routing/features/consumer_groups/eofed/topic.rb +42 -0
- data/lib/karafka/routing/features/consumer_groups/eofed.rb +16 -0
- data/lib/karafka/routing/features/consumer_groups/inline_insights/config.rb +17 -0
- data/lib/karafka/routing/features/consumer_groups/inline_insights/contracts/topic.rb +27 -0
- data/lib/karafka/routing/features/consumer_groups/inline_insights/topic.rb +42 -0
- data/lib/karafka/routing/features/consumer_groups/inline_insights.rb +42 -0
- data/lib/karafka/routing/features/consumer_groups/manual_offset_management/config.rb +17 -0
- data/lib/karafka/routing/features/consumer_groups/manual_offset_management/contracts/topic.rb +27 -0
- data/lib/karafka/routing/features/consumer_groups/manual_offset_management/topic.rb +46 -0
- data/lib/karafka/routing/features/consumer_groups/manual_offset_management.rb +20 -0
- data/lib/karafka/routing/features/consumer_groups.rb +12 -0
- data/lib/karafka/routing/features/declaratives/contracts/topic.rb +4 -19
- data/lib/karafka/routing/features/declaratives/topic.rb +30 -14
- data/lib/karafka/routing/features/deserializers/topic.rb +3 -3
- data/lib/karafka/routing/router.rb +2 -2
- data/lib/karafka/routing/subscription_group.rb +18 -9
- data/lib/karafka/routing/topic.rb +25 -11
- data/lib/karafka/runner.rb +17 -17
- data/lib/karafka/server.rb +28 -6
- data/lib/karafka/setup/attributes_map.rb +2 -0
- data/lib/karafka/setup/config.rb +64 -15
- data/lib/karafka/setup/config_proxy.rb +1 -2
- data/lib/karafka/setup/contracts/config.rb +28 -8
- data/lib/karafka/setup/defaults_injector.rb +10 -0
- data/lib/karafka/status.rb +1 -2
- data/lib/karafka/swarm/liveness_listener.rb +7 -0
- data/lib/karafka/swarm/manager.rb +7 -7
- data/lib/karafka/swarm/node.rb +8 -0
- data/lib/karafka/swarm/supervisor.rb +9 -1
- data/lib/karafka/templates/karafka.rb.erb +11 -5
- data/lib/karafka/version.rb +1 -1
- metadata +237 -224
- data/lib/karafka/connection/rebalance_manager.rb +0 -116
- data/lib/karafka/instrumentation/callbacks/error.rb +0 -52
- data/lib/karafka/instrumentation/callbacks/rebalance.rb +0 -84
- data/lib/karafka/instrumentation/callbacks/statistics.rb +0 -55
- data/lib/karafka/pro/processing/adaptive_iterator/consumer.rb +0 -79
- data/lib/karafka/pro/processing/adaptive_iterator/tracker.rb +0 -92
- data/lib/karafka/pro/processing/collapser.rb +0 -79
- data/lib/karafka/pro/processing/coordinator.rb +0 -197
- data/lib/karafka/pro/processing/coordinators/errors_tracker.rb +0 -119
- data/lib/karafka/pro/processing/coordinators/filters_applier.rb +0 -152
- data/lib/karafka/pro/processing/coordinators/virtual_offset_manager.rb +0 -207
- data/lib/karafka/pro/processing/expansions_selector.rb +0 -52
- data/lib/karafka/pro/processing/filters/delayer.rb +0 -87
- data/lib/karafka/pro/processing/filters/inline_insights_delayer.rb +0 -95
- data/lib/karafka/pro/processing/filters/throttler.rb +0 -101
- data/lib/karafka/pro/processing/filters/virtual_limiter.rb +0 -74
- data/lib/karafka/pro/processing/jobs/eofed_non_blocking.rb +0 -51
- data/lib/karafka/pro/processing/jobs_builder.rb +0 -90
- data/lib/karafka/pro/processing/offset_metadata/consumer.rb +0 -61
- data/lib/karafka/pro/processing/offset_metadata/fetcher.rb +0 -149
- data/lib/karafka/pro/processing/offset_metadata/listener.rb +0 -63
- data/lib/karafka/pro/processing/parallel_segments/filters/base.rb +0 -98
- data/lib/karafka/pro/processing/parallel_segments/filters/default.rb +0 -110
- data/lib/karafka/pro/processing/parallel_segments/filters/mom.rb +0 -91
- data/lib/karafka/pro/processing/periodic_job/consumer.rb +0 -85
- data/lib/karafka/pro/processing/piping/consumer.rb +0 -149
- data/lib/karafka/pro/processing/strategies/aj/dlq_ftr_lrj_mom_vp.rb +0 -94
- data/lib/karafka/pro/processing/strategies/aj/dlq_ftr_mom.rb +0 -87
- data/lib/karafka/pro/processing/strategies/aj/dlq_ftr_mom_vp.rb +0 -85
- data/lib/karafka/pro/processing/strategies/aj/dlq_lrj_mom.rb +0 -81
- data/lib/karafka/pro/processing/strategies/aj/dlq_lrj_mom_vp.rb +0 -85
- data/lib/karafka/pro/processing/strategies/aj/dlq_mom.rb +0 -79
- data/lib/karafka/pro/processing/strategies/aj/dlq_mom_vp.rb +0 -84
- data/lib/karafka/pro/processing/strategies/aj/ftr_lrj_mom_vp.rb +0 -86
- data/lib/karafka/pro/processing/strategies/aj/lrj_mom.rb +0 -54
- data/lib/karafka/pro/processing/strategies/aj/lrj_mom_vp.rb +0 -101
- data/lib/karafka/pro/processing/strategies/base.rb +0 -43
- data/lib/karafka/pro/processing/strategies/default.rb +0 -416
- data/lib/karafka/pro/processing/strategies/dlq/default.rb +0 -280
- data/lib/karafka/pro/processing/strategies/dlq/ftr_lrj.rb +0 -90
- data/lib/karafka/pro/processing/strategies/dlq/ftr_lrj_mom.rb +0 -92
- data/lib/karafka/pro/processing/strategies/dlq/ftr_lrj_mom_vp.rb +0 -60
- data/lib/karafka/pro/processing/strategies/dlq/ftr_lrj_vp.rb +0 -58
- data/lib/karafka/pro/processing/strategies/dlq/ftr_mom.rb +0 -92
- data/lib/karafka/pro/processing/strategies/dlq/ftr_mom_vp.rb +0 -58
- data/lib/karafka/pro/processing/strategies/dlq/ftr_vp.rb +0 -57
- data/lib/karafka/pro/processing/strategies/dlq/lrj_mom.rb +0 -95
- data/lib/karafka/pro/processing/strategies/dlq/lrj_vp.rb +0 -56
- data/lib/karafka/pro/processing/strategies/dlq/mom.rb +0 -91
- data/lib/karafka/pro/processing/strategies/dlq/mom_vp.rb +0 -54
- data/lib/karafka/pro/processing/strategies/dlq/vp.rb +0 -57
- data/lib/karafka/pro/processing/strategies/ftr/default.rb +0 -141
- data/lib/karafka/pro/processing/strategies/ftr/vp.rb +0 -57
- data/lib/karafka/pro/processing/strategies/lrj/default.rb +0 -114
- data/lib/karafka/pro/processing/strategies/lrj/ftr.rb +0 -89
- data/lib/karafka/pro/processing/strategies/lrj/ftr_mom.rb +0 -87
- data/lib/karafka/pro/processing/strategies/lrj/ftr_mom_vp.rb +0 -57
- data/lib/karafka/pro/processing/strategies/lrj/ftr_vp.rb +0 -56
- data/lib/karafka/pro/processing/strategies/lrj/mom.rb +0 -96
- data/lib/karafka/pro/processing/strategies/mom/ftr_vp.rb +0 -54
- data/lib/karafka/pro/processing/strategies/vp/default.rb +0 -192
- data/lib/karafka/pro/processing/strategies.rb +0 -39
- data/lib/karafka/pro/processing/strategy_selector.rb +0 -102
- data/lib/karafka/pro/processing/subscription_groups_coordinator.rb +0 -68
- data/lib/karafka/pro/processing/virtual_partitions/distributors/balanced.rb +0 -77
- data/lib/karafka/pro/routing/features/active_job.rb +0 -43
- data/lib/karafka/pro/routing/features/adaptive_iterator/contracts/topic.rb +0 -89
- data/lib/karafka/pro/routing/features/adaptive_iterator/topic.rb +0 -88
- data/lib/karafka/pro/routing/features/adaptive_iterator.rb +0 -48
- data/lib/karafka/pro/routing/features/dead_letter_queue/contracts/topic.rb +0 -74
- data/lib/karafka/pro/routing/features/dead_letter_queue/topic.rb +0 -68
- data/lib/karafka/pro/routing/features/dead_letter_queue.rb +0 -44
- data/lib/karafka/pro/routing/features/delaying/topic.rb +0 -83
- data/lib/karafka/pro/routing/features/delaying.rb +0 -46
- data/lib/karafka/pro/routing/features/direct_assignments/contracts/topic.rb +0 -123
- data/lib/karafka/pro/routing/features/direct_assignments/subscription_group.rb +0 -95
- data/lib/karafka/pro/routing/features/direct_assignments/topic.rb +0 -95
- data/lib/karafka/pro/routing/features/direct_assignments.rb +0 -42
- data/lib/karafka/pro/routing/features/inline_insights/topic.rb +0 -78
- data/lib/karafka/pro/routing/features/inline_insights.rb +0 -43
- data/lib/karafka/pro/routing/features/long_running_job/config.rb +0 -45
- data/lib/karafka/pro/routing/features/long_running_job/topic.rb +0 -70
- data/lib/karafka/pro/routing/features/multiplexing/contracts/routing.rb +0 -81
- data/lib/karafka/pro/routing/features/multiplexing/contracts/topic.rb +0 -146
- data/lib/karafka/pro/routing/features/multiplexing/proxy.rb +0 -58
- data/lib/karafka/pro/routing/features/multiplexing.rb +0 -83
- data/lib/karafka/pro/routing/features/offset_metadata/config.rb +0 -50
- data/lib/karafka/pro/routing/features/offset_metadata/topic.rb +0 -91
- data/lib/karafka/pro/routing/features/parallel_segments/builder.rb +0 -72
- data/lib/karafka/pro/routing/features/parallel_segments/config.rb +0 -52
- data/lib/karafka/pro/routing/features/parallel_segments/consumer_group.rb +0 -108
- data/lib/karafka/pro/routing/features/patterns/config.rb +0 -71
- data/lib/karafka/pro/routing/features/patterns/consumer_group.rb +0 -89
- data/lib/karafka/pro/routing/features/patterns/contracts/topic.rb +0 -56
- data/lib/karafka/pro/routing/features/patterns/detector.rb +0 -96
- data/lib/karafka/pro/routing/features/patterns/pattern.rb +0 -112
- data/lib/karafka/pro/routing/features/patterns/topic.rb +0 -76
- data/lib/karafka/pro/routing/features/patterns/topics.rb +0 -70
- data/lib/karafka/pro/routing/features/patterns.rb +0 -50
- data/lib/karafka/pro/routing/features/periodic_job/config.rb +0 -54
- data/lib/karafka/pro/routing/features/periodic_job/contracts/topic.rb +0 -59
- data/lib/karafka/pro/routing/features/periodic_job/topic.rb +0 -120
- data/lib/karafka/pro/routing/features/periodic_job.rb +0 -44
- data/lib/karafka/pro/routing/features/recurring_tasks/builder.rb +0 -148
- data/lib/karafka/pro/routing/features/recurring_tasks/config.rb +0 -45
- data/lib/karafka/pro/routing/features/recurring_tasks/topic.rb +0 -70
- data/lib/karafka/pro/routing/features/recurring_tasks.rb +0 -42
- data/lib/karafka/pro/routing/features/scheduled_messages/builder.rb +0 -152
- data/lib/karafka/pro/routing/features/scheduled_messages/config.rb +0 -45
- data/lib/karafka/pro/routing/features/scheduled_messages/contracts/topic.rb +0 -55
- data/lib/karafka/pro/routing/features/scheduled_messages/topic.rb +0 -70
- data/lib/karafka/pro/routing/features/swarm/contracts/routing.rb +0 -92
- data/lib/karafka/pro/routing/features/swarm/contracts/topic.rb +0 -93
- data/lib/karafka/pro/routing/features/swarm/topic.rb +0 -103
- data/lib/karafka/pro/routing/features/swarm.rb +0 -56
- data/lib/karafka/pro/routing/features/virtual_partitions/config.rb +0 -67
- data/lib/karafka/pro/routing/features/virtual_partitions/contracts/topic.rb +0 -73
- data/lib/karafka/pro/routing/features/virtual_partitions/topic.rb +0 -99
- data/lib/karafka/pro/routing/features/virtual_partitions.rb +0 -44
- data/lib/karafka/processing/executor.rb +0 -216
- data/lib/karafka/processing/executors_buffer.rb +0 -90
- data/lib/karafka/processing/expansions_selector.rb +0 -22
- data/lib/karafka/processing/inline_insights/consumer.rb +0 -43
- data/lib/karafka/processing/inline_insights/listener.rb +0 -19
- data/lib/karafka/processing/inline_insights/tracker.rb +0 -129
- data/lib/karafka/processing/jobs/consume.rb +0 -47
- data/lib/karafka/processing/jobs/eofed.rb +0 -29
- data/lib/karafka/processing/jobs/idle.rb +0 -31
- data/lib/karafka/processing/jobs/revoked.rb +0 -29
- data/lib/karafka/processing/jobs/shutdown.rb +0 -30
- data/lib/karafka/processing/jobs_builder.rb +0 -34
- data/lib/karafka/processing/strategies/aj_dlq_mom.rb +0 -44
- data/lib/karafka/processing/strategies/aj_mom.rb +0 -21
- data/lib/karafka/processing/strategies/base.rb +0 -61
- data/lib/karafka/processing/strategies/default.rb +0 -214
- data/lib/karafka/processing/strategies/dlq.rb +0 -153
- data/lib/karafka/processing/strategies/dlq_mom.rb +0 -68
- data/lib/karafka/processing/strategies/mom.rb +0 -29
- data/lib/karafka/processing/workers_batch.rb +0 -29
- data/lib/karafka/routing/features/active_job/builder.rb +0 -33
- data/lib/karafka/routing/features/active_job/config.rb +0 -15
- data/lib/karafka/routing/features/active_job/contracts/topic.rb +0 -42
- data/lib/karafka/routing/features/active_job/proxy.rb +0 -14
- data/lib/karafka/routing/features/active_job/topic.rb +0 -48
- data/lib/karafka/routing/features/active_job.rb +0 -13
- data/lib/karafka/routing/features/dead_letter_queue/config.rb +0 -37
- data/lib/karafka/routing/features/dead_letter_queue/contracts/topic.rb +0 -56
- data/lib/karafka/routing/features/dead_letter_queue/topic.rb +0 -74
- data/lib/karafka/routing/features/dead_letter_queue.rb +0 -16
- data/lib/karafka/routing/features/declaratives/config.rb +0 -18
- data/lib/karafka/routing/features/eofed/config.rb +0 -15
- data/lib/karafka/routing/features/eofed/contracts/topic.rb +0 -37
- data/lib/karafka/routing/features/eofed/topic.rb +0 -40
- data/lib/karafka/routing/features/eofed.rb +0 -14
- data/lib/karafka/routing/features/inline_insights/config.rb +0 -15
- data/lib/karafka/routing/features/inline_insights/contracts/topic.rb +0 -25
- data/lib/karafka/routing/features/inline_insights/topic.rb +0 -40
- data/lib/karafka/routing/features/inline_insights.rb +0 -40
- data/lib/karafka/routing/features/manual_offset_management/config.rb +0 -15
- data/lib/karafka/routing/features/manual_offset_management/contracts/topic.rb +0 -25
- data/lib/karafka/routing/features/manual_offset_management/topic.rb +0 -44
- data/lib/karafka/routing/features/manual_offset_management.rb +0 -18
|
@@ -3,12 +3,22 @@
|
|
|
3
3
|
module Karafka
|
|
4
4
|
module Routing
|
|
5
5
|
# Topic stores all the details on how we should interact with Kafka given topic.
|
|
6
|
-
# It belongs to a
|
|
6
|
+
# It belongs to a group as from 0.6 all the topics can work in the same group
|
|
7
7
|
# It is a part of Karafka's DSL.
|
|
8
|
+
#
|
|
9
|
+
# @note `#group` is the polymorphic reference to the owning group. Today this is always a
|
|
10
|
+
# {ConsumerGroup}, but the accessor is named generically in preparation for additional group
|
|
11
|
+
# types (e.g. KIP-932 share groups). `#consumer_group` is kept as an alias for backwards
|
|
12
|
+
# compatibility.
|
|
8
13
|
class Topic
|
|
9
|
-
attr_reader :id, :name, :
|
|
14
|
+
attr_reader :id, :name, :group
|
|
10
15
|
attr_writer :consumer
|
|
11
16
|
|
|
17
|
+
# Backwards compatible alias for `#group`. Kept purely for compatibility — this is an
|
|
18
|
+
# unconditional alias and performs no type validation, so callers should prefer `#group`
|
|
19
|
+
# once additional group types (e.g. KIP-932 share groups) land.
|
|
20
|
+
alias_method :consumer_group, :group
|
|
21
|
+
|
|
12
22
|
attr_accessor :subscription_group_details
|
|
13
23
|
|
|
14
24
|
# Full subscription group reference can be built only when we have knowledge about the
|
|
@@ -30,16 +40,17 @@ module Karafka
|
|
|
30
40
|
private_constant :INHERITABLE_ATTRIBUTES
|
|
31
41
|
|
|
32
42
|
# @param name [String, Symbol] name of a topic on which we want to listen
|
|
33
|
-
# @param
|
|
34
|
-
|
|
43
|
+
# @param group [Karafka::Routing::ConsumerGroup] owning group of this topic. Polymorphic
|
|
44
|
+
# placeholder for future group types (e.g. share groups); today always a ConsumerGroup.
|
|
45
|
+
def initialize(name, group)
|
|
35
46
|
@name = name.to_s
|
|
36
|
-
@
|
|
47
|
+
@group = group
|
|
37
48
|
@attributes = {}
|
|
38
49
|
@active = true
|
|
39
|
-
# @note We use identifier related to the
|
|
40
|
-
#
|
|
41
|
-
#
|
|
42
|
-
@id = "#{
|
|
50
|
+
# @note We use identifier related to the group that owns a topic, because from Karafka 0.6
|
|
51
|
+
# we can handle multiple Kafka instances with the same process and we can have same
|
|
52
|
+
# topic name across multiple groups
|
|
53
|
+
@id = "#{group.id}_#{@name}"
|
|
43
54
|
@consumer = nil
|
|
44
55
|
@active_assigned = false
|
|
45
56
|
@subscription_group_details = nil
|
|
@@ -133,7 +144,7 @@ module Karafka
|
|
|
133
144
|
end
|
|
134
145
|
|
|
135
146
|
# @return [Hash] hash with all the topic attributes
|
|
136
|
-
# @note This is being used when we validate the
|
|
147
|
+
# @note This is being used when we validate the group and its topics
|
|
137
148
|
def to_h
|
|
138
149
|
map = INHERITABLE_ATTRIBUTES.map do |attribute|
|
|
139
150
|
[attribute, public_send(attribute)]
|
|
@@ -144,7 +155,10 @@ module Karafka
|
|
|
144
155
|
name: name,
|
|
145
156
|
active: active?,
|
|
146
157
|
consumer: consumer,
|
|
147
|
-
|
|
158
|
+
group_id: group.id,
|
|
159
|
+
# Kept as a reference alongside `group_id` for backwards compatibility. Will be removed
|
|
160
|
+
# in Karafka 3.0.
|
|
161
|
+
consumer_group_id: group.id,
|
|
148
162
|
subscription_group_details: subscription_group_details
|
|
149
163
|
).freeze
|
|
150
164
|
end
|
data/lib/karafka/runner.rb
CHANGED
|
@@ -4,20 +4,20 @@ module Karafka
|
|
|
4
4
|
# Class used to run the Karafka listeners in separate threads
|
|
5
5
|
class Runner
|
|
6
6
|
include Helpers::ConfigImporter.new(
|
|
7
|
-
worker_thread_priority: %i[worker_thread_priority],
|
|
8
7
|
manager: %i[internal connection manager],
|
|
9
|
-
conductor: %i[internal connection conductor]
|
|
10
|
-
jobs_queue_class: %i[internal processing jobs_queue_class]
|
|
8
|
+
conductor: %i[internal connection conductor]
|
|
11
9
|
)
|
|
12
10
|
|
|
13
11
|
# Starts listening on all the listeners asynchronously and handles the jobs queue closing
|
|
14
12
|
# after listeners are done with their work.
|
|
15
13
|
def call
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
jobs_queue = Karafka::Server.jobs_queue
|
|
15
|
+
workers = Karafka::Server.workers
|
|
16
|
+
|
|
17
|
+
# Wire up the circular dependency between pool and queue
|
|
18
|
+
workers.jobs_queue = jobs_queue
|
|
19
|
+
jobs_queue.pool = workers
|
|
19
20
|
|
|
20
|
-
workers = Processing::WorkersBatch.new(jobs_queue)
|
|
21
21
|
listeners = Connection::ListenersBatch.new(jobs_queue)
|
|
22
22
|
|
|
23
23
|
# We mark it prior to delegating to the manager as manager will have to start at least one
|
|
@@ -27,17 +27,12 @@ module Karafka
|
|
|
27
27
|
# Register all the listeners so they can be started and managed
|
|
28
28
|
manager.register(listeners)
|
|
29
29
|
|
|
30
|
-
workers.each_with_index do |worker, i|
|
|
31
|
-
worker.async_call(
|
|
32
|
-
"karafka.worker##{i}",
|
|
33
|
-
worker_thread_priority
|
|
34
|
-
)
|
|
35
|
-
end
|
|
36
|
-
|
|
37
30
|
# We aggregate threads here for a supervised shutdown process
|
|
38
|
-
Karafka::Server.workers = workers
|
|
39
31
|
Karafka::Server.listeners = listeners
|
|
40
|
-
|
|
32
|
+
|
|
33
|
+
# Start worker threads after listeners are created so a failure in the boot steps above
|
|
34
|
+
# does not leave live worker threads blocked on an open queue.
|
|
35
|
+
workers.scale(Karafka::App.config.concurrency)
|
|
41
36
|
|
|
42
37
|
until manager.done?
|
|
43
38
|
conductor.wait
|
|
@@ -56,7 +51,7 @@ module Karafka
|
|
|
56
51
|
# with everything. One thing worth keeping in mind though: It is the end user responsibility
|
|
57
52
|
# to handle the shutdown detection in their long-running processes. Otherwise if timeout
|
|
58
53
|
# is exceeded, there will be a forced shutdown.
|
|
59
|
-
workers.
|
|
54
|
+
workers.join
|
|
60
55
|
# If anything crashes here, we need to raise the error and crush the runner because it means
|
|
61
56
|
# that something terrible happened
|
|
62
57
|
rescue => e
|
|
@@ -67,6 +62,11 @@ module Karafka
|
|
|
67
62
|
type: "runner.call.error"
|
|
68
63
|
)
|
|
69
64
|
Karafka::App.stop!
|
|
65
|
+
|
|
66
|
+
# Clean up workers so we don't leak threads blocked on the queue
|
|
67
|
+
jobs_queue.close
|
|
68
|
+
workers.join
|
|
69
|
+
|
|
70
70
|
raise e
|
|
71
71
|
end
|
|
72
72
|
end
|
data/lib/karafka/server.rb
CHANGED
|
@@ -10,7 +10,8 @@ module Karafka
|
|
|
10
10
|
shutdown_timeout: %i[shutdown_timeout],
|
|
11
11
|
forceful_exit_code: %i[internal forceful_exit_code],
|
|
12
12
|
forceful_shutdown_wait: %i[internal forceful_shutdown_wait],
|
|
13
|
-
process: %i[internal process]
|
|
13
|
+
process: %i[internal process],
|
|
14
|
+
jobs_queue_class: %i[internal processing jobs_queue_class]
|
|
14
15
|
)
|
|
15
16
|
|
|
16
17
|
class << self
|
|
@@ -39,8 +40,7 @@ module Karafka
|
|
|
39
40
|
|
|
40
41
|
# Method which runs app
|
|
41
42
|
def run
|
|
42
|
-
|
|
43
|
-
self.workers = []
|
|
43
|
+
prepare
|
|
44
44
|
|
|
45
45
|
# We need to validate this prior to running because it may be executed also from the
|
|
46
46
|
# embedded
|
|
@@ -93,6 +93,7 @@ module Karafka
|
|
|
93
93
|
# @note We don't need to sleep because Karafka::Runner is locking and waiting to finish loop
|
|
94
94
|
# (and it won't happen until we explicitly want to stop)
|
|
95
95
|
def start
|
|
96
|
+
prepare
|
|
96
97
|
Karafka::Runner.new.call
|
|
97
98
|
end
|
|
98
99
|
|
|
@@ -117,7 +118,7 @@ module Karafka
|
|
|
117
118
|
# We divide it by 1000 because we use time in ms.
|
|
118
119
|
((timeout / 1_000) * (1 / supervision_sleep)).to_i.times do
|
|
119
120
|
all_listeners_stopped = listeners.all?(&:stopped?)
|
|
120
|
-
all_workers_stopped = workers.
|
|
121
|
+
all_workers_stopped = workers.stopped?
|
|
121
122
|
|
|
122
123
|
return if all_listeners_stopped && all_workers_stopped
|
|
123
124
|
|
|
@@ -127,7 +128,7 @@ module Karafka
|
|
|
127
128
|
raise Errors::ForcefulShutdownError
|
|
128
129
|
rescue Errors::ForcefulShutdownError => e
|
|
129
130
|
active_listeners = listeners.select(&:active?)
|
|
130
|
-
alive_workers = workers.
|
|
131
|
+
alive_workers = workers.alive
|
|
131
132
|
|
|
132
133
|
# Collect details about subscription groups that still have jobs in processing
|
|
133
134
|
in_processing = jobs_queue ? jobs_queue.in_processing : {}
|
|
@@ -143,7 +144,7 @@ module Karafka
|
|
|
143
144
|
)
|
|
144
145
|
|
|
145
146
|
# We're done waiting, lets kill them!
|
|
146
|
-
workers.
|
|
147
|
+
workers.terminate
|
|
147
148
|
listeners.active.each(&:terminate)
|
|
148
149
|
|
|
149
150
|
# We always need to shutdown clients to make sure we do not force the GC to close consumer.
|
|
@@ -186,9 +187,26 @@ module Karafka
|
|
|
186
187
|
WaterDrop::ConnectionPool.close
|
|
187
188
|
|
|
188
189
|
Karafka::App.terminate!
|
|
190
|
+
|
|
191
|
+
# Allow prepare to run again if the server is restarted (e.g. reset_status in tests,
|
|
192
|
+
# or embedded re-start).
|
|
193
|
+
@prepared = false
|
|
189
194
|
end
|
|
190
195
|
end
|
|
191
196
|
|
|
197
|
+
# Initializes listeners, jobs queue and workers pool.
|
|
198
|
+
# Called from both {.run} (standalone) and {.start} (embedded). Guarded so it runs only
|
|
199
|
+
# once even when {.run} delegates to {.start}.
|
|
200
|
+
def prepare
|
|
201
|
+
return if @prepared
|
|
202
|
+
|
|
203
|
+
@prepared = true
|
|
204
|
+
|
|
205
|
+
self.listeners = []
|
|
206
|
+
self.jobs_queue = jobs_queue_class.new
|
|
207
|
+
self.workers = Processing::WorkersPool.new
|
|
208
|
+
end
|
|
209
|
+
|
|
192
210
|
# Quiets the Karafka server.
|
|
193
211
|
#
|
|
194
212
|
# Karafka will stop processing but won't quit the consumer group, so no rebalance will be
|
|
@@ -206,5 +224,9 @@ module Karafka
|
|
|
206
224
|
self.execution_mode = ExecutionMode.new(:standalone)
|
|
207
225
|
|
|
208
226
|
self.id = SecureRandom.hex(6)
|
|
227
|
+
|
|
228
|
+
# We need to have it set always for cases where it would be references outside of the Karafka
|
|
229
|
+
# process
|
|
230
|
+
self.workers = Processing::WorkersPool.new
|
|
209
231
|
end
|
|
210
232
|
end
|
|
@@ -125,6 +125,7 @@ module Karafka
|
|
|
125
125
|
sasl.oauthbearer.metadata.authentication.type
|
|
126
126
|
sasl.oauthbearer.method
|
|
127
127
|
sasl.oauthbearer.scope
|
|
128
|
+
sasl.oauthbearer.sub.claim.name
|
|
128
129
|
sasl.oauthbearer.token.endpoint.url
|
|
129
130
|
sasl.password
|
|
130
131
|
sasl.username
|
|
@@ -283,6 +284,7 @@ module Karafka
|
|
|
283
284
|
sasl.oauthbearer.metadata.authentication.type
|
|
284
285
|
sasl.oauthbearer.method
|
|
285
286
|
sasl.oauthbearer.scope
|
|
287
|
+
sasl.oauthbearer.sub.claim.name
|
|
286
288
|
sasl.oauthbearer.token.endpoint.url
|
|
287
289
|
sasl.password
|
|
288
290
|
sasl.username
|
data/lib/karafka/setup/config.rb
CHANGED
|
@@ -225,6 +225,12 @@ module Karafka
|
|
|
225
225
|
setting :activity_manager, default: Routing::ActivityManager.new
|
|
226
226
|
end
|
|
227
227
|
|
|
228
|
+
# Namespace for declarative topics management (infrastructure-as-code)
|
|
229
|
+
setting :declaratives do
|
|
230
|
+
# option builder [Karafka::Declaratives::Builder] builder instance
|
|
231
|
+
setting :builder, default: Declaratives::Builder.new
|
|
232
|
+
end
|
|
233
|
+
|
|
228
234
|
# Namespace for internal connection related settings
|
|
229
235
|
setting :connection do
|
|
230
236
|
# Manages starting up and stopping Kafka connections
|
|
@@ -305,24 +311,30 @@ module Karafka
|
|
|
305
311
|
setting :jobs_queue_class, default: Processing::JobsQueue
|
|
306
312
|
# option scheduler [Object] scheduler we will be using
|
|
307
313
|
setting :scheduler_class, default: Processing::Schedulers::Default
|
|
308
|
-
# option jobs_builder [Object] jobs builder we want to use
|
|
309
|
-
setting :jobs_builder, default: Processing::JobsBuilder.new
|
|
310
|
-
# option coordinator [Class] work coordinator we want to user for processing coordination
|
|
311
|
-
setting :coordinator_class, default: Processing::Coordinator
|
|
312
|
-
# option errors_tracker_class [Class, nil] errors tracker that is used by the coordinator
|
|
313
|
-
# for granular error tracking. `nil` for OSS as it is not in use.
|
|
314
|
-
setting :errors_tracker_class, default: nil
|
|
315
|
-
# option partitioner_class [Class] partitioner we use against a batch of data
|
|
316
|
-
setting :partitioner_class, default: Processing::Partitioner
|
|
317
|
-
# option strategy_selector [Object] processing strategy selector to be used
|
|
318
|
-
setting :strategy_selector, default: Processing::StrategySelector.new
|
|
319
|
-
# option expansions_selector [Object] processing expansions selector to be used
|
|
320
|
-
setting :expansions_selector, default: Processing::ExpansionsSelector.new
|
|
321
|
-
# option [Class] executor class
|
|
322
|
-
setting :executor_class, default: Processing::Executor
|
|
323
314
|
# option worker_job_call_wrapper [Proc, false] callable object that will be used to wrap
|
|
324
315
|
# the worker execution of a job or false if no wrapper needed
|
|
325
316
|
setting :worker_job_call_wrapper, default: false
|
|
317
|
+
|
|
318
|
+
# Consumer-group-specific processing defaults. When share groups land, a parallel
|
|
319
|
+
# `share_groups` namespace will hold their equivalents.
|
|
320
|
+
setting :consumer_groups do
|
|
321
|
+
# option jobs_builder [Object] jobs builder we want to use
|
|
322
|
+
setting :jobs_builder, default: Processing::ConsumerGroups::JobsBuilder.new
|
|
323
|
+
# option coordinator [Class] work coordinator we want to use for processing
|
|
324
|
+
# coordination
|
|
325
|
+
setting :coordinator_class, default: Processing::ConsumerGroups::Coordinator
|
|
326
|
+
# option errors_tracker_class [Class, nil] errors tracker that is used by the
|
|
327
|
+
# coordinator for granular error tracking. `nil` for OSS as it is not in use.
|
|
328
|
+
setting :errors_tracker_class, default: nil
|
|
329
|
+
# option partitioner_class [Class] partitioner we use against a batch of data
|
|
330
|
+
setting :partitioner_class, default: Processing::ConsumerGroups::Partitioner
|
|
331
|
+
# option strategy_selector [Object] processing strategy selector to be used
|
|
332
|
+
setting :strategy_selector, default: Processing::ConsumerGroups::StrategySelector.new
|
|
333
|
+
# option expansions_selector [Object] processing expansions selector to be used
|
|
334
|
+
setting :expansions_selector, default: Processing::ConsumerGroups::ExpansionsSelector.new
|
|
335
|
+
# option [Class] executor class
|
|
336
|
+
setting :executor_class, default: Processing::ConsumerGroups::Executor
|
|
337
|
+
end
|
|
326
338
|
end
|
|
327
339
|
|
|
328
340
|
# Things related to operating on messages
|
|
@@ -428,6 +440,11 @@ module Karafka
|
|
|
428
440
|
|
|
429
441
|
configure_components(proxy)
|
|
430
442
|
|
|
443
|
+
# Install backwards-compatible forwarding so that gems (e.g. karafka-testing) that
|
|
444
|
+
# still access config.internal.processing.strategy_selector (etc.) keep working after
|
|
445
|
+
# the move to config.internal.processing.consumer_groups.*
|
|
446
|
+
install_processing_cg_forwarders(config)
|
|
447
|
+
|
|
431
448
|
# Refreshes the references that are cached that might have been changed by the config
|
|
432
449
|
Karafka.refresh!
|
|
433
450
|
|
|
@@ -446,6 +463,38 @@ module Karafka
|
|
|
446
463
|
|
|
447
464
|
private
|
|
448
465
|
|
|
466
|
+
# Installs forwarding reader methods on the processing config node so that the old
|
|
467
|
+
# (pre-nesting) paths like `config.internal.processing.strategy_selector` still resolve
|
|
468
|
+
# by delegating to `config.internal.processing.consumer_groups.strategy_selector`.
|
|
469
|
+
# This keeps external gems (e.g. karafka-testing) working until they migrate.
|
|
470
|
+
#
|
|
471
|
+
# @param config [Karafka::Core::Configurable::Node] root config node
|
|
472
|
+
def install_processing_cg_forwarders(config)
|
|
473
|
+
processing = config.internal.processing
|
|
474
|
+
cg_node = processing.consumer_groups
|
|
475
|
+
|
|
476
|
+
%i[
|
|
477
|
+
jobs_builder
|
|
478
|
+
coordinator_class
|
|
479
|
+
errors_tracker_class
|
|
480
|
+
partitioner_class
|
|
481
|
+
strategy_selector
|
|
482
|
+
expansions_selector
|
|
483
|
+
executor_class
|
|
484
|
+
].each do |setting_name|
|
|
485
|
+
writer = :"#{setting_name}="
|
|
486
|
+
|
|
487
|
+
# Remove previous definitions (if setup runs more than once) to avoid
|
|
488
|
+
# "method redefined" warnings that spec_helper promotes to errors
|
|
489
|
+
sc = processing.singleton_class
|
|
490
|
+
sc.remove_method(setting_name) if processing.respond_to?(setting_name)
|
|
491
|
+
sc.remove_method(writer) if processing.respond_to?(writer)
|
|
492
|
+
|
|
493
|
+
processing.define_singleton_method(setting_name) { cg_node.public_send(setting_name) }
|
|
494
|
+
processing.define_singleton_method(writer) { |val| cg_node.public_send(writer, val) }
|
|
495
|
+
end
|
|
496
|
+
end
|
|
497
|
+
|
|
449
498
|
# Sets up all the components that are based on the user configuration
|
|
450
499
|
# @param config_proxy [ConfigProxy] the configuration proxy containing deferred setup
|
|
451
500
|
# blocks
|
|
@@ -45,8 +45,7 @@ module Karafka
|
|
|
45
45
|
# Without the proxy, we'd have two problems:
|
|
46
46
|
#
|
|
47
47
|
# 1. **Permanent API pollution**: Adding a `producer` method to config that accepts blocks
|
|
48
|
-
# would change its permanent API, even though this functionality is only needed during
|
|
49
|
-
# setup.
|
|
48
|
+
# would change its permanent API, even though this functionality is only needed during setup.
|
|
50
49
|
#
|
|
51
50
|
# 2. **Timing issues**: The producer doesn't exist yet when the user's setup block runs.
|
|
52
51
|
# The producer is created in `configure_components` after all user configuration is
|
|
@@ -8,7 +8,7 @@ module Karafka
|
|
|
8
8
|
#
|
|
9
9
|
# @note There are many more configuration options inside of the
|
|
10
10
|
# `Karafka::Setup::Config` model, but we don't validate them here as they are
|
|
11
|
-
# validated per each route (topic +
|
|
11
|
+
# validated per each route (topic + group) because they can be overwritten,
|
|
12
12
|
# so we validate all of that once all the routes are defined and ready.
|
|
13
13
|
class Config < Karafka::Contracts::Base
|
|
14
14
|
configure do |config|
|
|
@@ -121,16 +121,19 @@ module Karafka
|
|
|
121
121
|
end
|
|
122
122
|
|
|
123
123
|
nested(:processing) do
|
|
124
|
-
required(:jobs_builder) { |val| !val.nil? }
|
|
125
124
|
required(:jobs_queue_class) { |val| !val.nil? }
|
|
126
125
|
required(:scheduler_class) { |val| !val.nil? }
|
|
127
|
-
required(:coordinator_class) { |val| !val.nil? }
|
|
128
|
-
required(:errors_tracker_class) { |val| val.nil? || val.is_a?(Class) }
|
|
129
|
-
required(:partitioner_class) { |val| !val.nil? }
|
|
130
|
-
required(:strategy_selector) { |val| !val.nil? }
|
|
131
|
-
required(:expansions_selector) { |val| !val.nil? }
|
|
132
|
-
required(:executor_class) { |val| !val.nil? }
|
|
133
126
|
required(:worker_job_call_wrapper) { |val| val == false || val.respond_to?(:wrap) }
|
|
127
|
+
|
|
128
|
+
nested(:consumer_groups) do
|
|
129
|
+
required(:jobs_builder) { |val| !val.nil? }
|
|
130
|
+
required(:coordinator_class) { |val| !val.nil? }
|
|
131
|
+
required(:errors_tracker_class) { |val| val.nil? || val.is_a?(Class) }
|
|
132
|
+
required(:partitioner_class) { |val| !val.nil? }
|
|
133
|
+
required(:strategy_selector) { |val| !val.nil? }
|
|
134
|
+
required(:expansions_selector) { |val| !val.nil? }
|
|
135
|
+
required(:executor_class) { |val| !val.nil? }
|
|
136
|
+
end
|
|
134
137
|
end
|
|
135
138
|
|
|
136
139
|
nested(:active_job) do
|
|
@@ -170,6 +173,23 @@ module Karafka
|
|
|
170
173
|
detected_errors
|
|
171
174
|
end
|
|
172
175
|
|
|
176
|
+
# Certain kafka settings are managed internally by Karafka and should not be set
|
|
177
|
+
# directly. Setting them manually may cause misbehaviours and other unexpected issues.
|
|
178
|
+
virtual do |data, errors|
|
|
179
|
+
next unless errors.empty?
|
|
180
|
+
|
|
181
|
+
managed_keys = Karafka::Setup::DefaultsInjector.managed_keys
|
|
182
|
+
detected_errors = []
|
|
183
|
+
|
|
184
|
+
data.fetch(:kafka).each_key do |key|
|
|
185
|
+
next unless managed_keys.include?(key)
|
|
186
|
+
|
|
187
|
+
detected_errors << [[:kafka, key], :managed_key_not_supported]
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
detected_errors
|
|
191
|
+
end
|
|
192
|
+
|
|
173
193
|
virtual do |data, errors|
|
|
174
194
|
next unless errors.empty?
|
|
175
195
|
|
|
@@ -52,6 +52,16 @@ module Karafka
|
|
|
52
52
|
)
|
|
53
53
|
|
|
54
54
|
class << self
|
|
55
|
+
# Kafka settings that are managed internally by Karafka and should not be set directly
|
|
56
|
+
# by users. Setting them manually may cause misbehaviours and other unexpected issues.
|
|
57
|
+
#
|
|
58
|
+
# @return [Set<Symbol>] set of managed kafka setting keys
|
|
59
|
+
def managed_keys
|
|
60
|
+
@managed_keys ||= Set[
|
|
61
|
+
:"statistics.unassigned.include"
|
|
62
|
+
]
|
|
63
|
+
end
|
|
64
|
+
|
|
55
65
|
# Propagates the kafka setting defaults unless they are already present for consumer config
|
|
56
66
|
# This makes it easier to set some values that users usually don't change but still allows
|
|
57
67
|
# them to overwrite the whole hash if they want to
|
data/lib/karafka/status.rb
CHANGED
|
@@ -19,6 +19,13 @@ module Karafka
|
|
|
19
19
|
@mutex = Mutex.new
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
+
# Report liveness before the first fetch loop iteration so the supervisor gets an initial
|
|
23
|
+
# healthy report even if the first consumption takes longer than the report timeout.
|
|
24
|
+
# @param _event [Karafka::Core::Monitoring::Event]
|
|
25
|
+
def on_connection_listener_before_fetch_loop(_event)
|
|
26
|
+
report_liveness
|
|
27
|
+
end
|
|
28
|
+
|
|
22
29
|
# Report from the fetch loop at the top of each iteration
|
|
23
30
|
# @param _event [Karafka::Core::Monitoring::Event]
|
|
24
31
|
def on_connection_listener_fetch_loop(_event)
|
|
@@ -19,12 +19,12 @@ module Karafka
|
|
|
19
19
|
node_restart_timeout: %i[internal swarm node_restart_timeout]
|
|
20
20
|
)
|
|
21
21
|
|
|
22
|
-
# Status we issue when we decide to shutdown
|
|
22
|
+
# Status we issue when we decide to shutdown a non-reporting node
|
|
23
23
|
# We use -1 because nodes are expected to report 0+ statuses and we can use negative numbers
|
|
24
24
|
# for non-node based statuses
|
|
25
|
-
|
|
25
|
+
NOT_REPORTING_SHUTDOWN_STATUS = -1
|
|
26
26
|
|
|
27
|
-
private_constant :
|
|
27
|
+
private_constant :NOT_REPORTING_SHUTDOWN_STATUS
|
|
28
28
|
|
|
29
29
|
# @return [Array<Node>] All nodes that manager manages
|
|
30
30
|
attr_reader :nodes
|
|
@@ -84,7 +84,7 @@ module Karafka
|
|
|
84
84
|
if node.alive?
|
|
85
85
|
next if terminate_if_hanging(statuses, node)
|
|
86
86
|
next if stop_if_not_healthy(statuses, node)
|
|
87
|
-
next if
|
|
87
|
+
next if stop_if_not_reporting(statuses, node)
|
|
88
88
|
else
|
|
89
89
|
next if cleanup_one(statuses, node)
|
|
90
90
|
next if restart_after_timeout(statuses, node)
|
|
@@ -144,12 +144,12 @@ module Karafka
|
|
|
144
144
|
end
|
|
145
145
|
end
|
|
146
146
|
|
|
147
|
-
# If node stopped
|
|
147
|
+
# If node stopped reporting, starts the stopping procedure.
|
|
148
148
|
#
|
|
149
149
|
# @param statuses [Hash] hash with statuses transitions with times
|
|
150
150
|
# @param node [Swarm::Node] node we're checking
|
|
151
151
|
# @return [Boolean] should it be the last action taken on this node in this run
|
|
152
|
-
def
|
|
152
|
+
def stop_if_not_reporting(statuses, node)
|
|
153
153
|
# Do nothing if already stopping
|
|
154
154
|
return true if statuses.key?(:stop)
|
|
155
155
|
# Do nothing if we've received status update recently enough
|
|
@@ -160,7 +160,7 @@ module Karafka
|
|
|
160
160
|
"swarm.manager.stopping",
|
|
161
161
|
caller: self,
|
|
162
162
|
node: node,
|
|
163
|
-
status:
|
|
163
|
+
status: NOT_REPORTING_SHUTDOWN_STATUS
|
|
164
164
|
) do
|
|
165
165
|
node.stop
|
|
166
166
|
statuses[:stop] = monotonic_now
|
data/lib/karafka/swarm/node.rb
CHANGED
|
@@ -45,6 +45,14 @@ module Karafka
|
|
|
45
45
|
# - recreates producer and web producer
|
|
46
46
|
# @note Parent API
|
|
47
47
|
def start
|
|
48
|
+
# Close the previous reader pipe if it exists to prevent FD leaks on node restarts.
|
|
49
|
+
# Without this, each restart orphans the old reader pipe in the supervisor, and forked
|
|
50
|
+
# children inherit all accumulated leaked FDs.
|
|
51
|
+
begin
|
|
52
|
+
@reader&.close
|
|
53
|
+
rescue IOError
|
|
54
|
+
nil
|
|
55
|
+
end
|
|
48
56
|
@reader, @writer = IO.pipe
|
|
49
57
|
# Reset alive status when starting/restarting a node
|
|
50
58
|
# nil means unknown status - will check with waitpid
|
|
@@ -30,7 +30,15 @@ module Karafka
|
|
|
30
30
|
# to reach out nodes and be processed to start the shutdown flow. Because of that and
|
|
31
31
|
# because we always want to give all nodes all the time of `shutdown_timeout` they are
|
|
32
32
|
# expected to have, we add this just to compensate.
|
|
33
|
-
|
|
33
|
+
#
|
|
34
|
+
# Beyond signal propagation, child nodes also need a window after their own graceful
|
|
35
|
+
# `shutdown_timeout` to actually exit the process (run `at_exit` handlers, finalize
|
|
36
|
+
# librdkafka handles, close pools, etc.). On CI (especially macOS) the effective loop
|
|
37
|
+
# duration is noticeably longer than the nominal budget because `sleep` granularity and
|
|
38
|
+
# the per-iteration `waitpid` cost stretch each 0.1s tick. A too-tight grace period
|
|
39
|
+
# causes the supervisor to raise `ForcefulShutdownError` while a node is still in its
|
|
40
|
+
# final cleanup phase, which manifests as flaky shutdowns in swarm integration tests.
|
|
41
|
+
SHUTDOWN_GRACE_PERIOD = 15_000
|
|
34
42
|
|
|
35
43
|
private_constant :SHUTDOWN_GRACE_PERIOD
|
|
36
44
|
|
|
@@ -94,14 +94,20 @@ class KarafkaApp < Karafka::App
|
|
|
94
94
|
# active_job_topic :default
|
|
95
95
|
<% end -%>
|
|
96
96
|
topic :example do
|
|
97
|
-
# Uncomment this if you want Karafka to manage your topics configuration
|
|
98
|
-
# Managing topics configuration via routing will allow you to ensure config consistency
|
|
99
|
-
# across multiple environments
|
|
100
|
-
#
|
|
101
|
-
# config(partitions: 2, 'cleanup.policy': 'compact')
|
|
102
97
|
consumer ExampleConsumer
|
|
103
98
|
end
|
|
104
99
|
end
|
|
100
|
+
|
|
101
|
+
# Uncomment this if you want Karafka to manage your topics configuration
|
|
102
|
+
# Declarative topics allow you to ensure topic config consistency across multiple environments
|
|
103
|
+
#
|
|
104
|
+
# declaratives.draw do
|
|
105
|
+
# topic :example do
|
|
106
|
+
# partitions 2
|
|
107
|
+
# replication_factor 1
|
|
108
|
+
# config 'cleanup.policy': 'compact'
|
|
109
|
+
# end
|
|
110
|
+
# end
|
|
105
111
|
end
|
|
106
112
|
|
|
107
113
|
# Karafka now features a Web UI!
|
data/lib/karafka/version.rb
CHANGED