I've a question I'm hoping the Kafka community can help me puzzle out. In
our setup we've configured *max.block.ms <http://max.block.ms>* to be 100
ms. For normal

    KafkaProducer.send(record, exceptionHandler)

calls this works fine. But when our app is starting up it'll typically take
~500 - 600 ms for the topic's metadata to be retrieved. As a result the
first 5 - 6 sends drop. i.e. After we ignore a TimeoutException.

I've been trying to figure out how to improve this situation. I've noticed
that the default *max.block.ms <http://max.block.ms>* timeout is 60,000 ms
(aka 1 minute). Defaulting to that value would likely sort out the initial
setup problem. But....

If the Kafka server is unreachable then send(..) waits until *max.block.ms
<http://max.block.ms>* expires. i.e. There is no HostUnreachable exception.
Hence a large timeout would introduce delays if Kafka was down.

*max.block.ms <http://max.block.ms>* is also used when the Kafka Buffer is
full. i.e. Additional calls block for *max.block.ms <http://max.block.ms>*.
If we have a large value that'll lead to performance issues when the system
is under stress.

Plus, TBH, if Kafka send is taking 55 seconds, for example, that should
also be treated as an error.

I was thinking about how we could more smartly address this. As we know, to
a large extent, our topics before hand could we use a method like

    public List<PartitionInfo> partitionsFor(String topic)

To retrieve the metadata when creating a new KafkaProducer? i.e. Is this a
common & viable solution?

What other options does the Kafka community employ?


Reply via email to