request.timeout.ms和使用KafkaTemplate的Spring Kafka同步事件发布

时间:2019-06-10 17:55:30

标签: apache-kafka kafka-producer-api spring-kafka

对于配置通过Spring Kafka同步发布的事件的超时的最佳做法,我有些困惑。The Spring Kafka documentation提供了使用ListenableFuture的{​​{1}}启用同步的示例发布事件,超时为get(SOME_TIME, TimeUnit)。 (以下重复以供参考)。

SOME_TIME

另一方面,我看着Kafka's Producer Configuration Documentation,发现Kafka具有public void sendToKafka(final MyOutputData data) { final ProducerRecord<String, String> record = createRecord(data); try { template.send(record).get(10, TimeUnit.SECONDS); handleSuccess(data); } catch (ExecutionException e) { handleFailure(data, record, e.getCause()); } catch (TimeoutException | InterruptedException e) { handleFailure(data, record, e); } } 的配置,该配置负责Kafka中的以下设置。

  

该配置控制客户端等待请求响应的最长时间。如果超时之前仍未收到响应,则客户端将在必要时重新发送请求,如果重试用尽,则客户端将使请求失败。

以某个时间单位(例如,如上述Spring Kafka的示例中给出的10秒/ 10,000 ms)配置request.timeout.ms会更有意义,还是更好的方法是配置{{1 }}(以及template.send(...).get(...))在内部通过Kafka模拟此行为,并向request.timeout.ms进行无参数调用?

1 个答案:

答案 0 :(得分:1)

使用无参数get()从来不是一个好主意;如果客户端代码中存在某些错误,您可能会永远挂下去。

这两个超时确实不同。

未来的get()将获得发送结果(成功或失败)。

如果您的生产者配置在get()超时后可以成功,那么您将获得重复项(假设失败后在应用程序级别重试)。

我认为“最佳实践”是使用大于get()的{​​{1}}超时,但这可能会花费很长时间。但这将确保您获得发送的真实结果。在这种情况下超时将被视为需要调查的异常。