deimos-ruby 1.24.3 → 2.0.0.pre.alpha1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +0 -17
- data/.tool-versions +1 -0
- data/CHANGELOG.md +1 -1
- data/README.md +287 -498
- data/deimos-ruby.gemspec +4 -4
- data/docs/CONFIGURATION.md +133 -227
- data/docs/UPGRADING.md +237 -0
- data/lib/deimos/active_record_consume/batch_consumption.rb +28 -29
- data/lib/deimos/active_record_consume/message_consumption.rb +15 -21
- data/lib/deimos/active_record_consumer.rb +36 -26
- data/lib/deimos/active_record_producer.rb +28 -9
- data/lib/deimos/backends/base.rb +4 -35
- data/lib/deimos/backends/kafka.rb +6 -22
- data/lib/deimos/backends/kafka_async.rb +6 -22
- data/lib/deimos/backends/{db.rb → outbox.rb} +13 -9
- data/lib/deimos/config/configuration.rb +116 -385
- data/lib/deimos/consume/batch_consumption.rb +24 -124
- data/lib/deimos/consume/message_consumption.rb +36 -63
- data/lib/deimos/consumer.rb +16 -75
- data/lib/deimos/ext/consumer_route.rb +35 -0
- data/lib/deimos/ext/producer_middleware.rb +94 -0
- data/lib/deimos/ext/producer_route.rb +22 -0
- data/lib/deimos/ext/redraw.rb +29 -0
- data/lib/deimos/ext/routing_defaults.rb +72 -0
- data/lib/deimos/ext/schema_route.rb +70 -0
- data/lib/deimos/kafka_message.rb +2 -2
- data/lib/deimos/kafka_source.rb +2 -7
- data/lib/deimos/kafka_topic_info.rb +1 -1
- data/lib/deimos/logging.rb +71 -0
- data/lib/deimos/message.rb +2 -11
- data/lib/deimos/metrics/datadog.rb +40 -1
- data/lib/deimos/metrics/provider.rb +4 -4
- data/lib/deimos/producer.rb +39 -116
- data/lib/deimos/railtie.rb +6 -0
- data/lib/deimos/schema_backends/avro_base.rb +21 -21
- data/lib/deimos/schema_backends/avro_schema_registry.rb +1 -2
- data/lib/deimos/schema_backends/avro_validation.rb +2 -2
- data/lib/deimos/schema_backends/base.rb +19 -12
- data/lib/deimos/schema_backends/mock.rb +6 -1
- data/lib/deimos/schema_backends/plain.rb +47 -0
- data/lib/deimos/schema_class/base.rb +2 -2
- data/lib/deimos/schema_class/enum.rb +1 -1
- data/lib/deimos/schema_class/record.rb +2 -2
- data/lib/deimos/test_helpers.rb +95 -320
- data/lib/deimos/tracing/provider.rb +6 -6
- data/lib/deimos/transcoder.rb +88 -0
- data/lib/deimos/utils/db_poller/base.rb +16 -14
- data/lib/deimos/utils/db_poller/state_based.rb +3 -3
- data/lib/deimos/utils/db_poller/time_based.rb +4 -4
- data/lib/deimos/utils/db_poller.rb +1 -1
- data/lib/deimos/utils/deadlock_retry.rb +1 -1
- data/lib/deimos/utils/{db_producer.rb → outbox_producer.rb} +16 -47
- data/lib/deimos/utils/schema_class.rb +0 -7
- data/lib/deimos/version.rb +1 -1
- data/lib/deimos.rb +79 -26
- data/lib/generators/deimos/{db_backend_generator.rb → outbox_backend_generator.rb} +4 -4
- data/lib/generators/deimos/schema_class_generator.rb +0 -1
- data/lib/generators/deimos/v2/templates/karafka.rb.tt +149 -0
- data/lib/generators/deimos/v2_generator.rb +193 -0
- data/lib/tasks/deimos.rake +5 -7
- data/spec/active_record_batch_consumer_association_spec.rb +22 -13
- data/spec/active_record_batch_consumer_spec.rb +84 -65
- data/spec/active_record_consume/batch_consumption_spec.rb +10 -10
- data/spec/active_record_consume/batch_slicer_spec.rb +12 -12
- data/spec/active_record_consumer_spec.rb +29 -13
- data/spec/active_record_producer_spec.rb +36 -26
- data/spec/backends/base_spec.rb +0 -23
- data/spec/backends/kafka_async_spec.rb +1 -3
- data/spec/backends/kafka_spec.rb +1 -3
- data/spec/backends/{db_spec.rb → outbox_spec.rb} +14 -20
- data/spec/batch_consumer_spec.rb +66 -116
- data/spec/consumer_spec.rb +53 -147
- data/spec/deimos_spec.rb +10 -126
- data/spec/kafka_source_spec.rb +19 -52
- data/spec/karafka/karafka.rb +69 -0
- data/spec/karafka_config/karafka_spec.rb +97 -0
- data/spec/logging_spec.rb +25 -0
- data/spec/message_spec.rb +9 -9
- data/spec/producer_spec.rb +112 -254
- data/spec/rake_spec.rb +1 -3
- data/spec/schema_backends/avro_validation_spec.rb +1 -1
- data/spec/schemas/com/my-namespace/MySchemaWithTitle.avsc +22 -0
- data/spec/snapshots/consumers-no-nest.snap +49 -0
- data/spec/snapshots/consumers.snap +49 -0
- data/spec/snapshots/consumers_and_producers-no-nest.snap +49 -0
- data/spec/snapshots/consumers_and_producers.snap +49 -0
- data/spec/snapshots/consumers_circular-no-nest.snap +49 -0
- data/spec/snapshots/consumers_circular.snap +49 -0
- data/spec/snapshots/consumers_complex_types-no-nest.snap +49 -0
- data/spec/snapshots/consumers_complex_types.snap +49 -0
- data/spec/snapshots/consumers_nested-no-nest.snap +49 -0
- data/spec/snapshots/consumers_nested.snap +49 -0
- data/spec/snapshots/namespace_folders.snap +49 -0
- data/spec/snapshots/namespace_map.snap +49 -0
- data/spec/snapshots/producers_with_key-no-nest.snap +49 -0
- data/spec/snapshots/producers_with_key.snap +49 -0
- data/spec/spec_helper.rb +61 -29
- data/spec/utils/db_poller_spec.rb +49 -39
- data/spec/utils/{db_producer_spec.rb → outbox_producer_spec.rb} +17 -184
- metadata +58 -67
- data/lib/deimos/batch_consumer.rb +0 -7
- data/lib/deimos/config/phobos_config.rb +0 -164
- data/lib/deimos/instrumentation.rb +0 -95
- data/lib/deimos/monkey_patches/phobos_cli.rb +0 -35
- data/lib/deimos/utils/inline_consumer.rb +0 -158
- data/lib/deimos/utils/lag_reporter.rb +0 -186
- data/lib/deimos/utils/schema_controller_mixin.rb +0 -129
- data/spec/config/configuration_spec.rb +0 -329
- data/spec/kafka_listener_spec.rb +0 -55
- data/spec/phobos.bad_db.yml +0 -73
- data/spec/phobos.yml +0 -77
- data/spec/utils/inline_consumer_spec.rb +0 -31
- data/spec/utils/lag_reporter_spec.rb +0 -76
- data/spec/utils/platform_schema_validation_spec.rb +0 -0
- data/spec/utils/schema_controller_mixin_spec.rb +0 -84
- /data/lib/generators/deimos/{db_backend → outbox_backend}/templates/migration +0 -0
- /data/lib/generators/deimos/{db_backend → outbox_backend}/templates/rails3_migration +0 -0
@@ -4,30 +4,14 @@ module Deimos
|
|
4
4
|
module Backends
|
5
5
|
# Default backend to produce to Kafka.
|
6
6
|
class Kafka < Base
|
7
|
-
include Phobos::Producer
|
8
|
-
|
9
|
-
# Shut down the producer if necessary.
|
10
|
-
# @return [void]
|
11
|
-
def self.shutdown_producer
|
12
|
-
producer.sync_producer_shutdown if producer.respond_to?(:sync_producer_shutdown)
|
13
|
-
producer.kafka_client&.close
|
14
|
-
end
|
15
|
-
|
16
7
|
# :nodoc:
|
17
8
|
def self.execute(producer_class:, messages:)
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
)
|
24
|
-
producer.publish_list(messages.map(&:encoded_hash))
|
25
|
-
Deimos.config.metrics&.increment(
|
26
|
-
'publish',
|
27
|
-
tags: %W(status:success topic:#{producer_class.topic}),
|
28
|
-
by: messages.size
|
29
|
-
)
|
30
|
-
end
|
9
|
+
Karafka.producer.produce_many_sync(messages)
|
10
|
+
Deimos.config.metrics&.increment(
|
11
|
+
'publish',
|
12
|
+
tags: %W(status:success topic:#{messages.first[:topic]}),
|
13
|
+
by: messages.size
|
14
|
+
)
|
31
15
|
end
|
32
16
|
end
|
33
17
|
end
|
@@ -4,30 +4,14 @@ module Deimos
|
|
4
4
|
module Backends
|
5
5
|
# Backend which produces to Kafka via an async producer.
|
6
6
|
class KafkaAsync < Base
|
7
|
-
include Phobos::Producer
|
8
|
-
|
9
|
-
# Shut down the producer cleanly.
|
10
|
-
# @return [void]
|
11
|
-
def self.shutdown_producer
|
12
|
-
producer.async_producer_shutdown
|
13
|
-
producer.kafka_client&.close
|
14
|
-
end
|
15
|
-
|
16
7
|
# :nodoc:
|
17
8
|
def self.execute(producer_class:, messages:)
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
)
|
24
|
-
producer.async_publish_list(messages.map(&:encoded_hash))
|
25
|
-
Deimos.config.metrics&.increment(
|
26
|
-
'publish',
|
27
|
-
tags: %W(status:success topic:#{producer_class.topic}),
|
28
|
-
by: messages.size
|
29
|
-
)
|
30
|
-
end
|
9
|
+
Karafka.producer.produce_many_async(messages)
|
10
|
+
Deimos.config.metrics&.increment(
|
11
|
+
'publish',
|
12
|
+
tags: %W(status:success topic:#{messages.first[:topic]}),
|
13
|
+
by: messages.size
|
14
|
+
)
|
31
15
|
end
|
32
16
|
end
|
33
17
|
end
|
@@ -6,22 +6,23 @@ module Deimos
|
|
6
6
|
module Backends
|
7
7
|
# Backend which saves messages to the database instead of immediately
|
8
8
|
# sending them.
|
9
|
-
class
|
9
|
+
class Outbox < Base
|
10
10
|
class << self
|
11
11
|
# :nodoc:
|
12
12
|
def execute(producer_class:, messages:)
|
13
13
|
records = messages.map do |m|
|
14
|
+
Deimos::ProducerMiddleware.call(m)
|
14
15
|
message = Deimos::KafkaMessage.new(
|
15
|
-
message: m
|
16
|
-
topic: m
|
16
|
+
message: m[:payload] ? m[:payload].to_s.b : nil,
|
17
|
+
topic: m[:topic],
|
17
18
|
partition_key: partition_key_for(m)
|
18
19
|
)
|
19
|
-
message.key = m.
|
20
|
+
message.key = m[:key].to_s.b if m[:key]
|
20
21
|
message
|
21
22
|
end
|
22
23
|
Deimos::KafkaMessage.import(records)
|
23
24
|
Deimos.config.metrics&.increment(
|
24
|
-
'
|
25
|
+
'outbox.insert',
|
25
26
|
tags: %W(topic:#{producer_class.topic}),
|
26
27
|
by: records.size
|
27
28
|
)
|
@@ -30,10 +31,13 @@ module Deimos
|
|
30
31
|
# @param message [Deimos::Message]
|
31
32
|
# @return [String] the partition key to use for this message
|
32
33
|
def partition_key_for(message)
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
34
|
+
if message[:partition_key].present?
|
35
|
+
message[:partition_key]
|
36
|
+
elsif message[:key].present?
|
37
|
+
message[:key].to_s.b
|
38
|
+
else
|
39
|
+
nil
|
40
|
+
end
|
37
41
|
end
|
38
42
|
end
|
39
43
|
end
|