为什么卡夫卡是拉式的而不是推式的?我同意卡夫卡给予高吞吐量,因为我已经经历了它,但我不认为卡夫卡的吞吐量将如何下降,如果它是推为基础。对于推式系统如何降低性能有什么想法吗?
参考卡夫卡的文件,其中详细说明了具体的设计决策: 推和拉
支持拉力的主要观点有:
基于拉动的系统(消费者轮询数据而没有可用的数据)的缺点通过“长轮询”等待模式得到了一定程度的缓解,直到数据到达。
当我们设计这样的系统时,可伸缩性是主要的驱动因素(拉还是推)。卡夫卡是可扩展的。卡夫卡的一个关键好处是,它很容易增加大量的消费者,而不影响性能和没有停机时间。
卡夫卡可以以每秒10万以上的速度处理来自制片人的事件。因为卡夫卡的消费者从主题中提取数据,不同的消费者可以以不同的速度消费这些信息。卡夫卡还支持不同的消费模式。您可以让一个使用者实时处理消息,让另一个使用者以批处理模式处理消息。
另一个原因可能是卡夫卡不仅仅是为像 Hadoop 这样的单一消费者设计的。不同的消费者可能有不同的需求和能力。
基于拉动的系统有一些缺陷,比如由于定期轮询而造成的资源浪费。卡夫卡支持“长轮询”等待模式,直到真实数据出现,以减轻这一缺点。
其他人则根据卡夫卡的文档提供了答案,但有时产品文档作为绝对的技术参考应该持保留态度。例如:
值得注意的是,各种推拉式消息传递系统是在20世纪90年代后期开发的,作为一种优化商品输入的方法。结果从来没有惊人的,系统的复杂性和其他因素往往超过这种优化。我相信这是 Jay 关于真实数据中心网络的实际性能的总体观点,更不用说像开放互联网这样的东西了。
Pushing只是经纪人的额外工作。对于卡夫卡,获取消息的责任在于消费者。消费者可以决定以什么速率处理消息。
Pushing
如果一个代理正在推送消息,并且一些消费者处于宕机状态,那么代理将重试某些时间来推送消息,直到他们决定不再推送消息为止。这会降低性能。想象一下将消息推送到多个消费者的工作负载。