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
data/lib/karafka/admin.rb
CHANGED
|
@@ -38,6 +38,21 @@ module Karafka
|
|
|
38
38
|
@custom_kafka = kafka
|
|
39
39
|
end
|
|
40
40
|
|
|
41
|
+
# No-op close to normalize the API surface.
|
|
42
|
+
#
|
|
43
|
+
# Each admin operation currently opens and closes its own underlying rdkafka admin instance
|
|
44
|
+
# internally, so there is nothing to release at the `Karafka::Admin` level right now. This
|
|
45
|
+
# method exists so that callers who hold an instance and call `#close` on it (matching the
|
|
46
|
+
# pattern of other closeable resources) do not raise `NoMethodError`.
|
|
47
|
+
#
|
|
48
|
+
# In the future, `Karafka::Admin` is planned to be refactored to reuse a single rdkafka admin
|
|
49
|
+
# instance across multiple operations rather than creating and tearing one down per call. When
|
|
50
|
+
# that happens, this method will need to release that shared instance. The no-op is here now
|
|
51
|
+
# so that all callers are already written against the correct API and require no changes when
|
|
52
|
+
# the real implementation lands.
|
|
53
|
+
def close
|
|
54
|
+
end
|
|
55
|
+
|
|
41
56
|
class << self
|
|
42
57
|
# Delegate topic-related operations to Topics class
|
|
43
58
|
|
|
@@ -80,18 +95,25 @@ module Karafka
|
|
|
80
95
|
new.read_watermark_offsets(name_or_hash, partition)
|
|
81
96
|
end
|
|
82
97
|
|
|
98
|
+
# @param topic_partition_offsets [Hash{String => Array<Hash>}] topics with partition specs
|
|
99
|
+
# @param isolation_level [Integer, nil] optional isolation level constant
|
|
100
|
+
# @see Topics.read_partition_offsets
|
|
101
|
+
def read_partition_offsets(topic_partition_offsets, isolation_level: nil)
|
|
102
|
+
new.read_partition_offsets(topic_partition_offsets, isolation_level: isolation_level)
|
|
103
|
+
end
|
|
104
|
+
|
|
83
105
|
# @param topic_name [String] name of the topic we're interested in
|
|
84
106
|
# @see Topics.info
|
|
85
107
|
def topic_info(topic_name)
|
|
86
108
|
new.topic_info(topic_name)
|
|
87
109
|
end
|
|
88
110
|
|
|
89
|
-
# @param
|
|
111
|
+
# @param group_id [String] id of the group for which we want to move the
|
|
90
112
|
# existing offset
|
|
91
113
|
# @param topics_with_partitions_and_offsets [Hash] Hash with list of topics and settings
|
|
92
114
|
# @see ConsumerGroups.seek
|
|
93
|
-
def seek_consumer_group(
|
|
94
|
-
new.seek_consumer_group(
|
|
115
|
+
def seek_consumer_group(group_id, topics_with_partitions_and_offsets)
|
|
116
|
+
new.seek_consumer_group(group_id, topics_with_partitions_and_offsets)
|
|
95
117
|
end
|
|
96
118
|
|
|
97
119
|
# Takes consumer group and its topics and copies all the offsets to a new named group
|
|
@@ -124,36 +146,35 @@ module Karafka
|
|
|
124
146
|
)
|
|
125
147
|
end
|
|
126
148
|
|
|
127
|
-
# Removes given
|
|
149
|
+
# Removes given group (if exists)
|
|
128
150
|
#
|
|
129
|
-
# @param
|
|
151
|
+
# @param group_id [String] group name
|
|
130
152
|
# @see ConsumerGroups.delete
|
|
131
|
-
def delete_consumer_group(
|
|
132
|
-
new.delete_consumer_group(
|
|
153
|
+
def delete_consumer_group(group_id)
|
|
154
|
+
new.delete_consumer_group(group_id)
|
|
133
155
|
end
|
|
134
156
|
|
|
135
|
-
# Triggers a rebalance for the specified
|
|
157
|
+
# Triggers a rebalance for the specified group
|
|
136
158
|
#
|
|
137
|
-
# @param
|
|
159
|
+
# @param group_id [String] group id to trigger rebalance for
|
|
138
160
|
# @see ConsumerGroups.trigger_rebalance
|
|
139
161
|
# @note This API should be used only for development.
|
|
140
|
-
def trigger_rebalance(
|
|
141
|
-
new.trigger_rebalance(
|
|
162
|
+
def trigger_rebalance(group_id)
|
|
163
|
+
new.trigger_rebalance(group_id)
|
|
142
164
|
end
|
|
143
165
|
|
|
144
|
-
# Reads lags and offsets for given topics in the context of
|
|
145
|
-
#
|
|
146
|
-
#
|
|
147
|
-
# groups names with array of topics to query per consumer group inside
|
|
166
|
+
# Reads lags and offsets for given topics in the context of groups defined in the routing
|
|
167
|
+
# @param groups_with_topics [Hash{String => Array<String>}] hash with group
|
|
168
|
+
# names with array of topics to query per group inside
|
|
148
169
|
# @param active_topics_only [Boolean] if set to false, when we use routing topics, will
|
|
149
170
|
# select also topics that are marked as inactive in routing
|
|
150
171
|
# @return [Hash{String => Hash{Integer => Hash{Integer => Object}}}] hash where the top
|
|
151
|
-
# level keys are the
|
|
172
|
+
# level keys are the groups and values are hashes with topics and inside
|
|
152
173
|
# partitions with lags and offsets
|
|
153
174
|
# @see ConsumerGroups.read_lags_with_offsets
|
|
154
|
-
def read_lags_with_offsets(
|
|
175
|
+
def read_lags_with_offsets(groups_with_topics = {}, active_topics_only: true)
|
|
155
176
|
new.read_lags_with_offsets(
|
|
156
|
-
|
|
177
|
+
groups_with_topics,
|
|
157
178
|
active_topics_only: active_topics_only
|
|
158
179
|
)
|
|
159
180
|
end
|
|
@@ -268,18 +289,25 @@ module Karafka
|
|
|
268
289
|
Topics.new(kafka: @custom_kafka).read_watermark_offsets(name_or_hash, partition)
|
|
269
290
|
end
|
|
270
291
|
|
|
292
|
+
# @param topic_partition_offsets [Hash{String => Array<Hash>}] topics with partition specs
|
|
293
|
+
# @param isolation_level [Integer, nil] optional isolation level constant
|
|
294
|
+
# @see Topics#read_partition_offsets
|
|
295
|
+
def read_partition_offsets(topic_partition_offsets, isolation_level: nil)
|
|
296
|
+
Topics.new(kafka: @custom_kafka).read_partition_offsets(topic_partition_offsets, isolation_level: isolation_level)
|
|
297
|
+
end
|
|
298
|
+
|
|
271
299
|
# @param topic_name [String] name of the topic we're interested in
|
|
272
300
|
# @see Topics#info
|
|
273
301
|
def topic_info(topic_name)
|
|
274
302
|
Topics.new(kafka: @custom_kafka).info(topic_name)
|
|
275
303
|
end
|
|
276
304
|
|
|
277
|
-
# @param
|
|
305
|
+
# @param group_id [String] group for which we want to move offsets
|
|
278
306
|
# @param topics_with_partitions_and_offsets [Hash] hash with topics and settings
|
|
279
307
|
# @see ConsumerGroups#seek
|
|
280
|
-
def seek_consumer_group(
|
|
308
|
+
def seek_consumer_group(group_id, topics_with_partitions_and_offsets)
|
|
281
309
|
ConsumerGroups.new(kafka: @custom_kafka).seek(
|
|
282
|
-
|
|
310
|
+
group_id,
|
|
283
311
|
topics_with_partitions_and_offsets
|
|
284
312
|
)
|
|
285
313
|
end
|
|
@@ -306,25 +334,25 @@ module Karafka
|
|
|
306
334
|
)
|
|
307
335
|
end
|
|
308
336
|
|
|
309
|
-
# @param
|
|
337
|
+
# @param group_id [String] group name
|
|
310
338
|
# @see ConsumerGroups#delete
|
|
311
|
-
def delete_consumer_group(
|
|
312
|
-
ConsumerGroups.new(kafka: @custom_kafka).delete(
|
|
339
|
+
def delete_consumer_group(group_id)
|
|
340
|
+
ConsumerGroups.new(kafka: @custom_kafka).delete(group_id)
|
|
313
341
|
end
|
|
314
342
|
|
|
315
|
-
# @param
|
|
343
|
+
# @param group_id [String] group id to trigger rebalance for
|
|
316
344
|
# @see ConsumerGroups#trigger_rebalance
|
|
317
|
-
def trigger_rebalance(
|
|
318
|
-
ConsumerGroups.new(kafka: @custom_kafka).trigger_rebalance(
|
|
345
|
+
def trigger_rebalance(group_id)
|
|
346
|
+
ConsumerGroups.new(kafka: @custom_kafka).trigger_rebalance(group_id)
|
|
319
347
|
end
|
|
320
348
|
|
|
321
|
-
# @param
|
|
322
|
-
#
|
|
349
|
+
# @param groups_with_topics [Hash{String => Array<String>}] hash with group
|
|
350
|
+
# names with array of topics
|
|
323
351
|
# @param active_topics_only [Boolean] if set to false, will select also inactive topics
|
|
324
352
|
# @see ConsumerGroups#read_lags_with_offsets
|
|
325
|
-
def read_lags_with_offsets(
|
|
353
|
+
def read_lags_with_offsets(groups_with_topics = {}, active_topics_only: true)
|
|
326
354
|
ConsumerGroups.new(kafka: @custom_kafka).read_lags_with_offsets(
|
|
327
|
-
|
|
355
|
+
groups_with_topics,
|
|
328
356
|
active_topics_only: active_topics_only
|
|
329
357
|
)
|
|
330
358
|
end
|
data/lib/karafka/app.rb
CHANGED
|
@@ -37,18 +37,29 @@ module Karafka
|
|
|
37
37
|
# We then narrow this to active consumer groups from which we select active subscription
|
|
38
38
|
# groups.
|
|
39
39
|
consumer_groups
|
|
40
|
-
.map { |
|
|
41
|
-
.select { |
|
|
40
|
+
.map { |group| [group, group.subscription_groups] }
|
|
41
|
+
.select { |group, _| group.active? }
|
|
42
42
|
.select { |_, sgs| sgs.delete_if { |sg| !sg.active? } }
|
|
43
43
|
.delete_if { |_, sgs| sgs.empty? }
|
|
44
|
-
.each { |_, sgs| sgs.each { |sg| sg.topics.delete_if { |
|
|
44
|
+
.each { |_, sgs| sgs.each { |sg| sg.topics.delete_if { |topic| !topic.active? } } }
|
|
45
45
|
.each { |_, sgs| sgs.delete_if { |sg| sg.topics.empty? } }
|
|
46
|
-
.reject { |
|
|
46
|
+
.reject { |group, _| group.subscription_groups.empty? }
|
|
47
47
|
.to_h
|
|
48
48
|
end
|
|
49
49
|
|
|
50
|
+
# @return [Karafka::Declaratives::Builder] declaratives builder instance
|
|
51
|
+
def declaratives
|
|
52
|
+
config
|
|
53
|
+
.internal
|
|
54
|
+
.declaratives
|
|
55
|
+
.builder
|
|
56
|
+
end
|
|
57
|
+
|
|
50
58
|
# Just a nicer name for the consumer groups
|
|
51
59
|
alias_method :routes, :consumer_groups
|
|
60
|
+
# Generalized alias — routing entries are "groups" (consumer groups today, other kinds
|
|
61
|
+
# of groups like KIP-932 share groups in the future).
|
|
62
|
+
alias_method :groups, :consumer_groups
|
|
52
63
|
|
|
53
64
|
# Returns current assignments of this process. Both topics and partitions
|
|
54
65
|
#
|
|
@@ -108,7 +119,7 @@ module Karafka
|
|
|
108
119
|
config.kafka[:debug] = contexts
|
|
109
120
|
producer.config.kafka[:debug] = contexts
|
|
110
121
|
|
|
111
|
-
|
|
122
|
+
routes.map(&:topics).flat_map(&:to_a).each do |topic|
|
|
112
123
|
topic.kafka[:debug] = contexts
|
|
113
124
|
end
|
|
114
125
|
end
|
|
@@ -26,7 +26,7 @@ module Karafka
|
|
|
26
26
|
attr_accessor :messages
|
|
27
27
|
# @return [Karafka::Connection::Client] kafka connection client
|
|
28
28
|
attr_accessor :client
|
|
29
|
-
# @return [Karafka::Processing::Coordinator] coordinator
|
|
29
|
+
# @return [Karafka::Processing::ConsumerGroups::Coordinator] coordinator
|
|
30
30
|
attr_accessor :coordinator
|
|
31
31
|
# @return [Waterdrop::Producer] producer instance
|
|
32
32
|
attr_accessor :producer
|
|
@@ -304,7 +304,7 @@ module Karafka
|
|
|
304
304
|
# @return [Boolean] was this consumer in active use. Active use means running `#consume` at
|
|
305
305
|
# least once. Consumer may have to run `#revoked` or `#shutdown` despite not running
|
|
306
306
|
# `#consume` previously in delayed job cases and other cases that potentially involve running
|
|
307
|
-
# the `Jobs::Idle` for house-keeping
|
|
307
|
+
# the `ConsumerGroups::Jobs::Idle` for house-keeping
|
|
308
308
|
def used?
|
|
309
309
|
@used
|
|
310
310
|
end
|
|
@@ -16,7 +16,7 @@ module Karafka
|
|
|
16
16
|
include
|
|
17
17
|
exclude
|
|
18
18
|
].each do |action|
|
|
19
|
-
optional(:"#{action}_consumer_groups") { |
|
|
19
|
+
optional(:"#{action}_consumer_groups") { |val| val.is_a?(Array) }
|
|
20
20
|
optional(:"#{action}_subscription_groups") { |sg| sg.is_a?(Array) }
|
|
21
21
|
optional(:"#{action}_topics") { |topics| topics.is_a?(Array) }
|
|
22
22
|
|
|
@@ -28,7 +28,7 @@ module Karafka
|
|
|
28
28
|
# If there were no consumer_groups declared in the server cli, it means that we will
|
|
29
29
|
# run all of them and no need to validate them here at all
|
|
30
30
|
next if value.empty?
|
|
31
|
-
next if (value - Karafka::App.
|
|
31
|
+
next if (value - Karafka::App.routes.map(&:name)).empty?
|
|
32
32
|
|
|
33
33
|
# Found unknown consumer groups
|
|
34
34
|
[[[:"#{action}_consumer_groups"], :consumer_groups_inclusion]]
|
|
@@ -44,7 +44,7 @@ module Karafka
|
|
|
44
44
|
next if value.empty?
|
|
45
45
|
|
|
46
46
|
subscription_groups = Karafka::App
|
|
47
|
-
.
|
|
47
|
+
.routes
|
|
48
48
|
.map(&:subscription_groups)
|
|
49
49
|
.flatten
|
|
50
50
|
.map(&:name)
|
|
@@ -65,7 +65,7 @@ module Karafka
|
|
|
65
65
|
next if value.empty?
|
|
66
66
|
|
|
67
67
|
topics = Karafka::App
|
|
68
|
-
.
|
|
68
|
+
.routes
|
|
69
69
|
.map(&:subscription_groups)
|
|
70
70
|
.flatten
|
|
71
71
|
.map(&:topics)
|
data/lib/karafka/cli/info.rb
CHANGED
|
@@ -41,7 +41,7 @@ module Karafka
|
|
|
41
41
|
"Karafka version: #{Karafka::VERSION}#{postfix}",
|
|
42
42
|
"Ruby version: #{RUBY_DESCRIPTION}",
|
|
43
43
|
"Rdkafka version: #{::Rdkafka::VERSION}",
|
|
44
|
-
"Consumer groups count: #{Karafka::App.
|
|
44
|
+
"Consumer groups count: #{Karafka::App.routes.size}",
|
|
45
45
|
"Subscription groups count: #{Karafka::App.subscription_groups.values.flatten.size}",
|
|
46
46
|
"Workers count: #{concurrency}",
|
|
47
47
|
"Instance client id: #{client_id}",
|
|
@@ -29,28 +29,20 @@ module Karafka
|
|
|
29
29
|
raise Errors::CommandValidationError, cause: e
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
-
# @return [Array<Karafka::
|
|
33
|
-
# @note
|
|
34
|
-
#
|
|
35
|
-
# from a single CLI command execution flow.
|
|
32
|
+
# @return [Array<Karafka::Declaratives::Topic>] all available topics that can be managed
|
|
33
|
+
# @note Topics with bootstrap servers that differ from the default kafka config are
|
|
34
|
+
# considered to belong to a different cluster and are excluded.
|
|
36
35
|
def declaratives_routing_topics
|
|
37
|
-
|
|
36
|
+
@declaratives_routing_topics ||= begin
|
|
37
|
+
default_servers = kafka_config[:"bootstrap.servers"]
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
# Skip topics that were explicitly disabled from management
|
|
45
|
-
next unless topic.declaratives.active?
|
|
46
|
-
# If bootstrap servers are different, consider this a different cluster
|
|
47
|
-
next unless default_servers == topic.kafka[:"bootstrap.servers"]
|
|
48
|
-
|
|
49
|
-
collected_topics[topic.name] ||= topic
|
|
39
|
+
App.declaratives.topics.reject do |topic|
|
|
40
|
+
# Topics with explicit bootstrap servers that differ from the default are on a
|
|
41
|
+
# different cluster. Topics without bootstrap_servers set (e.g. from the standalone
|
|
42
|
+
# DSL) are assumed to belong to the default cluster.
|
|
43
|
+
topic.bootstrap_servers && topic.bootstrap_servers != default_servers
|
|
50
44
|
end
|
|
51
45
|
end
|
|
52
|
-
|
|
53
|
-
@declaratives_routing_topics = collected_topics.values
|
|
54
46
|
end
|
|
55
47
|
|
|
56
48
|
# @return [Array<Hash>] existing topics details
|
|
@@ -17,7 +17,7 @@ module Karafka
|
|
|
17
17
|
declaratives_routing_topics.each do |topic|
|
|
18
18
|
name = topic.name
|
|
19
19
|
|
|
20
|
-
desired_count = topic.
|
|
20
|
+
desired_count = topic.declaratives.partitions
|
|
21
21
|
existing_count = existing_partitions.fetch(name, false)
|
|
22
22
|
|
|
23
23
|
if existing_count && existing_count < desired_count
|
|
@@ -70,8 +70,11 @@ module Karafka
|
|
|
70
70
|
@closed = false
|
|
71
71
|
@subscription_group = subscription_group
|
|
72
72
|
@buffer = RawMessagesBuffer.new
|
|
73
|
-
@rebalance_manager = RebalanceManager.new(@subscription_group.id, @buffer)
|
|
74
|
-
@rebalance_callback = Instrumentation::Callbacks::Rebalance.new(
|
|
73
|
+
@rebalance_manager = ConsumerGroups::RebalanceManager.new(@subscription_group.id, @buffer)
|
|
74
|
+
@rebalance_callback = Instrumentation::Callbacks::ConsumerGroups::Rebalance.new(
|
|
75
|
+
@subscription_group,
|
|
76
|
+
id
|
|
77
|
+
)
|
|
75
78
|
@mode = Mode.new
|
|
76
79
|
|
|
77
80
|
@interval_runner = Helpers::IntervalRunner.new do
|
|
@@ -401,10 +404,14 @@ module Karafka
|
|
|
401
404
|
# - OAUTHBEARER token refresh callbacks
|
|
402
405
|
#
|
|
403
406
|
# @param timeout [Integer] number of milliseconds to wait on events or 0 not to wait.
|
|
407
|
+
# @param safe [Boolean] when true, rescues Rdkafka::RdkafkaError so callers in
|
|
408
|
+
# shutdown/quiet paths do not trigger a full listener reset. When shutting down, errors
|
|
409
|
+
# at this layer are not relevant enough. We want to log them but we should not propagate
|
|
410
|
+
# them any further.
|
|
404
411
|
#
|
|
405
412
|
# @note It is non-blocking when timeout 0 and will not wait if queue empty. It costs up to
|
|
406
413
|
# 2ms when no callbacks are triggered.
|
|
407
|
-
def events_poll(timeout = 0)
|
|
414
|
+
def events_poll(timeout = 0, safe: false)
|
|
408
415
|
kafka.events_poll(timeout)
|
|
409
416
|
|
|
410
417
|
# Emit event for monitoring - happens once per tick_interval (default 5s)
|
|
@@ -414,6 +421,8 @@ module Karafka
|
|
|
414
421
|
caller: self,
|
|
415
422
|
subscription_group: @subscription_group
|
|
416
423
|
)
|
|
424
|
+
rescue Rdkafka::RdkafkaError
|
|
425
|
+
safe ? nil : raise
|
|
417
426
|
end
|
|
418
427
|
|
|
419
428
|
# Returns pointer to the consumer group metadata. It is used only in the context of
|
|
@@ -727,9 +736,9 @@ module Karafka
|
|
|
727
736
|
# Register statistics runner for this particular type of callbacks
|
|
728
737
|
Karafka::Core::Instrumentation.statistics_callbacks.add(
|
|
729
738
|
@subscription_group.id,
|
|
730
|
-
Instrumentation::Callbacks::Statistics.new(
|
|
739
|
+
Instrumentation::Callbacks::ConsumerGroups::Statistics.new(
|
|
731
740
|
@subscription_group.id,
|
|
732
|
-
@subscription_group.
|
|
741
|
+
@subscription_group.group.id,
|
|
733
742
|
@name
|
|
734
743
|
)
|
|
735
744
|
)
|
|
@@ -737,9 +746,9 @@ module Karafka
|
|
|
737
746
|
# Register error tracking callback
|
|
738
747
|
Karafka::Core::Instrumentation.error_callbacks.add(
|
|
739
748
|
@subscription_group.id,
|
|
740
|
-
Instrumentation::Callbacks::Error.new(
|
|
749
|
+
Instrumentation::Callbacks::ConsumerGroups::Error.new(
|
|
741
750
|
@subscription_group.id,
|
|
742
|
-
@subscription_group.
|
|
751
|
+
@subscription_group.group.id,
|
|
743
752
|
@name
|
|
744
753
|
)
|
|
745
754
|
)
|
|
@@ -765,6 +774,29 @@ module Karafka
|
|
|
765
774
|
end
|
|
766
775
|
|
|
767
776
|
consumer
|
|
777
|
+
rescue
|
|
778
|
+
# If anything past the consumer allocation raises (e.g., subscribe/assign failing due to
|
|
779
|
+
# DNS, unknown_topic_or_part, unreleased_instance_id for static group membership,
|
|
780
|
+
# transient broker issues, etc.), we must clean up the native rdkafka handle and the
|
|
781
|
+
# callback registry entries we just added. Otherwise the oauth callback keeps a strong
|
|
782
|
+
# reference to the consumer, pinning it from GC, and the native rd_kafka_t plus its
|
|
783
|
+
# internal pipe FDs and housekeeping threads leak. Callers up the stack (the listener
|
|
784
|
+
# rescue + reset loop) will simply retry build_consumer.
|
|
785
|
+
sg_id = @subscription_group.id
|
|
786
|
+
Karafka::Core::Instrumentation.statistics_callbacks.delete(sg_id)
|
|
787
|
+
Karafka::Core::Instrumentation.error_callbacks.delete(sg_id)
|
|
788
|
+
Karafka::Core::Instrumentation.oauthbearer_token_refresh_callbacks.delete(sg_id)
|
|
789
|
+
|
|
790
|
+
# Close safely if the consumer was allocated. Native kafka was never started
|
|
791
|
+
# (native_kafka_auto_start: false and we did not reach @kafka.start), so close only
|
|
792
|
+
# destroys the inner handle without needing to join any polling thread.
|
|
793
|
+
begin
|
|
794
|
+
consumer&.close
|
|
795
|
+
rescue
|
|
796
|
+
nil
|
|
797
|
+
end
|
|
798
|
+
|
|
799
|
+
raise
|
|
768
800
|
end
|
|
769
801
|
|
|
770
802
|
# @return [Rdkafka::Consumer] librdkafka consumer instance
|
|
@@ -783,8 +815,7 @@ module Karafka
|
|
|
783
815
|
# Decides whether or not we should unsubscribe prior to closing.
|
|
784
816
|
#
|
|
785
817
|
# We cannot do it when there is a static group membership assignment as it would be
|
|
786
|
-
# reassigned.
|
|
787
|
-
# We cannot do it also for assign mode because then there are no subscriptions
|
|
818
|
+
# reassigned. We cannot do it also for assign mode because then there are no subscriptions
|
|
788
819
|
# We also do not do it if there are no assignments at all as it does not make sense
|
|
789
820
|
#
|
|
790
821
|
# @return [Boolean] should we unsubscribe prior to shutdown
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Karafka
|
|
4
|
+
module Connection
|
|
5
|
+
# Consumer-group-specific connection components (rebalance handling driven by consumer group
|
|
6
|
+
# protocol). Parallel `ShareGroups` will live next to this namespace once KIP-932 lands.
|
|
7
|
+
module ConsumerGroups
|
|
8
|
+
# Manager for tracking changes in the partitions assignment after the assignment is done and
|
|
9
|
+
# for ensuring, that proper buffer related operations that may be impacted by the rebalance
|
|
10
|
+
# state are applied.
|
|
11
|
+
#
|
|
12
|
+
# We need tracking of those to clean up consumers that will no longer process given
|
|
13
|
+
# partitions as they were taken away.
|
|
14
|
+
#
|
|
15
|
+
# @note Since this does not happen really often, we try to stick with same objects for the
|
|
16
|
+
# empty states most of the time, so we don't create many objects during the manager life
|
|
17
|
+
#
|
|
18
|
+
# @note Internally in the rebalance manager we have a notion of lost partitions. Partitions
|
|
19
|
+
# that are lost, are those that got revoked but did not get re-assigned back. We do not
|
|
20
|
+
# expose this concept outside and we normalize to have them revoked, as it is irrelevant
|
|
21
|
+
# from the rest of the code perspective as only those that are lost are truly revoked.
|
|
22
|
+
#
|
|
23
|
+
# @note For cooperative-sticky `#assigned_partitions` holds only the recently assigned
|
|
24
|
+
# partitions, not all the partitions that are owned
|
|
25
|
+
#
|
|
26
|
+
# @note We have to have the `subscription_group` reference because we have a global pipeline
|
|
27
|
+
# for notifications and we need to make sure we track changes only for things that are of
|
|
28
|
+
# relevance to our subscription group
|
|
29
|
+
class RebalanceManager
|
|
30
|
+
# Empty array for internal usage not to create new objects
|
|
31
|
+
EMPTY_ARRAY = [].freeze
|
|
32
|
+
|
|
33
|
+
attr_reader :assigned_partitions, :revoked_partitions
|
|
34
|
+
|
|
35
|
+
private_constant :EMPTY_ARRAY
|
|
36
|
+
|
|
37
|
+
# @param subscription_group_id [String] subscription group id
|
|
38
|
+
# @param buffer [Karafka::Connection::RawMessagesBuffer]
|
|
39
|
+
# @return [RebalanceManager]
|
|
40
|
+
def initialize(subscription_group_id, buffer)
|
|
41
|
+
@assigned_partitions = {}
|
|
42
|
+
@revoked_partitions = {}
|
|
43
|
+
@changed = false
|
|
44
|
+
@active = false
|
|
45
|
+
@subscription_group_id = subscription_group_id
|
|
46
|
+
@buffer = buffer
|
|
47
|
+
|
|
48
|
+
# Connects itself to the instrumentation pipeline so rebalances can be tracked
|
|
49
|
+
Karafka.monitor.subscribe(self)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Resets the rebalance manager state
|
|
53
|
+
# This needs to be done before each polling loop as during the polling, the state may be
|
|
54
|
+
# changed
|
|
55
|
+
def clear
|
|
56
|
+
@assigned_partitions.clear
|
|
57
|
+
@revoked_partitions.clear
|
|
58
|
+
@changed = false
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# @return [Boolean] indicates a state change in the partitions assignment
|
|
62
|
+
def changed?
|
|
63
|
+
@changed
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# @return [Boolean] true if there was at least one rebalance
|
|
67
|
+
# @note This method is needed to make sure that when using cooperative-sticky, we do not
|
|
68
|
+
# close until first rebalance. Otherwise librdkafka may crash.
|
|
69
|
+
# @see https://github.com/confluentinc/librdkafka/issues/4312
|
|
70
|
+
def active?
|
|
71
|
+
@active
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Callback that kicks in inside of rdkafka, when new partitions were assigned.
|
|
75
|
+
#
|
|
76
|
+
# @private
|
|
77
|
+
# @param event [Karafka::Core::Monitoring::Event]
|
|
78
|
+
def on_rebalance_partitions_assigned(event)
|
|
79
|
+
# Apply changes only for our subscription group
|
|
80
|
+
return unless event[:subscription_group_id] == @subscription_group_id
|
|
81
|
+
|
|
82
|
+
@active = true
|
|
83
|
+
@assigned_partitions = event[:tpl].to_h.transform_values { |part| part.map(&:partition) }
|
|
84
|
+
@changed = true
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Callback that kicks in inside of rdkafka, when partitions were revoked.
|
|
88
|
+
#
|
|
89
|
+
# @private
|
|
90
|
+
# @param event [Karafka::Core::Monitoring::Event]
|
|
91
|
+
def on_rebalance_partitions_revoked(event)
|
|
92
|
+
# Apply changes only for our subscription group
|
|
93
|
+
return unless event[:subscription_group_id] == @subscription_group_id
|
|
94
|
+
|
|
95
|
+
@active = true
|
|
96
|
+
@revoked_partitions = event[:tpl].to_h.transform_values { |part| part.map(&:partition) }
|
|
97
|
+
@changed = true
|
|
98
|
+
|
|
99
|
+
remove_revoked_and_duplicated_messages
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
private
|
|
103
|
+
|
|
104
|
+
# We may have a case where in the middle of data polling, we've lost a partition.
|
|
105
|
+
# In a case like this we should remove all the pre-buffered messages from list partitions
|
|
106
|
+
# as we are no longer responsible in a given process for processing those messages and
|
|
107
|
+
# they should have been picked up by a different process.
|
|
108
|
+
def remove_revoked_and_duplicated_messages
|
|
109
|
+
@revoked_partitions.each do |topic, partitions|
|
|
110
|
+
partitions.each do |partition|
|
|
111
|
+
@buffer.delete(topic, partition)
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
@buffer.uniq!
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
@@ -13,8 +13,8 @@ module Karafka
|
|
|
13
13
|
include Helpers::Async
|
|
14
14
|
|
|
15
15
|
include Helpers::ConfigImporter.new(
|
|
16
|
-
jobs_builder: %i[internal processing jobs_builder],
|
|
17
|
-
partitioner_class: %i[internal processing partitioner_class],
|
|
16
|
+
jobs_builder: %i[internal processing consumer_groups jobs_builder],
|
|
17
|
+
partitioner_class: %i[internal processing consumer_groups partitioner_class],
|
|
18
18
|
reset_backoff: %i[internal connection reset_backoff],
|
|
19
19
|
listener_thread_priority: %i[internal connection listener_thread_priority]
|
|
20
20
|
)
|
|
@@ -26,7 +26,7 @@ module Karafka
|
|
|
26
26
|
# @return [Karafka::Routing::SubscriptionGroup] subscription group that this listener handles
|
|
27
27
|
attr_reader :subscription_group
|
|
28
28
|
|
|
29
|
-
# @return [Processing::CoordinatorsBuffer] coordinator buffers that can be used directly in
|
|
29
|
+
# @return [Processing::ConsumerGroups::CoordinatorsBuffer] coordinator buffers that can be used directly in
|
|
30
30
|
# advanced cases of changes to the polling flow (like triggered seek back without messages
|
|
31
31
|
# ahead in the topic)
|
|
32
32
|
attr_reader :coordinators
|
|
@@ -45,12 +45,12 @@ module Karafka
|
|
|
45
45
|
@id = SecureRandom.hex(6)
|
|
46
46
|
@subscription_group = subscription_group
|
|
47
47
|
@jobs_queue = jobs_queue
|
|
48
|
-
@coordinators = Processing::CoordinatorsBuffer.new(subscription_group.topics)
|
|
48
|
+
@coordinators = Processing::ConsumerGroups::CoordinatorsBuffer.new(subscription_group.topics)
|
|
49
49
|
@client = Client.new(@subscription_group, -> { running? })
|
|
50
|
-
@executors = Processing::ExecutorsBuffer.new(@client, subscription_group)
|
|
50
|
+
@executors = Processing::ConsumerGroups::ExecutorsBuffer.new(@client, subscription_group)
|
|
51
51
|
@partitioner = partitioner_class.new(subscription_group)
|
|
52
52
|
@scheduler = scheduler
|
|
53
|
-
@events_poller = Helpers::IntervalRunner.new { @client.events_poll }
|
|
53
|
+
@events_poller = Helpers::IntervalRunner.new { |**opts| @client.events_poll(**opts) }
|
|
54
54
|
# We keep one buffer for messages to preserve memory and not allocate extra objects
|
|
55
55
|
# We can do this that way because we always first schedule jobs using messages before we
|
|
56
56
|
# fetch another batch.
|
|
@@ -499,6 +499,7 @@ module Karafka
|
|
|
499
499
|
until wait_until.call
|
|
500
500
|
@client.ping
|
|
501
501
|
@scheduler.on_manage
|
|
502
|
+
@events_poller.call(safe: true)
|
|
502
503
|
|
|
503
504
|
after_ping.call
|
|
504
505
|
sleep(0.2)
|
|
@@ -520,7 +521,7 @@ module Karafka
|
|
|
520
521
|
@client.reset
|
|
521
522
|
@coordinators.reset
|
|
522
523
|
@interval_runner.reset
|
|
523
|
-
@executors = Processing::ExecutorsBuffer.new(@client, @subscription_group)
|
|
524
|
+
@executors = Processing::ConsumerGroups::ExecutorsBuffer.new(@client, @subscription_group)
|
|
524
525
|
end
|
|
525
526
|
end
|
|
526
527
|
end
|
|
@@ -13,7 +13,7 @@ module Karafka
|
|
|
13
13
|
# should be able to distribute work whenever any work is done in any of the listeners
|
|
14
14
|
scheduler = App.config.internal.processing.scheduler_class.new(jobs_queue)
|
|
15
15
|
|
|
16
|
-
@batch = App.subscription_groups.flat_map do |
|
|
16
|
+
@batch = App.subscription_groups.flat_map do |_group, subscription_groups|
|
|
17
17
|
subscription_groups.map do |subscription_group|
|
|
18
18
|
Connection::Listener.new(
|
|
19
19
|
subscription_group,
|
|
@@ -31,8 +31,7 @@ module Karafka
|
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
# Define query and setter methods for each mode using meta-programming
|
|
34
|
-
# This creates methods like: subscribe?, assign?
|
|
35
|
-
# And bang methods like: subscribe!, assign!
|
|
34
|
+
# This creates methods like: subscribe?, assign? And bang methods like: subscribe!, assign!
|
|
36
35
|
MODES.each do |mode_name|
|
|
37
36
|
# @return [Boolean] true if the current mode matches this mode
|
|
38
37
|
define_method("#{mode_name}?") do
|
|
@@ -108,11 +108,6 @@ module Karafka
|
|
|
108
108
|
# we save ourselves some objects allocations. We cannot clear the underlying arrays as they
|
|
109
109
|
# may be used in other threads for data processing, thus if we would clear it, we could
|
|
110
110
|
# potentially clear a raw messages array for a job that is in the jobs queue.
|
|
111
|
-
#
|
|
112
|
-
# @note We do not clear the eof assignments because they can span across batch pollings.
|
|
113
|
-
# Since eof is not raised non-stop and is silenced after an eof poll, if we would clean it
|
|
114
|
-
# here we would loose the notion of it. The reset state for it should happen when we do
|
|
115
|
-
# discover new messages for given topic partition.
|
|
116
111
|
def clear
|
|
117
112
|
@size = 0
|
|
118
113
|
@groups.each_value(&:clear)
|