Skip to content

Commit b6a6dd5

Browse files
authored
Merge pull request #53 from mxenabled/et/messages-per-batch
Adds the abilit to specify batch sizes to add another tunable lever.
2 parents 069b310 + c90c2ac commit b6a6dd5

4 files changed

Lines changed: 17 additions & 5 deletions

File tree

lib/active_publisher/async/in_memory_adapter/consumer_thread.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ module ActivePublisher
22
module Async
33
module InMemoryAdapter
44
class ConsumerThread
5-
attr_reader :channel, :thread, :queue, :sampled_queue_size, :last_tick_at
5+
attr_reader :channel, :flush_max, :thread, :queue, :sampled_queue_size, :last_tick_at
66

77
if ::RUBY_PLATFORM == "java"
88
CHANNEL_CLOSED_ERRORS = [::MarchHare::ChannelAlreadyClosed]
@@ -27,6 +27,7 @@ class ConsumerThread
2727
def initialize(listen_queue)
2828
@queue = listen_queue
2929
@sampled_queue_size = queue.size
30+
@flush_max = ::ActivePublisher.configuration.messages_per_batch
3031

3132
update_last_tick_at
3233
start_thread
@@ -96,7 +97,7 @@ def start_consuming_thread
9697
loop do
9798
# Sample the queue size so we don't shutdown when messages are in flight.
9899
@sampled_queue_size = queue.size
99-
current_messages = queue.pop_up_to(50, :timeout => 0.1)
100+
current_messages = queue.pop_up_to(flush_max, :timeout => 0.1)
100101
update_last_tick_at
101102
# If the queue is empty, we should continue to update to "last_tick_at" time.
102103
next if current_messages.nil?

lib/active_publisher/async/redis_adapter.rb

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,16 @@ class Adapter
1919
}
2020
include ::ActivePublisher::Logging
2121

22-
attr_reader :async_queue, :redis_pool, :queue
22+
attr_reader :async_queue, :flush_max, :flush_min, :redis_pool, :queue
2323

2424
def initialize(new_redis_pool)
2525
logger.info "Starting redis publisher adapter"
2626
# do something with supervision ?
2727
@redis_pool = new_redis_pool
2828
@async_queue = ::ActivePublisher::Async::RedisAdapter::Consumer.new(redis_pool)
2929
@queue = ::MultiOpQueue::Queue.new
30+
@flush_max = ::ActivePublisher.configuration.messages_per_batch
31+
@flush_min = @flush_max / 2
3032

3133
supervisor_task = ::Concurrent::TimerTask.new(SUPERVISOR_INTERVAL) do
3234
queue_size = queue.size
@@ -41,7 +43,7 @@ def initialize(new_redis_pool)
4143
def publish(route, payload, exchange_name, options = {})
4244
message = ::ActivePublisher::Message.new(route, payload, exchange_name, options)
4345
queue << ::Marshal.dump(message)
44-
flush_queue! if queue.size >= 20 || options[:flush_queue]
46+
flush_queue! if queue.size >= flush_min || options[:flush_queue]
4547

4648
nil
4749
end
@@ -58,7 +60,7 @@ def shutdown!
5860

5961
def flush_queue!
6062
return if queue.empty?
61-
encoded_messages = queue.pop_up_to(25, :timeout => 0.001)
63+
encoded_messages = queue.pop_up_to(flush_max, :timeout => 0.001)
6264

6365
return if encoded_messages.nil?
6466
return unless encoded_messages.respond_to?(:each)

lib/active_publisher/configuration.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ class Configuration
88
:host,
99
:hosts,
1010
:max_async_publisher_lag_time,
11+
:messages_per_batch,
1112
:network_recovery_interval,
1213
:password,
1314
:port,
@@ -36,6 +37,7 @@ class Configuration
3637
:host => "localhost",
3738
:hosts => [],
3839
:password => "guest",
40+
:messages_per_batch => 25,
3941
:max_async_publisher_lag_time => 10,
4042
:network_recovery_interval => NETWORK_RECOVERY_INTERVAL,
4143
:port => 5672,

spec/lib/active_publisher/configuration_spec.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,13 @@
3636
expect(::ActivePublisher.configuration.verify_peer).to eq(false)
3737
end
3838

39+
it "can use messages_per_batch" do
40+
expect(::ActivePublisher.configuration.messages_per_batch).to eq(25)
41+
expect(::ActivePublisher.configuration).to receive(:messages_per_batch=).with(50).and_call_original
42+
::ActivePublisher::Configuration.configure_from_yaml_and_cli({"messages_per_batch" => 50}, true)
43+
expect(::ActivePublisher.configuration.messages_per_batch).to eq(50)
44+
end
45+
3946
context "when using a yaml file" do
4047
let!(:sample_yaml_location) { ::File.expand_path(::File.join("spec", "support", "sample_config.yml")) }
4148

0 commit comments

Comments
 (0)