deimos-ruby 2.2.2 → 2.2.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ca14735549cff155e75b761beafaf9cc663da80a5b0cc5db9a7ad67934cb7276
4
- data.tar.gz: 302d52cf0d80701337ce576b55ff201ebce7968b37194070bdfe5f269901f51b
3
+ metadata.gz: 06c3e1257753ef449b29b14aec9bc9d50c481def390540bd50469521e8ac0d2c
4
+ data.tar.gz: eb2fd72ae7e43197cfc3939cf3ceb499f50ba4a22100764220d53806984b1dba
5
5
  SHA512:
6
- metadata.gz: b3044b241cb7dab960e1e394d1438c39fa0fda920db8ce57375ac9e864bd3698182b400886efbdd7057e8232dfbfafa02a97d8ab9313f1a6edf502360dbb5c14
7
- data.tar.gz: 8b1c0b604484db8425fd3f5dc57fc136d46ef2bbdfbc11027638f89b10db90088a0496ff00ea0022cd897b55fca16afe8daa86b5ca13f777aa3a2509b13fa5d5
6
+ metadata.gz: 8f66a93ddf51ededa22eaa4ebd08bee6b572ea23736bf6b2b5ee65bbed96950ac42818f5fc22dc4afa946f10731d968744dde1717dc6a07de604894860c4f342
7
+ data.tar.gz: 9f480e7218b4636a05b16448521843299f560426e3c63e67939c153b29539b2651317b09388fda25d9cdece98e4cfa14c20bbd4cf19bdb9257cb8ddd67805950
data/.gitignore CHANGED
@@ -41,3 +41,4 @@ test.sqlite3
41
41
 
42
42
  .idea
43
43
  /.gem_rbs_collection/
44
+ .claude
data/CHANGELOG.md CHANGED
@@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## UNRELEASED
9
9
 
10
+ - Feature: Support broker setting per topic in producer configs.
11
+
10
12
  # 2.2.2 - 2025-11-7
11
13
 
