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.
Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +0 -17
  3. data/.tool-versions +1 -0
  4. data/CHANGELOG.md +1 -1
  5. data/README.md +287 -498
  6. data/deimos-ruby.gemspec +4 -4
  7. data/docs/CONFIGURATION.md +133 -227
  8. data/docs/UPGRADING.md +237 -0
  9. data/lib/deimos/active_record_consume/batch_consumption.rb +28 -29
  10. data/lib/deimos/active_record_consume/message_consumption.rb +15 -21
  11. data/lib/deimos/active_record_consumer.rb +36 -26
  12. data/lib/deimos/active_record_producer.rb +28 -9
  13. data/lib/deimos/backends/base.rb +4 -35
  14. data/lib/deimos/backends/kafka.rb +6 -22
  15. data/lib/deimos/backends/kafka_async.rb +6 -22
  16. data/lib/deimos/backends/{db.rb → outbox.rb} +13 -9
  17. data/lib/deimos/config/configuration.rb +116 -385
  18. data/lib/deimos/consume/batch_consumption.rb +24 -124
  19. data/lib/deimos/consume/message_consumption.rb +36 -63
  20. data/lib/deimos/consumer.rb +16 -75
  21. data/lib/deimos/ext/consumer_route.rb +35 -0
  22. data/lib/deimos/ext/producer_middleware.rb +94 -0
  23. data/lib/deimos/ext/producer_route.rb +22 -0
  24. data/lib/deimos/ext/redraw.rb +29 -0
  25. data/lib/deimos/ext/routing_defaults.rb +72 -0
  26. data/lib/deimos/ext/schema_route.rb +70 -0
  27. data/lib/deimos/kafka_message.rb +2 -2
  28. data/lib/deimos/kafka_source.rb +2 -7
  29. data/lib/deimos/kafka_topic_info.rb +1 -1
  30. data/lib/deimos/logging.rb +71 -0
  31. data/lib/deimos/message.rb +2 -11
  32. data/lib/deimos/metrics/datadog.rb +40 -1
  33. data/lib/deimos/metrics/provider.rb +4 -4
  34. data/lib/deimos/producer.rb +39 -116
  35. data/lib/deimos/railtie.rb +6 -0
  36. data/lib/deimos/schema_backends/avro_base.rb +21 -21
  37. data/lib/deimos/schema_backends/avro_schema_registry.rb +1 -2
  38. data/lib/deimos/schema_backends/avro_validation.rb +2 -2
  39. data/lib/deimos/schema_backends/base.rb +19 -12
  40. data/lib/deimos/schema_backends/mock.rb +6 -1
  41. data/lib/deimos/schema_backends/plain.rb +47 -0
  42. data/lib/deimos/schema_class/base.rb +2 -2
  43. data/lib/deimos/schema_class/enum.rb +1 -1
  44. data/lib/deimos/schema_class/record.rb +2 -2
  45. data/lib/deimos/test_helpers.rb +95 -320
  46. data/lib/deimos/tracing/provider.rb +6 -6
  47. data/lib/deimos/transcoder.rb +88 -0
  48. data/lib/deimos/utils/db_poller/base.rb +16 -14
  49. data/lib/deimos/utils/db_poller/state_based.rb +3 -3
  50. data/lib/deimos/utils/db_poller/time_based.rb +4 -4
  51. data/lib/deimos/utils/db_poller.rb +1 -1
  52. data/lib/deimos/utils/deadlock_retry.rb +1 -1
  53. data/lib/deimos/utils/{db_producer.rb → outbox_producer.rb} +16 -47
  54. data/lib/deimos/utils/schema_class.rb +0 -7
  55. data/lib/deimos/version.rb +1 -1
  56. data/lib/deimos.rb +79 -26
  57. data/lib/generators/deimos/{db_backend_generator.rb → outbox_backend_generator.rb} +4 -4
  58. data/lib/generators/deimos/schema_class_generator.rb +0 -1
  59. data/lib/generators/deimos/v2/templates/karafka.rb.tt +149 -0
  60. data/lib/generators/deimos/v2_generator.rb +193 -0
  61. data/lib/tasks/deimos.rake +5 -7
  62. data/spec/active_record_batch_consumer_association_spec.rb +22 -13
  63. data/spec/active_record_batch_consumer_spec.rb +84 -65
  64. data/spec/active_record_consume/batch_consumption_spec.rb +10 -10
  65. data/spec/active_record_consume/batch_slicer_spec.rb +12 -12
  66. data/spec/active_record_consumer_spec.rb +29 -13
  67. data/spec/active_record_producer_spec.rb +36 -26
  68. data/spec/backends/base_spec.rb +0 -23
  69. data/spec/backends/kafka_async_spec.rb +1 -3
  70. data/spec/backends/kafka_spec.rb +1 -3
  71. data/spec/backends/{db_spec.rb → outbox_spec.rb} +14 -20
  72. data/spec/batch_consumer_spec.rb +66 -116
  73. data/spec/consumer_spec.rb +53 -147
  74. data/spec/deimos_spec.rb +10 -126
  75. data/spec/kafka_source_spec.rb +19 -52
  76. data/spec/karafka/karafka.rb +69 -0
  77. data/spec/karafka_config/karafka_spec.rb +97 -0
  78. data/spec/logging_spec.rb +25 -0
  79. data/spec/message_spec.rb +9 -9
  80. data/spec/producer_spec.rb +112 -254
  81. data/spec/rake_spec.rb +1 -3
  82. data/spec/schema_backends/avro_validation_spec.rb +1 -1
  83. data/spec/schemas/com/my-namespace/MySchemaWithTitle.avsc +22 -0
  84. data/spec/snapshots/consumers-no-nest.snap +49 -0
  85. data/spec/snapshots/consumers.snap +49 -0
  86. data/spec/snapshots/consumers_and_producers-no-nest.snap +49 -0
  87. data/spec/snapshots/consumers_and_producers.snap +49 -0
  88. data/spec/snapshots/consumers_circular-no-nest.snap +49 -0
  89. data/spec/snapshots/consumers_circular.snap +49 -0
  90. data/spec/snapshots/consumers_complex_types-no-nest.snap +49 -0
  91. data/spec/snapshots/consumers_complex_types.snap +49 -0
  92. data/spec/snapshots/consumers_nested-no-nest.snap +49 -0
  93. data/spec/snapshots/consumers_nested.snap +49 -0
  94. data/spec/snapshots/namespace_folders.snap +49 -0
  95. data/spec/snapshots/namespace_map.snap +49 -0
  96. data/spec/snapshots/producers_with_key-no-nest.snap +49 -0
  97. data/spec/snapshots/producers_with_key.snap +49 -0
  98. data/spec/spec_helper.rb +61 -29
  99. data/spec/utils/db_poller_spec.rb +49 -39
  100. data/spec/utils/{db_producer_spec.rb → outbox_producer_spec.rb} +17 -184
  101. metadata +58 -67
  102. data/lib/deimos/batch_consumer.rb +0 -7
  103. data/lib/deimos/config/phobos_config.rb +0 -164
  104. data/lib/deimos/instrumentation.rb +0 -95
  105. data/lib/deimos/monkey_patches/phobos_cli.rb +0 -35
  106. data/lib/deimos/utils/inline_consumer.rb +0 -158
  107. data/lib/deimos/utils/lag_reporter.rb +0 -186
  108. data/lib/deimos/utils/schema_controller_mixin.rb +0 -129
  109. data/spec/config/configuration_spec.rb +0 -329
  110. data/spec/kafka_listener_spec.rb +0 -55
  111. data/spec/phobos.bad_db.yml +0 -73
  112. data/spec/phobos.yml +0 -77
  113. data/spec/utils/inline_consumer_spec.rb +0 -31
  114. data/spec/utils/lag_reporter_spec.rb +0 -76
  115. data/spec/utils/platform_schema_validation_spec.rb +0 -0
  116. data/spec/utils/schema_controller_mixin_spec.rb +0 -84
  117. /data/lib/generators/deimos/{db_backend → outbox_backend}/templates/migration +0 -0
  118. /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
- Deimos.instrument(
19
- 'produce',
20
- producer: producer_class,
21
- topic: producer_class.topic,
22
- payloads: messages.map(&:payload)
23
- ) do
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
- Deimos.instrument(
19
- 'produce',
20
- producer: producer_class,
21
- topic: producer_class.topic,
22
- payloads: messages.map(&:payload)
23
- ) do
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 Db < Base
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.encoded_payload ? m.encoded_payload.to_s.b : nil,
16
- topic: m.topic,
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.encoded_key.to_s.b unless producer_class.config[:no_keys]
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
- 'db_producer.insert',
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
- return message.partition_key if message.partition_key.present?
34
- return message.key unless message.key.is_a?(Hash)
35
-
36
- message.key.to_yaml
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