Я использую Spring-Kafka версии 1.2.1, и, когда сервер Kafka отключен / недоступен, на время блокируется асинхронная отправка вызовов. Вроде таймаут TCP. Код выглядит примерно так:
ListenableFuture<SendResult<K, V>> future = kafkaTemplate.send(topic, key, message);
future.addCallback(new ListenableFutureCallback<SendResult<K, V>>() {
@Override
public void onSuccess(SendResult<K, V> result) {
...
}
@Override
public void onFailure(Throwable ex) {
...
}
});
Я очень быстро взглянул на код Spring-Kafka, и, похоже, он просто передает задачу клиентской библиотеке kafka, переводя взаимодействие обратного вызова на взаимодействие с будущим объектом. Глядя на клиентскую библиотеку kafka, код становится более сложным, и я не нашел времени, чтобы все это понять, но я предполагаю, что он может выполнять удаленные вызовы (по крайней мере, метаданные?) В том же потоке.
Как пользователь, я ожидал, что методы Spring-Kafka, которые возвращают будущее, вернутся немедленно, даже если удаленный сервер kafka недоступен.
Приветствуются любые подтверждения, если я неправильно понимаю или это ошибка. В итоге я сделал его асинхронным на своем конце.
Другая проблема заключается в том, что в документации Spring-Kafka вначале говорится, что она предоставляет синхронные и асинхронные методы отправки. Мне не удалось найти никаких методов, которые не возвращают фьючерсы, возможно, документация нуждается в обновлении.
Если потребуется, я с радостью предоставлю дополнительную информацию. Спасибо.