对于配置通过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
进行无参数调用?
答案 0 :(得分:1)
使用无参数get()
从来不是一个好主意;如果客户端代码中存在某些错误,您可能会永远挂下去。
这两个超时确实不同。
未来的get()
将获得发送结果(成功或失败)。
如果您的生产者配置在get()
超时后可以成功,那么您将获得重复项(假设失败后在应用程序级别重试)。
我认为“最佳实践”是使用大于get()
的{{1}}超时,但这可能会花费很长时间。但这将确保您获得发送的真实结果。在这种情况下超时将被视为需要调查的异常。