KafkaProducer:`callback`和返回'Future`之间的区别?

Thi*_*ilo 19 java apache-kafka kafka-producer-api

KafkaProducer发送方法都返回一个Future并接受回调.

使用一种机制而不是另一种机制在完成发送后执行操作之间是否有任何根本区别?

str*_*tle 16

异步方法

producer.send(record, new Callback(){
    @Override
    onComplete(RecordMetadata rm, Exception ex){...}
})
Run Code Online (Sandbox Code Playgroud)

与同步相比,可以提供更好的吞吐量

RecordMetadata rm = producer.send(record).get();
Run Code Online (Sandbox Code Playgroud)

因为在第一种情况下你不等待确认.

同样在异步方式中,不保证排序,而在同步中, - 仅在收到确认后才发送消息.

另一个区别可能是在异常情况下的同步调用中,您可以在异常发生后立即停止发送消息,而在第二种情况下,将在发现错误并执行某些操作之前发送一些消息.

另请注意,在异步方法中,"in fligh"的消息数由max.in.flight.requests.per.connection参数控制.

除了同步和异步方法,您可以使用Fire和Forget方法,这几乎与同步方法相同,但不处理返回的元数据 - 只需发送消息并希望它将到达代理(知道它很可能会发生,并且生产者将在可恢复错误的情况下重试),但有些消息可能会丢失:

RecordMetadata rm = producer.send(record);
Run Code Online (Sandbox Code Playgroud)

总结一下:

  • 火和忘记 - 最快的一个,但有些信息可能丢失;
  • 同步 - 最慢,如果你不能丢失消息就使用它;
  • 异步 - 介于两者之间.


Imu*_*mus 16

查看链接到它的文档看起来Future和Callback之间的主要区别在于谁发起了"请求已完成,现在是什么?" 题.

假设我们有一位顾客C和一位面包师B.并C要求B让他成为一个不错的饼干.现在,面包师可以通过两种方式将美味的饼干送回给顾客.

未来

面包师接受请求并告诉客户:好的,当我完成后,我会把你的cookie放在柜台上.(这个协议是Future.)

在这种情况下,客户负责检查柜台(Future)以查看面包师是否已完成他的cookie.

阻止 客户留在柜台附近并查看它直到将cookie放在那里(Future.get())或者面包师在那里做道歉(错误:饼干面团外).

非阻塞 客户做了一些其他的工作,偶尔检查一下cookie是否在柜台上等待他(Future.isDone()).如果cookie准备就绪,则客户接受它(Future.get()).

打回来

在这种情况下,顾客在订购他的饼干后告诉面包师:当我的饼干准备就绪时,请把它交给我的宠物机器人狗,他会知道该怎么做(这个机器人就是回调).

现在,当饼干准备好时,面包师会给狗狗饼干并告诉他跑回它的主人.面包师可以继续为另一位顾客烘焙下一个饼干.

狗跑回顾客并开始摇摆它的人造尾巴,让顾客知道他的饼干准备好了.

注意顾客怎么不知道什么时候会给他饼干,他也没有积极地调查面包师是否准备好了.

这是两个场景之间的主要区别.谁负责发起"你的cookie准备好了,你想用它做什么?" 题.对于Future,客户负责通过主动等待或偶尔轮询来检查何时准备好.在回调的情况下,面包师将回叫所提供的功能.


我希望这个答案可以让你更好地了解未来和Calback的实际情况.一旦你掌握了一般的想法,你就可以尝试找出每个特定事物的处理方式.当线程被阻塞时,或者以什么顺序阻止一切完成.编写一些打印语句的简单程序,如:"主客户端线程:cookie收到"可能是一种有趣的方式来试验这个.