Spring Kafka-使用生产者监听器配置KafkaTemplate与使用Listenable Future注册回调之间的区别

2022-09-04 21:35:33

所以我在浏览Spring kafka文档时,遇到了Production Listener。这就是春季卡夫卡文档所说的 -

“或者,您可以使用 ProducerListener 配置 KafkaTemplate,以获得包含发送结果(成功或失败)的异步回调,而不是等待 Future 完成。

他们还指定了接口-

     public interface ProducerListener<K, V> {

      void onSuccess(String topic, Integer partition, K key, V value, 
      RecordMetadata recordMetadata);

      void onError(String topic, Integer partition, K key, V value, 
      Exception exception);

      boolean isInterestedInSuccess();

  }

所以我的理解是,如果你想对消息的成功和失败做些什么,实现接口ProducerListener并将其注册到KafkaTemplate。它是异步的,因此您不必等待将来完成,即可知道发送操作的结果。

下面大约3个句子,它提到你还可以添加一个回调,通过KakfaTemplate的发送方法返回ListenableFuture。这也是异步的。

 future.addCallback(new ListenableFutureCallback<SendResult<Integer, 
   String>>() {

 @Override
 public void onSuccess(SendResult<Integer, String> result) {
    ...
  }

  @Override
  public void onFailure(Throwable ex) {
    ...
  }

  });

所以我想知道两者之间的确切区别是什么,因为它们都是异步的。在 onSuccess 和 onFailure/onError 方法中接收的数据之间的差异。或者,在向ListenableFuture添加回调之前,将ProducerListener添加到KafkaTemplate的功能是开发的(因为将来如果不阻止它 - get()方法,就无法知道异步计算的结果),反之亦然。因此,只是为了确保向后兼容性,两者都被允许保持打开状态。使用一种方法是否比使用另一种方法有任何性能优势。

提前感谢您。


答案 1

您的猜测“几乎”是正确的 - 这个概念早于(在早期的项目中 - 该项目现在基于)。ProducerListenerKafkaTemplatespring-integration-kafkaspring-kafkaspring-kafka

但是,它仍然有一席之地,如果您只是被动地感兴趣 - 例如.LoggingProducerListener

如果您需要在调用代码的上下文中知道结果,则向 添加回调更适用。...ListenableFuture

  • 执行模板操作
  • 添加一个带有倒计时闩锁的回调(可能还有日志)
  • 再做一些工作
  • 等待闩锁倒计时

当然,您可以更简单地获得相同的效果...

  • 执行模板操作
  • 再做一些工作
  • 获得未来结果

...但在某些情况下,第一种方法是首选,例如执行多个操作并等待它们全部完成。

没有真正的性能差异。


答案 2

推荐