karafka 1.4.12 → 2.2.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/.github/FUNDING.yml +1 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +10 -9
- data/.github/workflows/ci.yml +169 -31
- data/.rspec +4 -0
- data/.ruby-version +1 -1
- data/CHANGELOG.md +716 -607
- data/CONTRIBUTING.md +10 -19
- data/Gemfile +7 -0
- data/Gemfile.lock +69 -92
- data/LICENSE +17 -0
- data/LICENSE-COMM +89 -0
- data/LICENSE-LGPL +165 -0
- data/README.md +48 -47
- data/bin/benchmarks +99 -0
- data/bin/create_token +22 -0
- data/bin/integrations +310 -0
- data/bin/karafka +5 -14
- data/bin/record_rss +50 -0
- data/bin/rspecs +6 -0
- data/bin/scenario +29 -0
- data/bin/stress_many +13 -0
- data/bin/stress_one +13 -0
- data/bin/verify_license_integrity +37 -0
- data/bin/wait_for_kafka +24 -0
- data/certs/cert_chain.pem +26 -0
- data/certs/karafka-pro.pem +11 -0
- data/config/locales/errors.yml +97 -0
- data/config/locales/pro_errors.yml +59 -0
- data/docker-compose.yml +19 -11
- data/karafka.gemspec +26 -22
- data/lib/active_job/karafka.rb +17 -0
- data/lib/active_job/queue_adapters/karafka_adapter.rb +32 -0
- data/lib/karafka/active_job/consumer.rb +49 -0
- data/lib/karafka/active_job/current_attributes/loading.rb +36 -0
- data/lib/karafka/active_job/current_attributes/persistence.rb +28 -0
- data/lib/karafka/active_job/current_attributes.rb +42 -0
- data/lib/karafka/active_job/dispatcher.rb +69 -0
- data/lib/karafka/active_job/job_extensions.rb +34 -0
- data/lib/karafka/active_job/job_options_contract.rb +32 -0
- data/lib/karafka/admin.rb +313 -0
- data/lib/karafka/app.rb +47 -23
- data/lib/karafka/base_consumer.rb +260 -29
- data/lib/karafka/cli/base.rb +67 -36
- data/lib/karafka/cli/console.rb +18 -12
- data/lib/karafka/cli/help.rb +24 -0
- data/lib/karafka/cli/info.rb +47 -12
- data/lib/karafka/cli/install.rb +23 -14
- data/lib/karafka/cli/server.rb +101 -44
- data/lib/karafka/cli/topics.rb +146 -0
- data/lib/karafka/cli.rb +24 -27
- data/lib/karafka/connection/client.rb +553 -90
- data/lib/karafka/connection/consumer_group_coordinator.rb +48 -0
- data/lib/karafka/connection/listener.rb +294 -38
- data/lib/karafka/connection/listeners_batch.rb +40 -0
- data/lib/karafka/connection/messages_buffer.rb +84 -0
- data/lib/karafka/connection/pauses_manager.rb +46 -0
- data/lib/karafka/connection/proxy.rb +98 -0
- data/lib/karafka/connection/raw_messages_buffer.rb +101 -0
- data/lib/karafka/connection/rebalance_manager.rb +105 -0
- data/lib/karafka/contracts/base.rb +17 -0
- data/lib/karafka/contracts/config.rb +130 -11
- data/lib/karafka/contracts/consumer_group.rb +32 -187
- data/lib/karafka/contracts/server_cli_options.rb +80 -19
- data/lib/karafka/contracts/topic.rb +65 -0
- data/lib/karafka/contracts.rb +1 -1
- data/lib/karafka/embedded.rb +36 -0
- data/lib/karafka/env.rb +46 -0
- data/lib/karafka/errors.rb +37 -21
- data/lib/karafka/helpers/async.rb +33 -0
- data/lib/karafka/helpers/colorize.rb +26 -0
- data/lib/karafka/helpers/multi_delegator.rb +2 -2
- data/lib/karafka/instrumentation/callbacks/error.rb +39 -0
- data/lib/karafka/instrumentation/callbacks/rebalance.rb +64 -0
- data/lib/karafka/instrumentation/callbacks/statistics.rb +51 -0
- data/lib/karafka/instrumentation/logger_listener.rb +303 -0
- data/lib/karafka/instrumentation/monitor.rb +13 -61
- data/lib/karafka/instrumentation/notifications.rb +79 -0
- data/lib/karafka/instrumentation/proctitle_listener.rb +7 -16
- data/lib/karafka/instrumentation/vendors/appsignal/base.rb +30 -0
- data/lib/karafka/instrumentation/vendors/appsignal/client.rb +122 -0
- data/lib/karafka/instrumentation/vendors/appsignal/dashboard.json +222 -0
- data/lib/karafka/instrumentation/vendors/appsignal/errors_listener.rb +30 -0
- data/lib/karafka/instrumentation/vendors/appsignal/metrics_listener.rb +331 -0
- data/lib/karafka/instrumentation/vendors/datadog/dashboard.json +1 -0
- data/lib/karafka/instrumentation/vendors/datadog/logger_listener.rb +155 -0
- data/lib/karafka/instrumentation/vendors/datadog/metrics_listener.rb +264 -0
- data/lib/karafka/instrumentation/vendors/kubernetes/liveness_listener.rb +176 -0
- data/lib/karafka/licenser.rb +78 -0
- data/lib/karafka/messages/batch_metadata.rb +52 -0
- data/lib/karafka/messages/builders/batch_metadata.rb +60 -0
- data/lib/karafka/messages/builders/message.rb +40 -0
- data/lib/karafka/messages/builders/messages.rb +36 -0
- data/lib/karafka/{params/params.rb → messages/message.rb} +20 -13
- data/lib/karafka/messages/messages.rb +71 -0
- data/lib/karafka/{params → messages}/metadata.rb +4 -6
- data/lib/karafka/messages/parser.rb +14 -0
- data/lib/karafka/messages/seek.rb +12 -0
- data/lib/karafka/patches/rdkafka/bindings.rb +122 -0
- data/lib/karafka/patches/rdkafka/opaque.rb +36 -0
- data/lib/karafka/pro/active_job/consumer.rb +47 -0
- data/lib/karafka/pro/active_job/dispatcher.rb +86 -0
- data/lib/karafka/pro/active_job/job_options_contract.rb +45 -0
- data/lib/karafka/pro/cleaner/errors.rb +27 -0
- data/lib/karafka/pro/cleaner/messages/message.rb +46 -0
- data/lib/karafka/pro/cleaner/messages/messages.rb +42 -0
- data/lib/karafka/pro/cleaner.rb +41 -0
- data/lib/karafka/pro/contracts/base.rb +23 -0
- data/lib/karafka/pro/contracts/server_cli_options.rb +111 -0
- data/lib/karafka/pro/encryption/cipher.rb +58 -0
- data/lib/karafka/pro/encryption/contracts/config.rb +79 -0
- data/lib/karafka/pro/encryption/errors.rb +27 -0
- data/lib/karafka/pro/encryption/messages/middleware.rb +46 -0
- data/lib/karafka/pro/encryption/messages/parser.rb +56 -0
- data/lib/karafka/pro/encryption/setup/config.rb +48 -0
- data/lib/karafka/pro/encryption.rb +47 -0
- data/lib/karafka/pro/iterator/expander.rb +95 -0
- data/lib/karafka/pro/iterator/tpl_builder.rb +155 -0
- data/lib/karafka/pro/iterator.rb +170 -0
- data/lib/karafka/pro/loader.rb +106 -0
- data/lib/karafka/pro/performance_tracker.rb +84 -0
- data/lib/karafka/pro/processing/collapser.rb +62 -0
- data/lib/karafka/pro/processing/coordinator.rb +147 -0
- data/lib/karafka/pro/processing/filters/base.rb +61 -0
- data/lib/karafka/pro/processing/filters/delayer.rb +70 -0
- data/lib/karafka/pro/processing/filters/expirer.rb +51 -0
- data/lib/karafka/pro/processing/filters/inline_insights_delayer.rb +78 -0
- data/lib/karafka/pro/processing/filters/throttler.rb +84 -0
- data/lib/karafka/pro/processing/filters/virtual_limiter.rb +52 -0
- data/lib/karafka/pro/processing/filters_applier.rb +105 -0
- data/lib/karafka/pro/processing/jobs/consume_non_blocking.rb +39 -0
- data/lib/karafka/pro/processing/jobs/revoked_non_blocking.rb +37 -0
- data/lib/karafka/pro/processing/jobs_builder.rb +50 -0
- data/lib/karafka/pro/processing/partitioner.rb +69 -0
- data/lib/karafka/pro/processing/scheduler.rb +75 -0
- data/lib/karafka/pro/processing/strategies/aj/dlq_ftr_lrj_mom.rb +70 -0
- data/lib/karafka/pro/processing/strategies/aj/dlq_ftr_lrj_mom_vp.rb +76 -0
- data/lib/karafka/pro/processing/strategies/aj/dlq_ftr_mom.rb +72 -0
- data/lib/karafka/pro/processing/strategies/aj/dlq_ftr_mom_vp.rb +76 -0
- data/lib/karafka/pro/processing/strategies/aj/dlq_lrj_mom.rb +66 -0
- data/lib/karafka/pro/processing/strategies/aj/dlq_lrj_mom_vp.rb +70 -0
- data/lib/karafka/pro/processing/strategies/aj/dlq_mom.rb +64 -0
- data/lib/karafka/pro/processing/strategies/aj/dlq_mom_vp.rb +69 -0
- data/lib/karafka/pro/processing/strategies/aj/ftr_lrj_mom.rb +38 -0
- data/lib/karafka/pro/processing/strategies/aj/ftr_lrj_mom_vp.rb +66 -0
- data/lib/karafka/pro/processing/strategies/aj/ftr_mom.rb +38 -0
- data/lib/karafka/pro/processing/strategies/aj/ftr_mom_vp.rb +58 -0
- data/lib/karafka/pro/processing/strategies/aj/lrj_mom.rb +37 -0
- data/lib/karafka/pro/processing/strategies/aj/lrj_mom_vp.rb +82 -0
- data/lib/karafka/pro/processing/strategies/aj/mom.rb +36 -0
- data/lib/karafka/pro/processing/strategies/aj/mom_vp.rb +52 -0
- data/lib/karafka/pro/processing/strategies/base.rb +26 -0
- data/lib/karafka/pro/processing/strategies/default.rb +105 -0
- data/lib/karafka/pro/processing/strategies/dlq/default.rb +137 -0
- data/lib/karafka/pro/processing/strategies/dlq/ftr.rb +61 -0
- data/lib/karafka/pro/processing/strategies/dlq/ftr_lrj.rb +75 -0
- data/lib/karafka/pro/processing/strategies/dlq/ftr_lrj_mom.rb +71 -0
- data/lib/karafka/pro/processing/strategies/dlq/ftr_lrj_mom_vp.rb +43 -0
- data/lib/karafka/pro/processing/strategies/dlq/ftr_lrj_vp.rb +41 -0
- data/lib/karafka/pro/processing/strategies/dlq/ftr_mom.rb +69 -0
- data/lib/karafka/pro/processing/strategies/dlq/ftr_mom_vp.rb +41 -0
- data/lib/karafka/pro/processing/strategies/dlq/ftr_vp.rb +40 -0
- data/lib/karafka/pro/processing/strategies/dlq/lrj.rb +64 -0
- data/lib/karafka/pro/processing/strategies/dlq/lrj_mom.rb +65 -0
- data/lib/karafka/pro/processing/strategies/dlq/lrj_mom_vp.rb +36 -0
- data/lib/karafka/pro/processing/strategies/dlq/lrj_vp.rb +39 -0
- data/lib/karafka/pro/processing/strategies/dlq/mom.rb +68 -0
- data/lib/karafka/pro/processing/strategies/dlq/mom_vp.rb +37 -0
- data/lib/karafka/pro/processing/strategies/dlq/vp.rb +40 -0
- data/lib/karafka/pro/processing/strategies/ftr/default.rb +111 -0
- data/lib/karafka/pro/processing/strategies/ftr/vp.rb +40 -0
- data/lib/karafka/pro/processing/strategies/lrj/default.rb +85 -0
- data/lib/karafka/pro/processing/strategies/lrj/ftr.rb +69 -0
- data/lib/karafka/pro/processing/strategies/lrj/ftr_mom.rb +67 -0
- data/lib/karafka/pro/processing/strategies/lrj/ftr_mom_vp.rb +40 -0
- data/lib/karafka/pro/processing/strategies/lrj/ftr_vp.rb +39 -0
- data/lib/karafka/pro/processing/strategies/lrj/mom.rb +77 -0
- data/lib/karafka/pro/processing/strategies/lrj/mom_vp.rb +38 -0
- data/lib/karafka/pro/processing/strategies/lrj/vp.rb +36 -0
- data/lib/karafka/pro/processing/strategies/mom/default.rb +46 -0
- data/lib/karafka/pro/processing/strategies/mom/ftr.rb +53 -0
- data/lib/karafka/pro/processing/strategies/mom/ftr_vp.rb +37 -0
- data/lib/karafka/pro/processing/strategies/mom/vp.rb +35 -0
- data/lib/karafka/pro/processing/strategies/vp/default.rb +124 -0
- data/lib/karafka/pro/processing/strategies.rb +22 -0
- data/lib/karafka/pro/processing/strategy_selector.rb +84 -0
- data/lib/karafka/pro/processing/virtual_offset_manager.rb +147 -0
- data/lib/karafka/pro/routing/features/active_job/builder.rb +45 -0
- data/lib/karafka/pro/routing/features/active_job.rb +26 -0
- data/lib/karafka/pro/routing/features/base.rb +24 -0
- data/lib/karafka/pro/routing/features/dead_letter_queue/contracts/topic.rb +53 -0
- data/lib/karafka/pro/routing/features/dead_letter_queue.rb +27 -0
- data/lib/karafka/pro/routing/features/delaying/config.rb +27 -0
- data/lib/karafka/pro/routing/features/delaying/contracts/topic.rb +41 -0
- data/lib/karafka/pro/routing/features/delaying/topic.rb +59 -0
- data/lib/karafka/pro/routing/features/delaying.rb +29 -0
- data/lib/karafka/pro/routing/features/expiring/config.rb +27 -0
- data/lib/karafka/pro/routing/features/expiring/contracts/topic.rb +41 -0
- data/lib/karafka/pro/routing/features/expiring/topic.rb +59 -0
- data/lib/karafka/pro/routing/features/expiring.rb +27 -0
- data/lib/karafka/pro/routing/features/filtering/config.rb +40 -0
- data/lib/karafka/pro/routing/features/filtering/contracts/topic.rb +44 -0
- data/lib/karafka/pro/routing/features/filtering/topic.rb +51 -0
- data/lib/karafka/pro/routing/features/filtering.rb +27 -0
- data/lib/karafka/pro/routing/features/inline_insights/config.rb +32 -0
- data/lib/karafka/pro/routing/features/inline_insights/contracts/topic.rb +41 -0
- data/lib/karafka/pro/routing/features/inline_insights/topic.rb +52 -0
- data/lib/karafka/pro/routing/features/inline_insights.rb +26 -0
- data/lib/karafka/pro/routing/features/long_running_job/config.rb +28 -0
- data/lib/karafka/pro/routing/features/long_running_job/contracts/topic.rb +40 -0
- data/lib/karafka/pro/routing/features/long_running_job/topic.rb +42 -0
- data/lib/karafka/pro/routing/features/long_running_job.rb +28 -0
- data/lib/karafka/pro/routing/features/patterns/builder.rb +38 -0
- data/lib/karafka/pro/routing/features/patterns/config.rb +54 -0
- data/lib/karafka/pro/routing/features/patterns/consumer_group.rb +72 -0
- data/lib/karafka/pro/routing/features/patterns/contracts/consumer_group.rb +62 -0
- data/lib/karafka/pro/routing/features/patterns/contracts/pattern.rb +46 -0
- data/lib/karafka/pro/routing/features/patterns/contracts/topic.rb +41 -0
- data/lib/karafka/pro/routing/features/patterns/detector.rb +71 -0
- data/lib/karafka/pro/routing/features/patterns/pattern.rb +95 -0
- data/lib/karafka/pro/routing/features/patterns/patterns.rb +35 -0
- data/lib/karafka/pro/routing/features/patterns/topic.rb +50 -0
- data/lib/karafka/pro/routing/features/patterns/topics.rb +53 -0
- data/lib/karafka/pro/routing/features/patterns.rb +33 -0
- data/lib/karafka/pro/routing/features/pausing/contracts/topic.rb +51 -0
- data/lib/karafka/pro/routing/features/pausing/topic.rb +44 -0
- data/lib/karafka/pro/routing/features/pausing.rb +25 -0
- data/lib/karafka/pro/routing/features/throttling/config.rb +32 -0
- data/lib/karafka/pro/routing/features/throttling/contracts/topic.rb +44 -0
- data/lib/karafka/pro/routing/features/throttling/topic.rb +69 -0
- data/lib/karafka/pro/routing/features/throttling.rb +30 -0
- data/lib/karafka/pro/routing/features/virtual_partitions/config.rb +30 -0
- data/lib/karafka/pro/routing/features/virtual_partitions/contracts/topic.rb +55 -0
- data/lib/karafka/pro/routing/features/virtual_partitions/topic.rb +56 -0
- data/lib/karafka/pro/routing/features/virtual_partitions.rb +27 -0
- data/lib/karafka/pro.rb +13 -0
- data/lib/karafka/process.rb +24 -8
- data/lib/karafka/processing/coordinator.rb +181 -0
- data/lib/karafka/processing/coordinators_buffer.rb +62 -0
- data/lib/karafka/processing/executor.rb +155 -0
- data/lib/karafka/processing/executors_buffer.rb +72 -0
- data/lib/karafka/processing/expansions_selector.rb +22 -0
- data/lib/karafka/processing/inline_insights/consumer.rb +41 -0
- data/lib/karafka/processing/inline_insights/listener.rb +19 -0
- data/lib/karafka/processing/inline_insights/tracker.rb +128 -0
- data/lib/karafka/processing/jobs/base.rb +55 -0
- data/lib/karafka/processing/jobs/consume.rb +45 -0
- data/lib/karafka/processing/jobs/idle.rb +24 -0
- data/lib/karafka/processing/jobs/revoked.rb +22 -0
- data/lib/karafka/processing/jobs/shutdown.rb +23 -0
- data/lib/karafka/processing/jobs_builder.rb +28 -0
- data/lib/karafka/processing/jobs_queue.rb +150 -0
- data/lib/karafka/processing/partitioner.rb +24 -0
- data/lib/karafka/processing/result.rb +42 -0
- data/lib/karafka/processing/scheduler.rb +22 -0
- data/lib/karafka/processing/strategies/aj_dlq_mom.rb +44 -0
- data/lib/karafka/processing/strategies/aj_mom.rb +21 -0
- data/lib/karafka/processing/strategies/base.rb +52 -0
- data/lib/karafka/processing/strategies/default.rb +158 -0
- data/lib/karafka/processing/strategies/dlq.rb +88 -0
- data/lib/karafka/processing/strategies/dlq_mom.rb +49 -0
- data/lib/karafka/processing/strategies/mom.rb +29 -0
- data/lib/karafka/processing/strategy_selector.rb +47 -0
- data/lib/karafka/processing/worker.rb +93 -0
- data/lib/karafka/processing/workers_batch.rb +27 -0
- data/lib/karafka/railtie.rb +141 -0
- data/lib/karafka/routing/activity_manager.rb +84 -0
- data/lib/karafka/routing/builder.rb +45 -19
- data/lib/karafka/routing/consumer_group.rb +56 -20
- data/lib/karafka/routing/consumer_mapper.rb +1 -12
- data/lib/karafka/routing/features/active_job/builder.rb +33 -0
- data/lib/karafka/routing/features/active_job/config.rb +15 -0
- data/lib/karafka/routing/features/active_job/contracts/topic.rb +44 -0
- data/lib/karafka/routing/features/active_job/proxy.rb +14 -0
- data/lib/karafka/routing/features/active_job/topic.rb +33 -0
- data/lib/karafka/routing/features/active_job.rb +13 -0
- data/lib/karafka/routing/features/base/expander.rb +59 -0
- data/lib/karafka/routing/features/base.rb +71 -0
- data/lib/karafka/routing/features/dead_letter_queue/config.rb +19 -0
- data/lib/karafka/routing/features/dead_letter_queue/contracts/topic.rb +46 -0
- data/lib/karafka/routing/features/dead_letter_queue/topic.rb +41 -0
- data/lib/karafka/routing/features/dead_letter_queue.rb +16 -0
- data/lib/karafka/routing/features/declaratives/config.rb +18 -0
- data/lib/karafka/routing/features/declaratives/contracts/topic.rb +33 -0
- data/lib/karafka/routing/features/declaratives/topic.rb +44 -0
- data/lib/karafka/routing/features/declaratives.rb +14 -0
- data/lib/karafka/routing/features/inline_insights/config.rb +15 -0
- data/lib/karafka/routing/features/inline_insights/contracts/topic.rb +27 -0
- data/lib/karafka/routing/features/inline_insights/topic.rb +31 -0
- data/lib/karafka/routing/features/inline_insights.rb +40 -0
- data/lib/karafka/routing/features/manual_offset_management/config.rb +15 -0
- data/lib/karafka/routing/features/manual_offset_management/contracts/topic.rb +27 -0
- data/lib/karafka/routing/features/manual_offset_management/topic.rb +35 -0
- data/lib/karafka/routing/features/manual_offset_management.rb +18 -0
- data/lib/karafka/routing/proxy.rb +22 -21
- data/lib/karafka/routing/router.rb +24 -10
- data/lib/karafka/routing/subscription_group.rb +110 -0
- data/lib/karafka/routing/subscription_groups_builder.rb +65 -0
- data/lib/karafka/routing/topic.rb +87 -24
- data/lib/karafka/routing/topics.rb +46 -0
- data/lib/karafka/runner.rb +52 -0
- data/lib/karafka/serialization/json/deserializer.rb +7 -15
- data/lib/karafka/server.rb +113 -37
- data/lib/karafka/setup/attributes_map.rb +348 -0
- data/lib/karafka/setup/config.rb +256 -175
- data/lib/karafka/status.rb +54 -7
- data/lib/karafka/templates/example_consumer.rb.erb +16 -0
- data/lib/karafka/templates/karafka.rb.erb +33 -55
- data/lib/karafka/time_trackers/base.rb +14 -0
- data/lib/karafka/time_trackers/pause.rb +122 -0
- data/lib/karafka/time_trackers/poll.rb +69 -0
- data/lib/karafka/version.rb +1 -1
- data/lib/karafka.rb +91 -17
- data/renovate.json +9 -0
- data.tar.gz.sig +0 -0
- metadata +330 -168
- metadata.gz.sig +0 -0
- data/MIT-LICENCE +0 -18
- data/certs/mensfeld.pem +0 -25
- data/config/errors.yml +0 -41
- data/lib/karafka/assignment_strategies/round_robin.rb +0 -13
- data/lib/karafka/attributes_map.rb +0 -63
- data/lib/karafka/backends/inline.rb +0 -16
- data/lib/karafka/base_responder.rb +0 -226
- data/lib/karafka/cli/flow.rb +0 -48
- data/lib/karafka/cli/missingno.rb +0 -19
- data/lib/karafka/code_reloader.rb +0 -67
- data/lib/karafka/connection/api_adapter.rb +0 -158
- data/lib/karafka/connection/batch_delegator.rb +0 -55
- data/lib/karafka/connection/builder.rb +0 -23
- data/lib/karafka/connection/message_delegator.rb +0 -36
- data/lib/karafka/consumers/batch_metadata.rb +0 -10
- data/lib/karafka/consumers/callbacks.rb +0 -71
- data/lib/karafka/consumers/includer.rb +0 -64
- data/lib/karafka/consumers/responders.rb +0 -24
- data/lib/karafka/consumers/single_params.rb +0 -15
- data/lib/karafka/contracts/consumer_group_topic.rb +0 -19
- data/lib/karafka/contracts/responder_usage.rb +0 -54
- data/lib/karafka/fetcher.rb +0 -42
- data/lib/karafka/helpers/class_matcher.rb +0 -88
- data/lib/karafka/helpers/config_retriever.rb +0 -46
- data/lib/karafka/helpers/inflector.rb +0 -26
- data/lib/karafka/instrumentation/stdout_listener.rb +0 -140
- data/lib/karafka/params/batch_metadata.rb +0 -26
- data/lib/karafka/params/builders/batch_metadata.rb +0 -30
- data/lib/karafka/params/builders/params.rb +0 -38
- data/lib/karafka/params/builders/params_batch.rb +0 -25
- data/lib/karafka/params/params_batch.rb +0 -60
- data/lib/karafka/patches/ruby_kafka.rb +0 -47
- data/lib/karafka/persistence/client.rb +0 -29
- data/lib/karafka/persistence/consumers.rb +0 -45
- data/lib/karafka/persistence/topics.rb +0 -48
- data/lib/karafka/responders/builder.rb +0 -36
- data/lib/karafka/responders/topic.rb +0 -55
- data/lib/karafka/routing/topic_mapper.rb +0 -53
- data/lib/karafka/serialization/json/serializer.rb +0 -31
- data/lib/karafka/setup/configurators/water_drop.rb +0 -36
- data/lib/karafka/templates/application_responder.rb.erb +0 -11
@@ -1,55 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Karafka
|
4
|
-
module Connection
|
5
|
-
# Class that delegates processing of batch received messages for which we listen to
|
6
|
-
# a proper processor
|
7
|
-
module BatchDelegator
|
8
|
-
class << self
|
9
|
-
# Delegates messages (does something with them)
|
10
|
-
# It will either schedule or run a proper processor action for messages
|
11
|
-
# @param group_id [String] group_id of a group from which a given message came
|
12
|
-
# @param kafka_batch [<Kafka::FetchedBatch>] raw messages fetched batch
|
13
|
-
# @note This should be looped to obtain a constant delegating of new messages
|
14
|
-
def call(group_id, kafka_batch)
|
15
|
-
topic = Persistence::Topics.fetch(group_id, kafka_batch.topic)
|
16
|
-
consumer = Persistence::Consumers.fetch(topic, kafka_batch.partition)
|
17
|
-
|
18
|
-
Karafka.monitor.instrument(
|
19
|
-
'connection.batch_delegator.call',
|
20
|
-
caller: self,
|
21
|
-
consumer: consumer,
|
22
|
-
kafka_batch: kafka_batch
|
23
|
-
) do
|
24
|
-
# Due to how ruby-kafka is built, we have the metadata that is stored on the batch
|
25
|
-
# level only available for batch consuming
|
26
|
-
consumer.batch_metadata = Params::Builders::BatchMetadata.from_kafka_batch(
|
27
|
-
kafka_batch,
|
28
|
-
topic
|
29
|
-
)
|
30
|
-
|
31
|
-
kafka_messages = kafka_batch.messages
|
32
|
-
|
33
|
-
# Depending on a case (persisted or not) we might use new consumer instance per
|
34
|
-
# each batch, or use the same one for all of them (for implementing buffering, etc.)
|
35
|
-
if topic.batch_consuming
|
36
|
-
consumer.params_batch = Params::Builders::ParamsBatch.from_kafka_messages(
|
37
|
-
kafka_messages,
|
38
|
-
topic
|
39
|
-
)
|
40
|
-
consumer.call
|
41
|
-
else
|
42
|
-
kafka_messages.each do |kafka_message|
|
43
|
-
consumer.params_batch = Params::Builders::ParamsBatch.from_kafka_messages(
|
44
|
-
[kafka_message],
|
45
|
-
topic
|
46
|
-
)
|
47
|
-
consumer.call
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Karafka
|
4
|
-
module Connection
|
5
|
-
# Builder used to construct Kafka client
|
6
|
-
module Builder
|
7
|
-
class << self
|
8
|
-
# Builds a Kafka::Client instance that we use to work with Kafka cluster
|
9
|
-
# @param consumer_group [Karafka::Routing::ConsumerGroup] consumer group for which we want
|
10
|
-
# to have a new Kafka client
|
11
|
-
# @return [::Kafka::Client] returns a Kafka client
|
12
|
-
def call(consumer_group)
|
13
|
-
settings = ApiAdapter.client(consumer_group)
|
14
|
-
|
15
|
-
Kafka.new(
|
16
|
-
settings[0],
|
17
|
-
**settings[1]
|
18
|
-
)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
@@ -1,36 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Karafka
|
4
|
-
module Connection
|
5
|
-
# Class that delegates processing of a single received message for which we listen to
|
6
|
-
# a proper processor
|
7
|
-
module MessageDelegator
|
8
|
-
class << self
|
9
|
-
# Delegates message (does something with it)
|
10
|
-
# It will either schedule or run a proper processor action for the incoming message
|
11
|
-
# @param group_id [String] group_id of a group from which a given message came
|
12
|
-
# @param kafka_message [<Kafka::FetchedMessage>] raw message from kafka
|
13
|
-
# @note This should be looped to obtain a constant delegating of new messages
|
14
|
-
def call(group_id, kafka_message)
|
15
|
-
topic = Persistence::Topics.fetch(group_id, kafka_message.topic)
|
16
|
-
consumer = Persistence::Consumers.fetch(topic, kafka_message.partition)
|
17
|
-
|
18
|
-
Karafka.monitor.instrument(
|
19
|
-
'connection.message_delegator.call',
|
20
|
-
caller: self,
|
21
|
-
consumer: consumer,
|
22
|
-
kafka_message: kafka_message
|
23
|
-
) do
|
24
|
-
# @note We always get a single message within single delegator, which means that
|
25
|
-
# we don't care if user marked it as a batch consumed or not.
|
26
|
-
consumer.params_batch = Params::Builders::ParamsBatch.from_kafka_messages(
|
27
|
-
[kafka_message],
|
28
|
-
topic
|
29
|
-
)
|
30
|
-
consumer.call
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
@@ -1,71 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Karafka
|
4
|
-
module Consumers
|
5
|
-
# Additional callbacks that can be used to trigger some actions on certain moments like
|
6
|
-
# manual offset management, committing or anything else outside of a standard messages flow
|
7
|
-
# They are not included by default, as we don't want to provide functionalities that are
|
8
|
-
# not required by users by default
|
9
|
-
# Please refer to the wiki callbacks page for more details on how to use them
|
10
|
-
module Callbacks
|
11
|
-
# Types of events on which we run callbacks
|
12
|
-
TYPES = %i[
|
13
|
-
after_fetch
|
14
|
-
after_poll
|
15
|
-
before_poll
|
16
|
-
before_stop
|
17
|
-
].freeze
|
18
|
-
|
19
|
-
private_constant :TYPES
|
20
|
-
|
21
|
-
# Class methods needed to make callbacks run
|
22
|
-
module ClassMethods
|
23
|
-
TYPES.each do |type|
|
24
|
-
# Creates a callback wrapper
|
25
|
-
#
|
26
|
-
# @param method_name [Symbol, String] method name or nil if we plan to provide a block
|
27
|
-
# @yield A block with a code that should be executed before scheduling
|
28
|
-
# @note We don't have to optimize the key fetching here as those are class methods that
|
29
|
-
# are evaluated once upon start
|
30
|
-
define_method(type) do |method_name = nil, &block|
|
31
|
-
key = "consumers.#{Helpers::Inflector.map(to_s)}.#{type}"
|
32
|
-
Karafka::App.monitor.register_event(key)
|
33
|
-
|
34
|
-
Karafka::App.monitor.subscribe(key) do |event|
|
35
|
-
context = event[:context]
|
36
|
-
|
37
|
-
if method_name
|
38
|
-
context.send(method_name)
|
39
|
-
else
|
40
|
-
context.instance_eval(&block)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
class << self
|
48
|
-
# @param consumer_class [Class] consumer class that we extend with callbacks
|
49
|
-
def included(consumer_class)
|
50
|
-
consumer_class.class_eval do
|
51
|
-
extend ClassMethods
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
# Executes the default consumer flow, runs callbacks and if not halted will call process
|
57
|
-
# method of a proper backend. It is here because it interacts with the default Karafka
|
58
|
-
# call flow and needs to be overwritten to support callbacks
|
59
|
-
def call
|
60
|
-
if self.class.respond_to?(:after_fetch)
|
61
|
-
Karafka::App.monitor.instrument(
|
62
|
-
"consumers.#{Helpers::Inflector.map(self.class.to_s)}.after_fetch",
|
63
|
-
context: self
|
64
|
-
)
|
65
|
-
end
|
66
|
-
|
67
|
-
process
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
@@ -1,64 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Karafka
|
4
|
-
# Additional functionalities for consumers
|
5
|
-
module Consumers
|
6
|
-
# Module used to inject functionalities into a given consumer instance, based on the consumer
|
7
|
-
# topic and its settings
|
8
|
-
# We don't need all the behaviors in all the cases, so it is not worth having everything
|
9
|
-
# in all the cases all the time
|
10
|
-
module Includer
|
11
|
-
class << self
|
12
|
-
# @param consumer [Karafka::BaseConsumer] consumer instance, that will get some
|
13
|
-
# functionalities based on the topic under which it operates
|
14
|
-
def call(consumer)
|
15
|
-
topic = consumer.topic
|
16
|
-
|
17
|
-
bind_backend(consumer, topic)
|
18
|
-
bind_params(consumer, topic)
|
19
|
-
bind_batch_metadata(consumer, topic)
|
20
|
-
bind_responders(consumer, topic)
|
21
|
-
end
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
# Figures out backend for a given consumer class, based on the topic backend and
|
26
|
-
# includes it into the consumer class
|
27
|
-
# @param consumer [Karafka::BaseConsumer] consumer instance
|
28
|
-
# @param topic [Karafka::Routing::Topic] topic of a consumer class
|
29
|
-
def bind_backend(consumer, topic)
|
30
|
-
backend = Kernel.const_get("::Karafka::Backends::#{topic.backend.to_s.capitalize}")
|
31
|
-
consumer.extend(backend)
|
32
|
-
end
|
33
|
-
|
34
|
-
# Adds a single #params support for non batch processed topics
|
35
|
-
# @param consumer [Karafka::BaseConsumer] consumer instance
|
36
|
-
# @param topic [Karafka::Routing::Topic] topic of a consumer class
|
37
|
-
def bind_params(consumer, topic)
|
38
|
-
return if topic.batch_consuming
|
39
|
-
|
40
|
-
consumer.extend(SingleParams)
|
41
|
-
end
|
42
|
-
|
43
|
-
# Adds an option to work with batch metadata for consumer instances that have
|
44
|
-
# batch fetching enabled
|
45
|
-
# @param consumer [Karafka::BaseConsumer] consumer instance
|
46
|
-
# @param topic [Karafka::Routing::Topic] topic of a consumer class
|
47
|
-
def bind_batch_metadata(consumer, topic)
|
48
|
-
return unless topic.batch_fetching
|
49
|
-
|
50
|
-
consumer.extend(BatchMetadata)
|
51
|
-
end
|
52
|
-
|
53
|
-
# Adds responders support for topics and consumers with responders defined for them
|
54
|
-
# @param consumer [Karafka::BaseConsumer] consumer instance
|
55
|
-
# @param topic [Karafka::Routing::Topic] topic of a consumer class
|
56
|
-
def bind_responders(consumer, topic)
|
57
|
-
return unless topic.responder
|
58
|
-
|
59
|
-
consumer.extend(Responders)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Karafka
|
4
|
-
module Consumers
|
5
|
-
# Feature that allows us to use responders flow in consumer
|
6
|
-
module Responders
|
7
|
-
# Responds with given data using given responder. This allows us to have a similar way of
|
8
|
-
# defining flows like synchronous protocols
|
9
|
-
# @param data Anything we want to pass to responder based on which we want to trigger further
|
10
|
-
# Kafka responding
|
11
|
-
def respond_with(*data)
|
12
|
-
Karafka.monitor.instrument(
|
13
|
-
'consumers.responders.respond_with',
|
14
|
-
caller: self,
|
15
|
-
data: data
|
16
|
-
) do
|
17
|
-
# @note we build a new instance of responder each time, as a long-running (persisted)
|
18
|
-
# consumers can respond multiple times during the life-cycle
|
19
|
-
topic.responder.new.call(*data)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Karafka
|
4
|
-
module Consumers
|
5
|
-
# Params alias for single message consumption consumers
|
6
|
-
module SingleParams
|
7
|
-
private
|
8
|
-
|
9
|
-
# @return [Karafka::Params::Params] params instance for non batch consumption consumers
|
10
|
-
def params
|
11
|
-
params_batch.first
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Karafka
|
4
|
-
module Contracts
|
5
|
-
# Consumer group topic validation rules
|
6
|
-
class ConsumerGroupTopic < Dry::Validation::Contract
|
7
|
-
params do
|
8
|
-
required(:id).filled(:str?, format?: Karafka::Contracts::TOPIC_REGEXP)
|
9
|
-
required(:name).filled(:str?, format?: Karafka::Contracts::TOPIC_REGEXP)
|
10
|
-
required(:backend).filled(included_in?: %i[inline sidekiq])
|
11
|
-
required(:consumer).filled
|
12
|
-
required(:deserializer).filled
|
13
|
-
required(:max_bytes_per_partition).filled(:int?, gteq?: 0)
|
14
|
-
required(:start_from_beginning).filled(:bool?)
|
15
|
-
required(:batch_consuming).filled(:bool?)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,54 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Karafka
|
4
|
-
module Contracts
|
5
|
-
# Validator to check responder topic usage
|
6
|
-
class ResponderUsageTopic < Dry::Validation::Contract
|
7
|
-
config.messages.load_paths << File.join(Karafka.gem_root, 'config', 'errors.yml')
|
8
|
-
|
9
|
-
params do
|
10
|
-
required(:name).filled(:str?, format?: Karafka::Contracts::TOPIC_REGEXP)
|
11
|
-
required(:required).filled(:bool?)
|
12
|
-
required(:usage_count).filled(:int?, gteq?: 0)
|
13
|
-
required(:registered).filled(eql?: true)
|
14
|
-
required(:async).filled(:bool?)
|
15
|
-
required(:serializer).filled
|
16
|
-
end
|
17
|
-
|
18
|
-
rule(:required, :usage_count) do
|
19
|
-
key(:name).failure(:required_usage_count) if values[:required] && values[:usage_count] < 1
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
# Validator to check that everything in a responder flow matches responder rules
|
24
|
-
class ResponderUsage < Dry::Validation::Contract
|
25
|
-
include Dry::Core::Constants
|
26
|
-
|
27
|
-
# Contract for verifying the topic usage details
|
28
|
-
TOPIC_CONTRACT = ResponderUsageTopic.new.freeze
|
29
|
-
|
30
|
-
private_constant :TOPIC_CONTRACT
|
31
|
-
|
32
|
-
params do
|
33
|
-
required(:used_topics)
|
34
|
-
required(:registered_topics)
|
35
|
-
end
|
36
|
-
|
37
|
-
rule(:used_topics) do
|
38
|
-
(value || EMPTY_ARRAY).each do |used_topic|
|
39
|
-
TOPIC_CONTRACT.call(used_topic).errors.each do |error|
|
40
|
-
key([:used_topics, used_topic, error.path[0]]).failure(error.text)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
rule(:registered_topics) do
|
46
|
-
(value || EMPTY_ARRAY).each do |used_topic|
|
47
|
-
TOPIC_CONTRACT.call(used_topic).errors.each do |error|
|
48
|
-
key([:registered_topics, used_topic, error.path[0]]).failure(error.text)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
data/lib/karafka/fetcher.rb
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Karafka
|
4
|
-
# Class used to run the Karafka consumer and handle shutting down, restarting etc
|
5
|
-
# @note Creating multiple fetchers will result in having multiple connections to the same
|
6
|
-
# topics, which means that if there are no partitions, it won't use them.
|
7
|
-
class Fetcher
|
8
|
-
# Starts listening on all the listeners asynchronously
|
9
|
-
# Fetch loop should never end, which means that we won't create more actor clusters
|
10
|
-
# so we don't have to terminate them
|
11
|
-
def call
|
12
|
-
threads = listeners.map do |listener|
|
13
|
-
# We abort on exception because there should be an exception handling developed for
|
14
|
-
# each listener running in separate threads, so the exceptions should never leak
|
15
|
-
# and if that happens, it means that something really bad happened and we should stop
|
16
|
-
# the whole process
|
17
|
-
Thread
|
18
|
-
.new { listener.call }
|
19
|
-
.tap { |thread| thread.abort_on_exception = true }
|
20
|
-
end
|
21
|
-
|
22
|
-
# We aggregate threads here for a supervised shutdown process
|
23
|
-
threads.each { |thread| Karafka::Server.consumer_threads << thread }
|
24
|
-
threads.each(&:join)
|
25
|
-
# If anything crashes here, we need to raise the error and crush the runner because it means
|
26
|
-
# that something terrible happened
|
27
|
-
rescue StandardError => e
|
28
|
-
Karafka.monitor.instrument('fetcher.call.error', caller: self, error: e)
|
29
|
-
Karafka::App.stop!
|
30
|
-
raise e
|
31
|
-
end
|
32
|
-
|
33
|
-
private
|
34
|
-
|
35
|
-
# @return [Array<Karafka::Connection::Listener>] listeners that will consume messages
|
36
|
-
def listeners
|
37
|
-
@listeners ||= App.consumer_groups.active.map do |consumer_group|
|
38
|
-
Karafka::Connection::Listener.new(consumer_group)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
@@ -1,88 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Karafka
|
4
|
-
module Helpers
|
5
|
-
# Class used to autodetect corresponding classes that are internally inside Karafka framework
|
6
|
-
# It is used among others to match:
|
7
|
-
# consumer => responder
|
8
|
-
class ClassMatcher
|
9
|
-
# Regexp used to remove any non classy like characters that might be in the consumer
|
10
|
-
# class name (if defined dynamically, etc)
|
11
|
-
CONSTANT_REGEXP = %r{[?!=+\-*/\^|&\[\]<>%~\#:\s()]}.freeze
|
12
|
-
|
13
|
-
private_constant :CONSTANT_REGEXP
|
14
|
-
|
15
|
-
# @param klass [Class] class to which we want to find a corresponding class
|
16
|
-
# @param from [String] what type of object is it (based on postfix name part)
|
17
|
-
# @param to [String] what are we looking for (based on a postfix name part)
|
18
|
-
# @example Consumer that has a corresponding responder
|
19
|
-
# matcher = Karafka::Helpers::ClassMatcher.new(SuperConsumer, 'Consumer', 'Responder')
|
20
|
-
# matcher.match #=> SuperResponder
|
21
|
-
# @example Consumer without a corresponding responder
|
22
|
-
# matcher = Karafka::Helpers::ClassMatcher.new(Super2Consumer, 'Consumer', 'Responder')
|
23
|
-
# matcher.match #=> nil
|
24
|
-
def initialize(klass, from:, to:)
|
25
|
-
@klass = klass
|
26
|
-
@from = from
|
27
|
-
@to = to
|
28
|
-
end
|
29
|
-
|
30
|
-
# @return [Class] matched class
|
31
|
-
# @return [nil] nil if we couldn't find matching class
|
32
|
-
def match
|
33
|
-
return nil if name.empty?
|
34
|
-
return nil unless scope.const_defined?(name)
|
35
|
-
|
36
|
-
matching = scope.const_get(name)
|
37
|
-
same_scope?(matching) ? matching : nil
|
38
|
-
end
|
39
|
-
|
40
|
-
# @return [String] name of a new class that we're looking for
|
41
|
-
# @note This method returns name of a class without a namespace
|
42
|
-
# @example From SuperConsumer matching responder
|
43
|
-
# matcher.name #=> 'SuperResponder'
|
44
|
-
# @example From Namespaced::Super2Consumer matching responder
|
45
|
-
# matcher.name #=> Super2Responder
|
46
|
-
def name
|
47
|
-
inflected = +@klass.to_s.split('::').last.to_s
|
48
|
-
# We inject the from into the name just in case it is missing as in a situation like
|
49
|
-
# that it would just sanitize the name without adding the "to" postfix.
|
50
|
-
# It could create cases when we want to build for example a responder to a consumer
|
51
|
-
# that does not have the "Consumer" postfix and would do nothing returning the same name.
|
52
|
-
# That would be bad as the matching classes shouldn't be matched to themselves.
|
53
|
-
inflected << @from unless inflected.include?(@from)
|
54
|
-
inflected.gsub!(@from, @to)
|
55
|
-
inflected.gsub!(CONSTANT_REGEXP, '')
|
56
|
-
inflected
|
57
|
-
end
|
58
|
-
|
59
|
-
# @return [Class, Module] class or module in which we're looking for a matching
|
60
|
-
def scope
|
61
|
-
scope_of(@klass)
|
62
|
-
end
|
63
|
-
|
64
|
-
private
|
65
|
-
|
66
|
-
# @param klass [Class] class for which we want to extract it's enclosing class/module
|
67
|
-
# @return [Class, Module] enclosing class/module
|
68
|
-
# @return [::Object] object if it was a root class
|
69
|
-
#
|
70
|
-
# @example Non-namespaced class
|
71
|
-
# scope_of(SuperClass) #=> Object
|
72
|
-
# @example Namespaced class
|
73
|
-
# scope_of(Abc::SuperClass) #=> Abc
|
74
|
-
def scope_of(klass)
|
75
|
-
enclosing = klass.to_s.split('::')[0...-1]
|
76
|
-
return ::Object if enclosing.empty?
|
77
|
-
|
78
|
-
::Object.const_get(enclosing.join('::'))
|
79
|
-
end
|
80
|
-
|
81
|
-
# @param matching [Class] class of which scope we want to check
|
82
|
-
# @return [Boolean] true if the scope of class is the same as scope of matching
|
83
|
-
def same_scope?(matching)
|
84
|
-
scope == scope_of(matching)
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Karafka
|
4
|
-
module Helpers
|
5
|
-
# A helper method that allows us to build methods that try to get a given
|
6
|
-
# attribute from its instance value and if it fails, will fallback to
|
7
|
-
# the default config or config.kafka value for a given attribute.
|
8
|
-
# It is used to simplify the checks.
|
9
|
-
# @note Worth noticing, that the value might be equal to false, so even
|
10
|
-
# then we need to return it. That's why we check for nil?
|
11
|
-
# @example Define config retried attribute for start_from_beginning
|
12
|
-
# class Test
|
13
|
-
# extend Karafka::Helpers::ConfigRetriever
|
14
|
-
# config_retriever_for :start_from_beginning
|
15
|
-
# end
|
16
|
-
#
|
17
|
-
# Test.new.start_from_beginning #=> false
|
18
|
-
# test_instance = Test.new
|
19
|
-
# test_instance.start_from_beginning = true
|
20
|
-
# test_instance.start_from_beginning #=> true
|
21
|
-
module ConfigRetriever
|
22
|
-
# Builds proper methods for setting and retrieving (with fallback) given attribute value
|
23
|
-
# @param attribute [Symbol] attribute name based on which we will build
|
24
|
-
# accessor with fallback
|
25
|
-
def config_retriever_for(attribute)
|
26
|
-
attr_writer attribute unless method_defined? :"#{attribute}="
|
27
|
-
|
28
|
-
# Don't redefine if we already have accessor for a given element
|
29
|
-
return if method_defined? attribute
|
30
|
-
|
31
|
-
define_method attribute do
|
32
|
-
current_value = instance_variable_get(:"@#{attribute}")
|
33
|
-
return current_value unless current_value.nil?
|
34
|
-
|
35
|
-
value = if Karafka::App.config.respond_to?(attribute)
|
36
|
-
Karafka::App.config.send(attribute)
|
37
|
-
else
|
38
|
-
Karafka::App.config.kafka.send(attribute)
|
39
|
-
end
|
40
|
-
|
41
|
-
instance_variable_set(:"@#{attribute}", value)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
@@ -1,26 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Karafka
|
4
|
-
module Helpers
|
5
|
-
# Inflector provides inflection for the whole Karafka framework with additional inflection
|
6
|
-
# caching (due to the fact, that Dry::Inflector is slow)
|
7
|
-
module Inflector
|
8
|
-
# What inflection engine do we want to use
|
9
|
-
ENGINE = Dry::Inflector.new
|
10
|
-
|
11
|
-
@map = Concurrent::Hash.new
|
12
|
-
|
13
|
-
private_constant :ENGINE
|
14
|
-
|
15
|
-
class << self
|
16
|
-
# @param string [String] string that we want to convert to our underscore format
|
17
|
-
# @return [String] inflected string
|
18
|
-
# @example
|
19
|
-
# Karafka::Helpers::Inflector.map('Module/ControllerName') #=> 'module_controller_name'
|
20
|
-
def map(string)
|
21
|
-
@map[string] ||= ENGINE.underscore(string).tr('/', '_')
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|