为什么Kafka基于拉力而不是推基础?

时间:2016-09-20 05:53:16

标签: apache-kafka

为什么Kafka基于拉力而非基于推送?我同意Kafka在我经历过的时候提供了高吞吐量,但我不知道Kafka吞吐量如果会被推进的话会如何下降。关于基于推送的任何想法会降低性能吗?

3 个答案:

答案 0 :(得分:24)

可扩展性是我们设计此类系统(拉动与推动)时的主要驱动因素。 Kafka非常具有可扩展性。 Kafka的一个主要优点是,在不影响性能和不停机的情况下添加大量消费者非常容易。

Kafka可以处理来自生产商的每秒100k +的事件。 由于Kafka消费者从主题中提取数据,不同的消费者可以以不同的速度消费消息。 Kafka还支持不同的消费模式。您可以让一个消费者实时处理消息,另一个消费者以批处理模式处理消息。

另一个原因可能是Kafka不仅适用于像Hadoop这样的单一消费者。不同的消费者可以有不同的需求和能力。

基于拉动的系统存在一些缺陷,例如由于定期轮询而浪费资源。卡夫卡支持长期民意调查'等待模式,直到真正的数据来缓解这个缺点。

答案 1 :(得分:19)

请参阅Kafka文档,其中详细说明了特定的设计决策:Push vs pull

支持拉动的主要观点是:

  1. 在与多元化消费者打交道时更好(没有经纪人确定所有人的数据传输率);
  2. 消费者可以更有效地控制个人消费率;
  3. 更轻松,更优化的批处理实施。
  4. 基于拉动的系统(消费者在没有数据可用的情况下对数据进行轮询)的缺点通过长期调查得到了有效缓解。等待模式,直到数据到达。

答案 2 :(得分:3)

其他人已经根据Kafka的文档提供了答案,但有时应该以含盐的产品文档作为绝对的技术参考。例如:

  • 众多基于推送的消息传递系统支持以下情况下的消费 通常通过其会话管理原语来确定不同的速率。 您在建立/恢复活动的应用程序层会话时 想消耗并暂停会话(例如,通过 当您想要响应时,响应时间小于保持活动窗口并大于运行中窗口...或带有显式消息) 停止/暂停。例如,MQTT和AMQP都提供此功能 (从90年代后期开始,就MQTT而言)。鉴于没有采取任何行动 暂停消费(根据定义)所需的流量更少 在稳定状态下需要(无请求),很难 了解Kafka的基于pull的模型如何更有效。
  • 推式消息传递相对于拉式消息传递的一个重要优势是 没有请求流量会随着潜在数量的增加而扩展 活动主题增加。如果您有一百万潜在活跃 主题,则必须对所有这些主题发出查询。这个 大规模关注变得尤为重要。
  • 拉式消息传递与推式消息传递相比,关键优势是可重播性。这在很大程度上决定着下游系统是否可以围绕处理提供保证(例如,它们可能在这样做之前失败,并且必须重新启动,或者例如,无法以可恢复的方式写入消息)。
  • 拉式消息传递与推式消息传递相比的另一个关键优势是缓冲区分配。消费过程可以显式请求可容纳在预分配缓冲区中的数据,而不必一遍又一遍地分配缓冲区。与查询缩放带来的推送消息相比,这可以弥补一些吞吐量损失(但不是很多)。但是,如果您的消息大小变化很大(例如,几KB->几百MB),那么这里的影响是可以衡量的。
  • 建议pull消息具有结构上的可伸缩性优势优于push消息,这是一个谬论。分区是通常用于在消息传递应用程序中提供规模的功能,而与消耗模型无关。在硬连线的本地集群上,有超过300M msgs / sec的推送消息系统运行良好... 125K msgs / sec甚至不能买入该节目。实际上,根据定义,拉式消息传递的吞吐率次优,而像Kafka这样的系统通常最终会使用更多硬件来达到相同的性能水平。上面提到的好处通常会使它值得。我不知道有人在高频交易中使用Kafka进行消息传递,例如,微秒很重要。

也许有趣的是,在1990年代后期开发了各种推挽消息传递系统,作为优化吞吐量的一种方式。结果从未令人st舌,并且系统复杂性和其他因素常常超过了这种优化。我相信这是Jay关于在实际数据中心网络上的实际性能的总体观点,更不用说开放Internet之类的东西了。