Standalone Karafka library for producing Kafka messages
reload_on_transaction_fatal_error
to reload the librdkafka after transactional failuresreport_metric
(YadhuPrakash)#idempotent?
similar to #transactional?
.#with
named #variant
.acks
altering variants on idempotent producers.delegate
for non-Rails use-cases. Always require delegate for variants usage (samsm)SecureRandom.hex(6)
producers ids with waterdrop-hex
to indicate type of object.This release contains BREAKING changes. Make sure to read and apply upgrade notes.
2.7
support.message.timeout.ms
is less that max_wait_time
so we do not end up with not final verdict.ms
and not mixed.wait_timeout
configuration option.flush_sync
or flush_async
.WaterDrop::Producer#transaction?
that returns only when producer has an active transaction running.instrument_on_wait_queue_full
flag (defaults to true
) to be able to configure whether non critical (retryable) queue full errors should be instrumented in the error pipeline. Useful when building high-performance pipes with WaterDrop queue retry backoff as a throttler.rdkafka
thread executable code sections.PLEASE MAKE SURE TO READ AND APPLY THEM!
wait_timeout
Configuration No Longer NeededThe wait_timeout
WaterDrop configuration option is no longer needed. You can safely remove it.
producer = WaterDrop::Producer.new
producer.setup do |config|
# Other config...
# Remove this, no longer needed
config.wait_timeout = 30
end
All time-related values are now configured in milliseconds instead of some being in seconds and some in milliseconds.
The values that were changed from seconds to milliseconds are:
max_wait_timeout
wait_backoff_on_queue_full
wait_timeout_on_queue_full
wait_backoff_on_transaction_command, default
If you have configured any of those yourself, please replace the seconds representation with milliseconds:
producer = WaterDrop::Producer.new
producer.setup do |config|
config.deliver = true
# Replace this:
config.max_wait_timeout = 30
# With
config.max_wait_timeout = 30_000
# ...
end
In this release, we've updated our default settings to address a crucial issue: previous defaults could lead to inconclusive outcomes in synchronous operations due to wait timeout errors. Users often mistakenly believed that a message dispatch was halted because of these errors when, in fact, the timeout was related to awaiting the final dispatch verdict, not the dispatch action itself.
The new defaults in WaterDrop 2.7.0 eliminate this confusion by ensuring synchronous operation results are always transparent and conclusive. This change aims to provide a straightforward understanding of wait timeout errors, reinforcing that they reflect the wait state, not the dispatch success.
Below, you can find a table with what has changed, the new defaults, and the current ones in case you want to retain the previous behavior:
Config | Previous Default | New Default |
---|---|---|
root max_wait_timeout |
5000 ms (5 seconds) | 60000 ms (60 seconds) |
kafka message.timeout.ms |
300000 ms (5 minutes) | 50000 ms (50 seconds) |
kafka transaction.timeout.ms |
60000 ms (1 minute) | 55000 ms (55 seconds) |
This alignment ensures that when using sync operations or invoking #wait
, any exception you get should give you a conclusive and final delivery verdict.
As of version 2.7.0
, WaterDrop has changed how message buffering works. Previously, messages underwent validation and middleware processing when they were buffered. Now, these steps are deferred until just before dispatching the messages. The buffer functions strictly as a thread-safe storage area without performing any validations or middleware operations until the messages are ready to be sent.
This adjustment was made primarily to ensure that middleware runs and validations are applied when most relevant—shortly before message dispatch. This approach addresses potential issues with buffers that might hold messages for extended periods:
Temporal Relevance: Validating and processing messages near their dispatch time helps ensure that actions such as partition assignments reflect the current system state. This is crucial in dynamic environments where system states are subject to rapid changes.
Stale State Management: By delaying validations and middleware to the dispatch phase, the system minimizes the risk of acting on outdated information, which could lead to incorrect processing or partitioning decisions.
# Prior to 2.7.0 this would raise an error
producer.buffer(topic: nil, payload: '')
# => WaterDrop::Errors::MessageInvalidError
# After 2.7.0 buffer will not, but flush_async will
producer.buffer(topic: nil, payload: '')
# => all good here
producer.flush_async(topic: nil, payload: '')
# => WaterDrop::Errors::MessageInvalidError
The timing of middleware execution has been adjusted. Middleware, which was previously run when messages were added to the buffer, will now only execute immediately before the messages are flushed from the buffer and dispatched. This change is similar to the validation-related changes.
This release contains BREAKING changes. Make sure to read and apply upgrade notes.
2.7
support.message.timeout.ms
is less that max_wait_time
so we do not end up with not final verdict.ms
and not mixed.wait_timeout
configuration option.flush_sync
or flush_async
.WaterDrop::Producer#transaction?
that returns only when producer has an active transaction running.instrument_on_wait_queue_full
flag (defaults to true
) to be able to configure whether non critical (retryable) queue full errors should be instrumented in the error pipeline. Useful when building high-performance pipes with WaterDrop queue retry backoff as a throttler.PLEASE MAKE SURE TO READ AND APPLY THEM!
wait_timeout
Configuration No Longer NeededThe wait_timeout
WaterDrop configuration option is no longer needed. You can safely remove it.
producer = WaterDrop::Producer.new
producer.setup do |config|
# Other config...
# Remove this, no longer needed
config.wait_timeout = 30
end
All time-related values are now configured in milliseconds instead of some being in seconds and some in milliseconds.
The values that were changed from seconds to milliseconds are:
max_wait_timeout
wait_backoff_on_queue_full
wait_timeout_on_queue_full
wait_backoff_on_transaction_command, default
If you have configured any of those yourself, please replace the seconds representation with milliseconds:
producer = WaterDrop::Producer.new
producer.setup do |config|
config.deliver = true
# Replace this:
config.max_wait_timeout = 30
# With
config.max_wait_timeout = 30_000
# ...
end
In this release, we've updated our default settings to address a crucial issue: previous defaults could lead to inconclusive outcomes in synchronous operations due to wait timeout errors. Users often mistakenly believed that a message dispatch was halted because of these errors when, in fact, the timeout was related to awaiting the final dispatch verdict, not the dispatch action itself.
The new defaults in WaterDrop 2.7.0 eliminate this confusion by ensuring synchronous operation results are always transparent and conclusive. This change aims to provide a straightforward understanding of wait timeout errors, reinforcing that they reflect the wait state, not the dispatch success.
Below, you can find a table with what has changed, the new defaults, and the current ones in case you want to retain the previous behavior:
Config | Previous Default | New Default |
---|---|---|
root max_wait_timeout |
5000 ms (5 seconds) | 60000 ms (60 seconds) |
kafka message.timeout.ms |
300000 ms (5 minutes) | 50000 ms (50 seconds) |
kafka transaction.timeout.ms |
60000 ms (1 minute) | 55000 ms (55 seconds) |
This alignment ensures that when using sync operations or invoking #wait
, any exception you get should give you a conclusive and final delivery verdict.
As of version 2.7.0
, WaterDrop has changed how message buffering works. Previously, messages underwent validation and middleware processing when they were buffered. Now, these steps are deferred until just before dispatching the messages. The buffer functions strictly as a thread-safe storage area without performing any validations or middleware operations until the messages are ready to be sent.
This adjustment was made primarily to ensure that middleware runs and validations are applied when most relevant—shortly before message dispatch. This approach addresses potential issues with buffers that might hold messages for extended periods:
Temporal Relevance: Validating and processing messages near their dispatch time helps ensure that actions such as partition assignments reflect the current system state. This is crucial in dynamic environments where system states are subject to rapid changes.
Stale State Management: By delaying validations and middleware to the dispatch phase, the system minimizes the risk of acting on outdated information, which could lead to incorrect processing or partitioning decisions.
# Prior to 2.7.0 this would raise an error
producer.buffer(topic: nil, payload: '')
# => WaterDrop::Errors::MessageInvalidError
# After 2.7.0 buffer will not, but flush_async will
producer.buffer(topic: nil, payload: '')
# => all good here
producer.flush_async(topic: nil, payload: '')
# => WaterDrop::Errors::MessageInvalidError
The timing of middleware execution has been adjusted. Middleware, which was previously run when messages were added to the buffer, will now only execute immediately before the messages are flushed from the buffer and dispatched. This change is similar to the validation-related changes.
This release contains BREAKING changes. Make sure to read and apply upgrade notes.
2.7
support.message.timeout.ms
is less that max_wait_time
so we do not end up with not final verdict.ms
and not mixed.wait_timeout
configuration option.WaterDrop::Producer#transaction?
that returns only when producer has an active transaction running.instrument_on_wait_queue_full
flag (defaults to true
) to be able to configure whether non critical (retryable) queue full errors should be instrumented in the error pipeline. Useful when building high-performance pipes with WaterDrop queue retry backoff as a throttler.PLEASE MAKE SURE TO READ AND APPLY THEM!
All time-related values are now configured in milliseconds instead of some being in seconds and some in milliseconds.
The values that were changed from seconds to milliseconds are:
max_wait_timeout
wait_timeout
wait_backoff_on_queue_full
wait_timeout_on_queue_full
wait_backoff_on_transaction_command, default
If you have configured any of those yourself, please replace the seconds representation with milliseconds:
producer = WaterDrop::Producer.new
producer.setup do |config|
config.deliver = true
# Replace this:
config.wait_timeout = 30
# With
config.wait_timeout = 30_000
# ...
end
In this release, we've updated our default settings to address a crucial issue: previous defaults could lead to inconclusive outcomes in synchronous operations due to wait timeout errors. Users often mistakenly believed that a message dispatch was halted because of these errors when, in fact, the timeout was related to awaiting the final dispatch verdict, not the dispatch action itself.
The new defaults in WaterDrop 2.7.0 eliminate this confusion by ensuring synchronous operation results are always transparent and conclusive. This change aims to provide a straightforward understanding of wait timeout errors, reinforcing that they reflect the wait state, not the dispatch success.
Below, you can find a table with what has changed, the new defaults, and the current ones in case you want to retain the previous behavior:
Config | Previous Default | New Default |
---|---|---|
root max_wait_timeout |
5000 ms (5 seconds) | 60000 ms (60 seconds) |
kafka message.timeout.ms |
300000 ms (5 minutes) | 50000 ms (50 seconds) |
kafka transaction.timeout.ms |
60000 ms (1 minute) | 55000 ms (55 seconds) |
This alignment ensures that when using sync operations or invoking #wait
, any exception you get should give you a conclusive and final delivery verdict.
This release contains BREAKING changes. Make sure to read and apply upgrade notes.
2.7
support.message.timeout.ms
is less that max_wait_time
so we do not end up with not final verdict.ms
and not mixed.wait_timeout
configuration option.instrument_on_wait_queue_full
flag (defaults to true
) to be able to configure whether non critical (retryable) queue full errors should be instrumented in the error pipeline. Useful when building high-performance pipes with WaterDrop queue retry backoff as a throttler.2.7
support.message.timeout.ms
is less that max_wait_time
so we do not end up with not final verdict.ms
and not mixed.wait_timeout
configuration option.instrument_on_wait_queue_full
flag (defaults to true
) to be able to configure whether non critical (retryable) queue full errors should be instrumented in the error pipeline. Useful when building high-performance pipes with WaterDrop queue retry backoff as a throttler.This release contains BREAKING changes. Make sure to read and apply upgrade notes.
2.7
support.message.timeout.ms
is less that max_wait_time
so we do not end up with not final verdict.ms
and not mixed.instrument_on_wait_queue_full
flag (defaults to true
) to be able to configure whether non critical (retryable) queue full errors should be instrumented in the error pipeline. Useful when building high-performance pipes with WaterDrop queue retry backoff as a throttler.This release contains BREAKING changes. Make sure to read and apply upgrade notes.
2.7
support.message.timeout.ms
is less that max_wait_time
so we do not end up with not final verdict.ms
and not mixed.instrument_on_wait_queue_full
flag (defaults to true
) to be able to configure whether non critical (retryable) queue full errors should be instrumented in the error pipeline. Useful when building high-performance pipes with WaterDrop queue retry backoff as a throttler.