deimos-ruby 1.3.0.pre.beta5 → 1.4.0.pre.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 +2 -9
- data/Gemfile.lock +2 -88
- data/README.md +18 -135
- data/Rakefile +1 -1
- data/deimos-ruby.gemspec +0 -1
- data/docs/CONFIGURATION.md +200 -0
- data/lib/deimos/avro_data_coder.rb +4 -4
- data/lib/deimos/backends/db.rb +0 -5
- data/lib/deimos/base_consumer.rb +2 -2
- data/lib/deimos/config/configurable.rb +258 -0
- data/lib/deimos/config/configuration.rb +354 -0
- data/lib/deimos/config/phobos_config.rb +134 -0
- data/lib/deimos/kafka_message.rb +6 -0
- data/lib/deimos/producer.rb +5 -5
- data/lib/deimos/test_helpers.rb +2 -10
- data/lib/deimos/utils/db_producer.rb +0 -5
- data/lib/deimos/utils/lag_reporter.rb +4 -4
- data/lib/deimos/version.rb +1 -1
- data/lib/deimos.rb +2 -86
- data/lib/tasks/deimos.rake +1 -1
- data/spec/backends/db_spec.rb +0 -5
- data/spec/batch_consumer_spec.rb +1 -1
- data/spec/config/configurable_spec.rb +121 -0
- data/spec/config/configuration_spec.rb +229 -0
- data/spec/consumer_spec.rb +5 -5
- data/spec/deimos_spec.rb +14 -35
- data/spec/kafka_source_spec.rb +1 -1
- data/spec/producer_spec.rb +5 -5
- data/spec/spec_helper.rb +8 -20
- data/spec/updateable_schema_store_spec.rb +1 -1
- data/spec/utils/db_producer_spec.rb +0 -10
- data/spec/utils/lag_reporter_spec.rb +2 -2
- metadata +10 -19
- data/lib/deimos/configuration.rb +0 -124
- data/spec/rake_spec.rb +0 -19
@@ -12,7 +12,7 @@ module Deimos
|
|
12
12
|
@schema = schema
|
13
13
|
@namespace = namespace
|
14
14
|
@schema_store = schema_store ||
|
15
|
-
AvroTurf::SchemaStore.new(path: Deimos.config.
|
15
|
+
AvroTurf::SchemaStore.new(path: Deimos.config.schema.path)
|
16
16
|
end
|
17
17
|
|
18
18
|
# @param schema [String]
|
@@ -27,7 +27,7 @@ module Deimos
|
|
27
27
|
# @return [AvroTurf]
|
28
28
|
def avro_turf
|
29
29
|
@avro_turf ||= AvroTurf.new(
|
30
|
-
schemas_path: Deimos.config.
|
30
|
+
schemas_path: Deimos.config.schema.path,
|
31
31
|
schema_store: @schema_store
|
32
32
|
)
|
33
33
|
@avro_turf
|
@@ -37,8 +37,8 @@ module Deimos
|
|
37
37
|
def avro_turf_messaging
|
38
38
|
@avro_turf_messaging ||= AvroTurf::Messaging.new(
|
39
39
|
schema_store: @schema_store,
|
40
|
-
registry_url: Deimos.config.
|
41
|
-
schemas_path: Deimos.config.
|
40
|
+
registry_url: Deimos.config.schema.registry_url,
|
41
|
+
schemas_path: Deimos.config.schema.path,
|
42
42
|
namespace: @namespace
|
43
43
|
)
|
44
44
|
end
|
data/lib/deimos/backends/db.rb
CHANGED
data/lib/deimos/base_consumer.rb
CHANGED
@@ -89,8 +89,8 @@ module Deimos
|
|
89
89
|
def _handle_error(exception, payload, metadata)
|
90
90
|
Deimos.config.tracer&.set_error(@span, exception)
|
91
91
|
|
92
|
-
raise if Deimos.config.
|
93
|
-
Deimos.config.
|
92
|
+
raise if Deimos.config.consumers.reraise_errors ||
|
93
|
+
Deimos.config.consumers.fatal_error&.call(exception, payload, metadata) ||
|
94
94
|
fatal_error?(exception, payload, metadata)
|
95
95
|
end
|
96
96
|
|
@@ -0,0 +1,258 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'active_support/concern'
|
4
|
+
|
5
|
+
module Deimos
|
6
|
+
# Module to allow configuration. Loosely based off of the dry-configuration
|
7
|
+
# gem but with several advantages:
|
8
|
+
# - Works with Ruby 2.3.
|
9
|
+
# - More succinct syntax using method_missing so you do not need to write
|
10
|
+
# "config.whatever" and can just write "whatever".
|
11
|
+
# - Use nested blocks:
|
12
|
+
# Deimos.configure do
|
13
|
+
# config.kafka.ssl do
|
14
|
+
# enabled true
|
15
|
+
# ca_cert_file 'my_file'
|
16
|
+
# end
|
17
|
+
# end
|
18
|
+
# - Allows for arrays of configurations:
|
19
|
+
# Deimos.configure do |config|
|
20
|
+
# config.producer do
|
21
|
+
# class_name 'MyProducer'
|
22
|
+
# topic 'MyTopic'
|
23
|
+
# end
|
24
|
+
# end
|
25
|
+
# - Allows to call `configure` multiple times without crashing.
|
26
|
+
# - Allows to lazy-set default values by passing a proc as a default:
|
27
|
+
# Deimos.configure do |config|
|
28
|
+
# setting :my_val, default_proc: proc { MyDefault.calculated_value }
|
29
|
+
# end
|
30
|
+
# - Support for setting up and automatically calling deprecated configurations.
|
31
|
+
# - Support for configuration callbacks.
|
32
|
+
module Configurable
|
33
|
+
extend ActiveSupport::Concern
|
34
|
+
|
35
|
+
ConfigValue = Struct.new(:value, :default_value, :default_proc, :deprecation) do
|
36
|
+
|
37
|
+
# Reset value back to default.
|
38
|
+
def reset!
|
39
|
+
if self.value.is_a?(ConfigStruct)
|
40
|
+
self.value.reset!
|
41
|
+
elsif self.default_proc
|
42
|
+
self.value = self.default_proc.call
|
43
|
+
else
|
44
|
+
self.value = self.default_value
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# :nodoc:
|
49
|
+
def clone_and_reset
|
50
|
+
setting = ConfigValue.new(self.value, self.default_value,
|
51
|
+
self.default_proc, self.deprecation)
|
52
|
+
setting.reset!
|
53
|
+
setting
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
# Class that defines and keeps the configuration values.
|
59
|
+
class ConfigStruct
|
60
|
+
include ActiveSupport::Callbacks
|
61
|
+
|
62
|
+
define_callbacks :configure
|
63
|
+
|
64
|
+
# @param name [String]
|
65
|
+
def initialize(name)
|
66
|
+
@name = name
|
67
|
+
@settings = {}
|
68
|
+
@setting_objects = {}
|
69
|
+
@setting_templates = {}
|
70
|
+
end
|
71
|
+
|
72
|
+
# Reset config back to default values.
|
73
|
+
def reset!
|
74
|
+
@setting_objects = @setting_templates.map { |k, _| [k, []] }.to_h
|
75
|
+
@settings.values.each(&:reset!)
|
76
|
+
end
|
77
|
+
|
78
|
+
# Mark a configuration as deprecated and replaced with the new config.
|
79
|
+
# @param old_config [String]
|
80
|
+
# @param new_config [String]
|
81
|
+
def deprecate(old_config, new_config)
|
82
|
+
@settings[old_config.to_sym] ||= ConfigValue.new
|
83
|
+
@settings[old_config.to_sym].deprecation = new_config
|
84
|
+
end
|
85
|
+
|
86
|
+
# :nodoc:
|
87
|
+
def inspect
|
88
|
+
"#{@name}: #{@settings.inspect} #{@setting_objects.inspect}"
|
89
|
+
end
|
90
|
+
|
91
|
+
# @return [Hash]
|
92
|
+
def to_h
|
93
|
+
@settings.map { |k, v| [k, v.value] }.to_h
|
94
|
+
end
|
95
|
+
|
96
|
+
# :nodoc:
|
97
|
+
def clone_and_reset
|
98
|
+
new_config = self.clone
|
99
|
+
new_config.setting_objects = new_config.setting_objects.clone
|
100
|
+
new_config.settings = new_config.settings.map { |k, v| [k, v.clone_and_reset] }.to_h
|
101
|
+
new_config
|
102
|
+
end
|
103
|
+
|
104
|
+
# Define a setting template for an array of objects via a block:
|
105
|
+
# setting_object :producer do
|
106
|
+
# setting :topic
|
107
|
+
# setting :class_name
|
108
|
+
# end
|
109
|
+
# This will create the `producer` method to define these values as well
|
110
|
+
# as the `producer_objects` method to retrieve them.
|
111
|
+
# @param name [Symbol]
|
112
|
+
def setting_object(name, &block)
|
113
|
+
new_config = ConfigStruct.new("#{@name}.#{name}")
|
114
|
+
@setting_objects[name] = []
|
115
|
+
@setting_templates[name] = new_config
|
116
|
+
new_config.instance_eval(&block)
|
117
|
+
end
|
118
|
+
|
119
|
+
# Define a setting with the given name.
|
120
|
+
# @param name [Symbol]
|
121
|
+
# @param default_value [Object]
|
122
|
+
# @param default_proc [Proc]
|
123
|
+
def setting(name, default_value=nil, default_proc: nil, &block)
|
124
|
+
if block_given?
|
125
|
+
# Create a nested setting
|
126
|
+
setting_config = @settings[name]&.value || ConfigStruct.new("#{@name}.#{name}")
|
127
|
+
setting = ConfigValue.new
|
128
|
+
setting.value = setting_config
|
129
|
+
@settings[name] = setting
|
130
|
+
setting_config.instance_eval(&block)
|
131
|
+
else
|
132
|
+
setting = ConfigValue.new
|
133
|
+
setting.default_proc = default_proc
|
134
|
+
setting.default_value = default_value
|
135
|
+
setting.reset!
|
136
|
+
@settings[name] = setting
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
# :nodoc:
|
141
|
+
def respond_to_missing?(method, include_all=true)
|
142
|
+
method = method.to_s.sub(/=$/, '')
|
143
|
+
method.ends_with?('objects') ||
|
144
|
+
@setting_templates.key?(method.to_sym) ||
|
145
|
+
@settings.key?(method.to_sym) ||
|
146
|
+
super
|
147
|
+
end
|
148
|
+
|
149
|
+
# :nodoc:
|
150
|
+
def method_missing(method, *args, &block)
|
151
|
+
config_key = method.to_s.sub(/=$/, '').to_sym
|
152
|
+
|
153
|
+
# Return the list of setting objects with the given name
|
154
|
+
if config_key.to_s.end_with?('objects')
|
155
|
+
return _setting_object_method(config_key)
|
156
|
+
end
|
157
|
+
|
158
|
+
# Define a new setting object with the given name
|
159
|
+
if @setting_templates.key?(config_key) && block_given?
|
160
|
+
return _new_setting_object_method(config_key, &block)
|
161
|
+
end
|
162
|
+
|
163
|
+
setting = @settings[config_key]
|
164
|
+
|
165
|
+
if setting&.deprecation
|
166
|
+
return _deprecated_config_method(method, *args)
|
167
|
+
end
|
168
|
+
|
169
|
+
return super unless setting
|
170
|
+
|
171
|
+
if block_given?
|
172
|
+
return _block_config_method(config_key, &block)
|
173
|
+
end
|
174
|
+
|
175
|
+
_default_config_method(config_key, *args)
|
176
|
+
end
|
177
|
+
|
178
|
+
protected
|
179
|
+
|
180
|
+
# Only for the clone method
|
181
|
+
attr_accessor :settings, :setting_objects
|
182
|
+
|
183
|
+
private
|
184
|
+
|
185
|
+
def _deprecated_config_method(method, *args)
|
186
|
+
config_key = method.to_s.sub(/=$/, '').to_sym
|
187
|
+
new_config = @settings[config_key].deprecation
|
188
|
+
equals = method.to_s.end_with?('=') ? '=' : ''
|
189
|
+
ActiveSupport::Deprecation.warn("config.#{config_key}#{equals} is deprecated - use config.#{new_config}#{equals}")
|
190
|
+
obj = self
|
191
|
+
messages = new_config.split('.')
|
192
|
+
messages[0..-2].each do |message|
|
193
|
+
obj = obj.send(message)
|
194
|
+
end
|
195
|
+
if args.length.positive?
|
196
|
+
obj.send(messages[-1], args[0])
|
197
|
+
else
|
198
|
+
obj.send(messages[-1])
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
# Get or set a value.
|
203
|
+
def _default_config_method(config_key, *args)
|
204
|
+
if args.length.positive?
|
205
|
+
# Set the value
|
206
|
+
@settings[config_key].value = args[0]
|
207
|
+
else
|
208
|
+
# Get the value
|
209
|
+
@settings[config_key].value
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
# Define a new setting object and use the passed block to define values.
|
214
|
+
def _new_setting_object_method(config_key, &block)
|
215
|
+
new_config = @setting_templates[config_key].clone_and_reset
|
216
|
+
new_config.instance_eval(&block)
|
217
|
+
@setting_objects[config_key] << new_config
|
218
|
+
end
|
219
|
+
|
220
|
+
# Return a setting object.
|
221
|
+
def _setting_object_method(config_key)
|
222
|
+
key = config_key.to_s.sub(/_objects$/, '').to_sym
|
223
|
+
@setting_objects[key]
|
224
|
+
end
|
225
|
+
|
226
|
+
# Define new values inside a block.
|
227
|
+
def _block_config_method(config_key, &block)
|
228
|
+
unless @settings[config_key].value.is_a?(ConfigStruct)
|
229
|
+
raise "Block called for #{config_key} but it is not a nested config!"
|
230
|
+
end
|
231
|
+
|
232
|
+
@settings[config_key].value.instance_eval(&block)
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
# :nodoc:
|
237
|
+
module ClassMethods
|
238
|
+
# Pass the configuration into a block.
|
239
|
+
def configure(&block)
|
240
|
+
config.run_callbacks(:configure) do
|
241
|
+
config.instance_eval(&block)
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
# @return [ConfigStruct]
|
246
|
+
def config
|
247
|
+
@config ||= ConfigStruct.new('config')
|
248
|
+
end
|
249
|
+
|
250
|
+
# Pass a block to run after configuration is done.
|
251
|
+
def after_configure(&block)
|
252
|
+
mod = self
|
253
|
+
config.class.set_callback(:configure, :after,
|
254
|
+
proc { mod.instance_eval(&block) })
|
255
|
+
end
|
256
|
+
end
|
257
|
+
end
|
258
|
+
end
|
@@ -0,0 +1,354 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'phobos_config'
|
4
|
+
require_relative 'configurable'
|
5
|
+
require_relative '../metrics/mock'
|
6
|
+
require_relative '../tracing/mock'
|
7
|
+
|
8
|
+
# :nodoc:
|
9
|
+
module Deimos
|
10
|
+
include Configurable
|
11
|
+
|
12
|
+
# :nodoc:
|
13
|
+
class Configurable::ConfigStruct
|
14
|
+
include Deimos::PhobosConfig
|
15
|
+
end
|
16
|
+
|
17
|
+
# :nodoc:
|
18
|
+
after_configure do
|
19
|
+
Phobos.configure(self.config.phobos_config)
|
20
|
+
self.config.producer_objects.each do |producer|
|
21
|
+
configure_producer_or_consumer(producer)
|
22
|
+
end
|
23
|
+
self.config.consumer_objects.each do |consumer|
|
24
|
+
configure_producer_or_consumer(consumer)
|
25
|
+
end
|
26
|
+
validate_consumers
|
27
|
+
validate_db_backend if self.config.producers.backend == :db
|
28
|
+
end
|
29
|
+
|
30
|
+
# Ensure everything is set up correctly for the DB backend.
|
31
|
+
def self.validate_db_backend
|
32
|
+
begin
|
33
|
+
require 'activerecord-import'
|
34
|
+
rescue LoadError
|
35
|
+
raise 'Cannot set producers.backend to :db without activerecord-import! Please add it to your Gemfile.'
|
36
|
+
end
|
37
|
+
if Deimos.config.producers.required_acks != :all
|
38
|
+
raise 'Cannot set producers.backend to :db unless producers.required_acks is set to ":all"!'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# Validate that consumers are configured correctly, including their
|
43
|
+
# delivery mode.
|
44
|
+
def self.validate_consumers
|
45
|
+
Phobos.config.listeners.each do |listener|
|
46
|
+
handler_class = listener.handler.constantize
|
47
|
+
delivery = listener.delivery
|
48
|
+
|
49
|
+
# Validate that Deimos consumers use proper delivery configs
|
50
|
+
if handler_class < Deimos::BatchConsumer
|
51
|
+
unless delivery == 'inline_batch'
|
52
|
+
raise "BatchConsumer #{listener.handler} must have delivery set to"\
|
53
|
+
' `inline_batch`'
|
54
|
+
end
|
55
|
+
elsif handler_class < Deimos::Consumer
|
56
|
+
if delivery.present? && !%w(message batch).include?(delivery)
|
57
|
+
raise "Non-batch Consumer #{listener.handler} must have delivery"\
|
58
|
+
' set to `message` or `batch`'
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# @param kafka_config [Configurable::ConfigStruct]
|
65
|
+
def self.configure_producer_or_consumer(kafka_config)
|
66
|
+
klass = kafka_config.class_name.constantize
|
67
|
+
klass.class_eval do
|
68
|
+
topic(kafka_config.topic) if kafka_config.topic.present? && klass.respond_to?(:topic)
|
69
|
+
schema(kafka_config.schema) if kafka_config.schema.present?
|
70
|
+
namespace(kafka_config.namespace) if kafka_config.namespace.present?
|
71
|
+
key_config(kafka_config.key_config) if kafka_config.key_config.present?
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
configure do
|
76
|
+
|
77
|
+
# @return [Logger]
|
78
|
+
setting :logger, Logger.new(STDOUT)
|
79
|
+
|
80
|
+
# @return [Logger]
|
81
|
+
setting :phobos_logger, default_proc: proc { Deimos.config.logger }
|
82
|
+
|
83
|
+
setting :kafka do
|
84
|
+
|
85
|
+
# @return [Logger]
|
86
|
+
setting :logger, default_proc: proc { Deimos.config.logger }
|
87
|
+
|
88
|
+
# URL of the seed broker.
|
89
|
+
# @return [Array<String>]
|
90
|
+
setting :seed_brokers, ['localhost:9092']
|
91
|
+
|
92
|
+
# Identifier for this application.
|
93
|
+
# @return [String]
|
94
|
+
setting :client_id, 'phobos'
|
95
|
+
|
96
|
+
# The socket timeout for connecting to the broker, in seconds.
|
97
|
+
# @return [Integer]
|
98
|
+
setting :connect_timeout, 15
|
99
|
+
|
100
|
+
# The socket timeout for reading and writing to the broker, in seconds.
|
101
|
+
# @return [Integer]
|
102
|
+
setting :socket_timeout, 15
|
103
|
+
|
104
|
+
setting :ssl do
|
105
|
+
# Whether SSL is enabled on the brokers.
|
106
|
+
# @return [Boolean]
|
107
|
+
setting :enabled
|
108
|
+
|
109
|
+
# a PEM encoded CA cert, a file path to the cert, or an Array of certs,
|
110
|
+
# to use with an SSL connection.
|
111
|
+
# @return [String|Array<String>]
|
112
|
+
setting :ca_cert
|
113
|
+
|
114
|
+
# a PEM encoded client cert to use with an SSL connection, or a file path
|
115
|
+
# to the cert.
|
116
|
+
# @return [String]
|
117
|
+
setting :client_cert
|
118
|
+
|
119
|
+
# a PEM encoded client cert key to use with an SSL connection.
|
120
|
+
# @return [String]
|
121
|
+
setting :client_cert_key
|
122
|
+
|
123
|
+
# Verify certificate hostname if supported (ruby >= 2.4.0)
|
124
|
+
setting :verify_hostname, true
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
setting :consumers do
|
129
|
+
|
130
|
+
# Number of seconds after which, if a client hasn't contacted the Kafka cluster,
|
131
|
+
# it will be kicked out of the group.
|
132
|
+
# @return [Integer]
|
133
|
+
setting :session_timeout, 300
|
134
|
+
|
135
|
+
# Interval between offset commits, in seconds.
|
136
|
+
# @return [Integer]
|
137
|
+
setting :offset_commit_interval, 10
|
138
|
+
|
139
|
+
# Number of messages that can be processed before their offsets are committed.
|
140
|
+
# If zero, offset commits are not triggered by message processing
|
141
|
+
# @return [Integer]
|
142
|
+
setting :offset_commit_threshold, 0
|
143
|
+
|
144
|
+
# Interval between heartbeats; must be less than the session window.
|
145
|
+
# @return [Integer]
|
146
|
+
setting :heartbeat_interval, 10
|
147
|
+
|
148
|
+
# Minimum and maximum number of milliseconds to back off after a consumer
|
149
|
+
# error.
|
150
|
+
setting :backoff, (1000..60_000)
|
151
|
+
|
152
|
+
# By default, consumer errors will be consumed and logged to
|
153
|
+
# the metrics provider.
|
154
|
+
# Set this to true to force the error to be raised.
|
155
|
+
# @return [Boolean]
|
156
|
+
setting :reraise_errors
|
157
|
+
|
158
|
+
# @return [Boolean]
|
159
|
+
setting :report_lag
|
160
|
+
|
161
|
+
# Block taking an exception, payload and metadata and returning
|
162
|
+
# true if this should be considered a fatal error and false otherwise.
|
163
|
+
# Not needed if reraise_errors is set to true.
|
164
|
+
# @return [Block]
|
165
|
+
setting(:fatal_error, proc { false })
|
166
|
+
end
|
167
|
+
|
168
|
+
setting :producers do
|
169
|
+
# Number of seconds a broker can wait for replicas to acknowledge
|
170
|
+
# a write before responding with a timeout.
|
171
|
+
# @return [Integer]
|
172
|
+
setting :ack_timeout, 5
|
173
|
+
|
174
|
+
# Number of replicas that must acknowledge a write, or `:all`
|
175
|
+
# if all in-sync replicas must acknowledge.
|
176
|
+
# @return [Integer|Symbol]
|
177
|
+
setting :required_acks, 1
|
178
|
+
|
179
|
+
# Number of retries that should be attempted before giving up sending
|
180
|
+
# messages to the cluster. Does not include the original attempt.
|
181
|
+
# @return [Integer]
|
182
|
+
setting :max_retries, 2
|
183
|
+
|
184
|
+
# Number of seconds to wait between retries.
|
185
|
+
# @return [Integer]
|
186
|
+
setting :retry_backoff, 1
|
187
|
+
|
188
|
+
# Number of messages allowed in the buffer before new writes will
|
189
|
+
# raise {BufferOverflow} exceptions.
|
190
|
+
# @return [Integer]
|
191
|
+
setting :max_buffer_size, 10_000
|
192
|
+
|
193
|
+
# Maximum size of the buffer in bytes. Attempting to produce messages
|
194
|
+
# when the buffer reaches this size will result in {BufferOverflow} being raised.
|
195
|
+
# @return [Integer]
|
196
|
+
setting :max_buffer_bytesize, 10_000_000
|
197
|
+
|
198
|
+
# Name of the compression codec to use, or nil if no compression should be performed.
|
199
|
+
# Valid codecs: `:snappy` and `:gzip`
|
200
|
+
# @return [Symbol]
|
201
|
+
setting :compression_codec
|
202
|
+
|
203
|
+
# Number of messages that needs to be in a message set before it should be compressed.
|
204
|
+
# Note that message sets are per-partition rather than per-topic or per-producer.
|
205
|
+
# @return [Integer]
|
206
|
+
setting :compression_threshold, 1
|
207
|
+
|
208
|
+
# Maximum number of messages allowed in the queue. Only used for async_producer.
|
209
|
+
# @return [Integer]
|
210
|
+
setting :max_queue_size, 10_000
|
211
|
+
|
212
|
+
# If greater than zero, the number of buffered messages that will automatically
|
213
|
+
# trigger a delivery. Only used for async_producer.
|
214
|
+
# @return [Integer]
|
215
|
+
setting :delivery_threshold, 0
|
216
|
+
|
217
|
+
# if greater than zero, the number of seconds between automatic message
|
218
|
+
# deliveries. Only used for async_producer.
|
219
|
+
# @return [Integer]
|
220
|
+
setting :delivery_interval, 0
|
221
|
+
|
222
|
+
# Set this to true to keep the producer connection between publish calls.
|
223
|
+
# This can speed up subsequent messages by around 30%, but it does mean
|
224
|
+
# that you need to manually call sync_producer_shutdown before exiting,
|
225
|
+
# similar to async_producer_shutdown.
|
226
|
+
# @return [Boolean]
|
227
|
+
setting :persistent_connections, false
|
228
|
+
|
229
|
+
# Default namespace for all producers. Can remain nil. Individual
|
230
|
+
# producers can override.
|
231
|
+
# @return [String]
|
232
|
+
setting :schema_namespace
|
233
|
+
|
234
|
+
# Add a prefix to all topic names. This can be useful if you're using
|
235
|
+
# the same Kafka broker for different environments that are producing
|
236
|
+
# the same topics.
|
237
|
+
# @return [String]
|
238
|
+
setting :topic_prefix
|
239
|
+
|
240
|
+
# Disable all actual message producing. Generally more useful to use
|
241
|
+
# the `disable_producers` method instead.
|
242
|
+
# @return [Boolean]
|
243
|
+
setting :disabled
|
244
|
+
|
245
|
+
# Currently can be set to :db, :kafka, or :kafka_async. If using Kafka
|
246
|
+
# directly, a good pattern is to set to async in your user-facing app, and
|
247
|
+
# sync in your consumers or delayed workers.
|
248
|
+
# @return [Symbol]
|
249
|
+
setting :backend, :kafka_async
|
250
|
+
end
|
251
|
+
|
252
|
+
setting :schema do
|
253
|
+
# URL of the Confluent schema registry.
|
254
|
+
# @return [String]
|
255
|
+
setting :registry_url, 'http://localhost:8081'
|
256
|
+
|
257
|
+
# Local path to look for schemas in.
|
258
|
+
# @return [String]
|
259
|
+
setting :path
|
260
|
+
end
|
261
|
+
|
262
|
+
# The configured metrics provider.
|
263
|
+
# @return [Metrics::Provider]
|
264
|
+
setting :metrics, Metrics::Mock.new
|
265
|
+
|
266
|
+
# The configured tracing / APM provider.
|
267
|
+
# @return [Tracing::Provider]
|
268
|
+
setting :tracer, Tracing::Mock.new
|
269
|
+
|
270
|
+
setting :db_producer do
|
271
|
+
|
272
|
+
# @return [Logger]
|
273
|
+
setting :logger, default_proc: proc { Deimos.config.logger }
|
274
|
+
|
275
|
+
# @return [Symbol|Array<String>] A list of topics to log all messages, or
|
276
|
+
# :all to log all topics.
|
277
|
+
setting :log_topics, []
|
278
|
+
|
279
|
+
# @return [Symbol|Array<String>] A list of topics to compact messages for
|
280
|
+
# before sending, or :all to compact all keyed messages.
|
281
|
+
setting :compact_topics, []
|
282
|
+
|
283
|
+
end
|
284
|
+
|
285
|
+
setting_object :producer do
|
286
|
+
# Producer class.
|
287
|
+
# @return [String]
|
288
|
+
setting :class_name
|
289
|
+
# Topic to produce to.
|
290
|
+
# @return [String]
|
291
|
+
setting :topic
|
292
|
+
# Schema of the data in the topic.
|
293
|
+
# @return [String]
|
294
|
+
setting :schema
|
295
|
+
# Optional namespace to access the schema.
|
296
|
+
# @return [String]
|
297
|
+
setting :namespace
|
298
|
+
# Key configuration (see docs).
|
299
|
+
# @return [Hash]
|
300
|
+
setting :key_config
|
301
|
+
end
|
302
|
+
|
303
|
+
setting_object :consumer do
|
304
|
+
# Consumer class.
|
305
|
+
# @return [String]
|
306
|
+
setting :class_name
|
307
|
+
# Topic to read from.
|
308
|
+
# @return [String]
|
309
|
+
setting :topic
|
310
|
+
# Schema of the data in the topic.
|
311
|
+
# @return [String]
|
312
|
+
setting :schema
|
313
|
+
# Optional namespace to access the schema.
|
314
|
+
# @return [String]
|
315
|
+
setting :namespace
|
316
|
+
# Key configuration (see docs).
|
317
|
+
# @return [Hash]
|
318
|
+
setting :key_config
|
319
|
+
|
320
|
+
# These are the phobos "listener" configs. See CONFIGURATION.md for more
|
321
|
+
# info.
|
322
|
+
setting :group_id
|
323
|
+
setting :max_concurrency
|
324
|
+
setting :start_from_beginning
|
325
|
+
setting :max_bytes_per_partition
|
326
|
+
setting :min_bytes
|
327
|
+
setting :max_wait_time
|
328
|
+
setting :force_encoding
|
329
|
+
setting :delivery
|
330
|
+
setting :backoff
|
331
|
+
setting :session_timeout
|
332
|
+
setting :offset_commit_interval
|
333
|
+
setting :offset_commit_threshold
|
334
|
+
setting :offset_retention_time
|
335
|
+
setting :heartbeat_interval
|
336
|
+
end
|
337
|
+
|
338
|
+
deprecate 'kafka_logger', 'kafka.logger'
|
339
|
+
deprecate 'reraise_consumer_errors', 'consumers.reraise_errors'
|
340
|
+
deprecate 'schema_registry_url', 'schema.registry_url'
|
341
|
+
deprecate 'seed_broker', 'kafka.seed_brokers'
|
342
|
+
deprecate 'schema_path', 'schema.path'
|
343
|
+
deprecate 'producer_schema_namespace', 'producers.schema_namespace'
|
344
|
+
deprecate 'producer_topic_prefix', 'producers.topic_prefix'
|
345
|
+
deprecate 'disable_producers', 'producers.disabled'
|
346
|
+
deprecate 'ssl_enabled', 'kafka.ssl.enabled'
|
347
|
+
deprecate 'ssl_ca_cert', 'kafka.ssl.ca_cert'
|
348
|
+
deprecate 'ssl_client_cert', 'kafka.ssl.client_cert'
|
349
|
+
deprecate 'ssl_client_cert_key', 'kafka.ssl.client_cert_key'
|
350
|
+
deprecate 'publish_backend', 'producers.backend'
|
351
|
+
deprecate 'report_lag', 'consumers.report_lag'
|
352
|
+
|
353
|
+
end
|
354
|
+
end
|