12
14
  - Fix: Calling `producer_classes` on a topic config could make all topics disappear. :(
@@ -6,7 +6,7 @@ module Deimos
6
6
  class Kafka < Base
7
7
  # :nodoc:
8
8
  def self.execute(producer_class:, messages:)
9
- Karafka.producer.produce_many_sync(messages)
9
+ Deimos.producer_for(producer_class.topic).produce_many_sync(messages)
10
10
  end
11
11
  end
12
12
  end
@@ -4,9 +4,10 @@ module Deimos
4
4
  module Backends
5
5
  # Backend which produces to Kafka via an async producer.
6
6
  class KafkaAsync < Base
7
+
7
8
  # :nodoc:
8
9
  def self.execute(producer_class:, messages:)
9
- Karafka.producer.produce_many_async(messages)
10
+ Deimos.producer_for(producer_class.topic).produce_many_async(messages)
10
11
  end
11
12
  end
12
13
  end
@@ -58,7 +58,9 @@ module Deimos
58
58
  end
59
59
  end
60
60
  Karafka::Setup::Config.setup if Karafka.producer.nil?
61
- Karafka.producer.monitor.subscribe(waterdrop_listener)
61
+ Deimos.waterdrop_producers.each do |producer|
62
+ producer.monitor.subscribe(waterdrop_listener)
63
+ end
62
64
  end
63
65
 
64
66
  # :nodoc:
@@ -207,7 +207,7 @@ module Deimos
207
207
 
208
208
  batch[current_index..-1].in_groups_of(batch_size, false).each do |group|
209
209
  @logger.debug("Publishing #{group.size} messages to #{@current_topic}")
210
- Karafka.producer.produce_many_sync(group)
210
+ Deimos.producer_for(@current_topic).produce_many_sync(group)
211
211
  current_index += group.size
212
212
  @logger.info("Sent #{group.size} messages to #{@current_topic}")
213
213
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Deimos
4
- VERSION = '2.2.2'
4
+ VERSION = '2.2.3-beta1'
5
5
  end
data/lib/deimos.rb CHANGED
@@ -142,23 +142,34 @@ module Deimos
142
142
  signal_handler.run!
143
143
  end
144
144
 
145
- def setup_karafka
146
- Karafka.producer.middleware.append(Deimos::ProducerMiddleware)
147
- # for multiple setup calls
148
- Karafka.producer.config.kafka =
149
- Karafka::Setup::AttributesMap.producer(Karafka::Setup::Config.config.kafka.dup)
150
- EVENT_TYPES.each { |type| Karafka.monitor.notifications_bus.register_event(type) }
151
-
152
- Karafka.producer.monitor.subscribe(ProducerMetricsListener.new)
145
+ def setup_producers
146
+ @producers = {}
147
+ producers_by_broker = {}
148
+ Deimos.karafka_configs.each do |topic|
149
+ broker = topic.kafka[:'bootstrap.servers']
150
+ producers_by_broker[broker] ||= ::WaterDrop::Producer.new do |p_config|
151
+ config_hash = Karafka::Setup::Config.config.kafka.merge(topic.kafka)
152
+ p_config.kafka = Karafka::Setup::AttributesMap.producer(config_hash)
153
+ end
154
+ @producers[topic.name] = producers_by_broker[broker]
155
+ end
156
+ end
153
157
 
154
- Karafka.producer.monitor.subscribe('error.occurred') do |event|
155
- if event.payload.key?(:messages)
156
- topic = event[:messages].first[:topic]
157
- config = Deimos.karafka_config_for(topic: topic)
158
- message = Deimos::Logging.messages_log_text(config&.payload_log, event[:messages])
159
- Karafka.logger.error("Error producing messages: #{event[:error].message} #{message.to_json}")
158
+ def setup_karafka
159
+ setup_producers
160
+ waterdrop_producers.each do |producer|
161
+ producer.middleware.append(Deimos::ProducerMiddleware)
162
+ producer.monitor.subscribe(ProducerMetricsListener.new)
163
+ producer.monitor.subscribe('error.occurred') do |event|
164
+ if event.payload.key?(:messages)
165
+ topic = event[:messages].first[:topic]
166
+ config = Deimos.karafka_config_for(topic: topic)
167
+ message = Deimos::Logging.messages_log_text(config&.payload_log, event[:messages])
168
+ Karafka.logger.error("Error producing messages: #{event[:error].message} #{message.to_json}")
169
+ end
160
170
  end
161
171
  end
172
+ EVENT_TYPES.each { |type| Karafka.monitor.notifications_bus.register_event(type) }
162
173
  end
163
174
 
164
175
  # @return [Array<Karafka::Routing::Topic]
@@ -176,7 +187,16 @@ module Deimos
176
187
  end
177
188
  end
178
189
 
179
- # @param handler_class [Class]
190
+ # @return [Array<::WaterDrop::Producer>]
191
+ def waterdrop_producers
192
+ @producers.values + [Karafka.producer]
193
+ end
194
+
195
+ # @param topic [String]
196
+ def producer_for(topic)
197
+ @producers[topic] || Karafka.producer
198
+ end
199
+
180
200
  # @return [String,nil]
181
201
  def topic_for_consumer(handler_class)
182
202
  Deimos.karafka_configs.each do |topic|
data/spec/deimos_spec.rb CHANGED
@@ -50,4 +50,35 @@ describe Deimos do
50
50
  end
51
51
  end
52
52
 
53
+ specify '#producer_for' do
54
+ Karafka::App.routes.redraw do
55
+ topic 'main-broker' do
56
+ active false
57
+ kafka({
58
+ 'bootstrap.servers': 'broker1:9092'
59
+ })
60
+ end
61
+ topic 'main-broker2' do
62
+ active false
63
+ kafka({
64
+ 'bootstrap.servers': 'broker1:9092'
65
+ })
66
+ end
67
+ topic 'other-broker' do
68
+ active false
69
+ kafka({
70
+ 'bootstrap.servers': 'broker2:9092'
71
+ })
72
+ end
73
+ end
74
+ described_class.setup_producers
75
+
76
+ producer1 = described_class.producer_for('main-broker')
77
+ producer2 = described_class.producer_for('main-broker2')
78
+ producer3 = described_class.producer_for('other-broker')
79
+ expect(producer1).to eq(producer2)
80
+ expect(producer1.config.kafka[:'bootstrap.servers']).to eq('broker1:9092')
81
+ expect(producer3.config.kafka[:'bootstrap.servers']).to eq('broker2:9092')
82
+ end
83
+
53
84
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deimos-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.2
4
+ version: 2.2.3.pre.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Orner
@@ -698,7 +698,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
698
698
  - !ruby/object:Gem::Version
699
699
  version: '0'
700
700
  requirements: []
701
- rubygems_version: 3.6.9
701
+ rubygems_version: 4.0.3
702
702
  specification_version: 4
703
703
  summary: Kafka libraries for Ruby.
704
704
  test_files: []