03 | Kafka只是消息引擎系统吗?
03 | Kafka只是消息引擎系统吗?
讲述:胡夕
时长10:14大小9.35M
开放讨论
赞 39
提建议
精选留言(46)
- Michael 🛡YZY2019-06-08学到了。刚接触, 对一次性处理语义的概念和背后的含义不太明确, 能否结合实例讲解比较一下…
作者回复: 举个例子,如果我们使用Kafka计算某网页的PV——我们将每次网页访问都作为一个消息发送的Kafka。PV的计算就是我们统计Kafka总共接收了多少条这样的消息即可。精确一次处理语义表示每次网页访问都会产生且只会产生一条消息,否则有可能产生多条消息或压根不产生消息。
共 3 条评论73 - October2019-06-17对于kafka streams相对于其他大数据流式计算框架的优势的第一点不是特别理解。spark或者flink读取消息之后再写回kafka,可能会导致多次写入kafka,老师能不能解释一下什么情况下会多次写入kafka?
作者回复: 不用拿Flink或Spark举例。我们就说一个普通的producer程序:producer需要接收到broker发送的response才能认为发送成功,如果response在传输过程中因为网络抖动丢失了或超时了(这种情况非常常见)而broker实际上已经写入了该消息,那么producer就会认为发送失败从而尝试重新发送,这就可能造成同一条消息被发送了多次。
共 11 条评论63 - 梁亮2019-06-08推荐大家去搜索一个Confluence的演讲,题目是ETL is dead,其中讲到了Kafka在流处理平台的来龙去脉共 3 条评论52
- 清晨吼于林2019-06-12老师您好~~~ 我了解的:一个partition在一个group内,只能被一个消息者进程消费(一个jvm,启动了一个java进程)。 问题前提:经过分区算法的匹配,A partition 被 B 消费者 消费。 我的问题:在这个B的消费者里面,假如我用多线程消费(多个线程,每个线程维护了一个KafkaConsumer实例。 而不是一个KafkaConsumer然后多个worker线程消费的模式),那这多个线程都能从这个A partition里面取到消息嘛?展开
作者回复: 同一个组下有多少消费者实例不是看进程数或线程数,而是看创建的KafkaConsumer实例数。所以在你的场景中,B消费者不是一个,而是多个,因为B进程启动了多个线程,而每个线程都维护了单独的KafkaConsumer实例。
共 2 条评论23 - DarKnight2019-06-27胡老师您好!我对于第一点优势那个例子不是很懂,但又很感兴趣。我能否用一个这样的情形去理解呢: 我在spark内部consume了一条数据并要进行有状态的计算,我可以通过roll back确保做到exactly once,当状态计算过程中可以通过捕捉exception从而roll back到初始状态,但状态计算过程中我可能已经将某些结果发送到kafka了(这些结果我并不想重复发送),虽然我可以roll back所有处于spark内部的数据状态,但发送到kafka的所有数据就已经收不回了。 不知道这个例子算不算一种解读呢?谢谢!展开
作者回复: 嗯嗯,在Spark看来,写入Kafka是一种side effect,它无法控制。所以它无法实现端到端的EOS。Flink 1.4借助了Kafka提供的事务机制来保证E2E EOS,但是没听说Spark也做了这样的改进。
共 2 条评论19 - 钱2019-08-11课前思考 kafka除了可以作为一个消息引擎系统,还能用来干什么?这个还真不太清楚,它的核心功能不就是,将消息倒一道手嘛? 课后思考 1:kafka可以作为什么来使用? 1-1:一个分布式消息引擎系统——广泛使用 1-2:一个分布式流处理平台,可以和Storm/Spark/Flink相媲美——越来越多这么玩,根据老师的评论回复,感觉kafka更是一个分布式流处理库。 1-3:一个分布式存储系统——很少使用,关键增删改查的效率好不?如果挺好,也可以这么玩吧! 如果我是kafka的掌舵人,我会逐渐丰富kafka的生态圈,把kafka弄得和Spring全家桶类似,以后的ABC把kafka家族的程员作为标配。 2:啥是流处理? 是指实时处理无限数据集的数据的一种处理方式嘛? 3:啥是批处理? 是指一次处理一批数据,且此数据的集合是有限的? 4:流处理和批处理,没理解,kafka作为分布式流处理平台的优势也没理解?看评论,流处理的数据集是无限数据集,那岂不是永远处理不完,直到天荒地老? 5:数据正确性不足是什么意思?会丢数据?没明白和数据收集的方式的逻辑是什么? 计算机我的理解,就是处理数据的,处理数据无非是针对数据的存储转发增删改查存分析统计,然后就是挖空心思加快速度。 感觉不该如此难以理解😊,一图胜千言,希望后面看到老师有图有真相。展开
作者回复: 嗯嗯,记下了您的建议
15 - 你好旅行者2019-06-12关于【但是计算结果有可能多次写入到 Kafka,因为它们不能控制 Kafka的语义处理】。我想问老师,Kafka不是在0.11版本实现了exactly once,保证一条消息只会被消费一次吗,为什么说计算结果还有可能会被多次写入到Kafka呢?
作者回复: 嗯嗯,这说的就是0.11之前的故事。事实上,Apache Flink从1.4开始推出了支持E2E Exactly-Once语义的两阶段SinkFunction。它用的就是Kafka 0.11的事务
7 - 平叔叔2019-09-22在这样的需求之下,搭建重量级的完整性平台实在是“杀鸡焉用牛刀,的意思中小企业使用Kafka 不用配套提供集群调度、弹性部署?
作者回复: 你不要搭建多套这样重量级的系统,只需要一套Kafka集群就可以。并不是说Kafka集群不需要运维管理
7 - Shane2019-06-15老师,能举个例子说明下流出来和批处理的区别吗? 目前我的理解就是批处理是一次请求中包含多条消息?然后消费者取出这一整个请求内容进行处理消费。流处理就是每个请求每次只发送一条消息,所以消费者也只能每次消费一条? 感觉自己理解的应该不怎么正确呢?网络上的解释也是非常虚,想看看老师有啥指导的吗?展开
作者回复: 流处理和批处理的区别是前者主要用于处理无限数据集(unbound data set)
共 2 条评论6 - 赵鹏举2019-07-09夕哥的英文非常标准,听着语音很舒服5
- EricJones2019-06-22我又仔细意会了一下,流处理大概已经懂了,但是批处理的正确性到底体现在哪里。还是不知道。
作者回复: 假设我们统计单词计数。如果不出现问题,对于相同的有限输入(bounded dataset)批处理是不是总是能够得到相同的输出?
5 - 东方奇骥2019-06-16老师,请问一下,kafka相比于rabbitmq和activemq作为消息引擎系统的优势是什么呢。就是文中所说的消息正确性吗?
作者回复: 如果和rabbitmq和activemq相比,Kafka还是以消息引擎的角色。目前Kafka消息引擎单方面只能提供at least once处理语义,无法实现精确一次的消息交付语义。 另外,正确性一般用在数据计算领域。在消息引擎中我们更多的是谈它的消息交付语义(message delivery semantics)
共 3 条评论5 - 永光2019-06-10老师好, 对于流处理不是很了解,然后你说的Kafka流处理的两个优点都没有get到,呜呜呜。 1、第一点是更容易实现端到端的正确性。 目前主流的大数据流处理框架都宣称实现了精确一次处理语义,但这是有限定条件的,即它们只能实现框架内的精确一次处理语义,无法实现端到端的。 主流的大数据流处理框架为什么不能实现端到端的精确一次处理语义,什么是端到端的精确一次处理语义呀? 2、它自己对于流式计算的定位。这是在说Kafka流处理相比于其他的更轻量级?展开
作者回复: 1. E2E你可以近似地认为是从生产者端到消费者端或者是跨上下游系统。这种场景下如何确保消息或事件对最终状态的影响有且只有一次是极有挑战的课题。 2. 可以这么理解。Kafka Streams目前定位是流处理库(library),而不是平台(platform)。这也说明了它和其他流处理框架的差异化。
5 - 小晏子2020-04-15课后思考:我不是特别清楚kafka未来发展方向,不过在老师的提示下我感觉可以让kafka提供扩展接口,用户可以自定义plugin去扩展kafka的功能,kafka只提供核心的消息服务和流处理服务。
作者回复: 非常棒的建议!
共 2 条评论4 - October2019-06-17看到老师评论区的回复有个问题,kafka目前到底能否实现exactly once的处理语义?
作者回复: hmm...... 社区的确是宣称Kafka Streams可以做到EOS。但我个人的看法是:目前市面宣称做到EOS这件事更多的还是marketing,即营销的一种手段。我不觉得有哪个流处理框架100%地实现了EOS,否则如果流处理真的实现了正确性,同时还提供低延时,批处理为什么还活着呢?当然这是我一家之言了哈。至少从技术的角度探讨,Kafka Streams是能做到EOS的。
共 2 条评论4 - JoeyLi6662019-06-19flink支持kafka的端到端 exactly once,不过有一定局限性
作者回复: 最近Flink Kafka Connector正式移除了Beta标签【Flink-12806】,应该会更加稳定了吧:)
3 - EricJones2019-06-22学到了,消息引擎系统、分布式流处理平台。 kafka 流处理平台具有的优势:正确性,精确一次处理语义。对流式计算的定位。 理解了精确一次处理语义,但是没get到这其中的点。为什么说正确性是批处理的强项。一批消息传给服务器A,A进行处理然后B服务器从A获取这批消息。这个过程不也是有可能出现消息获取失败,需要第二次去获取吗?该怎么理解框架内流处理与端与端?有大佬可以解释下吗? 谢谢展开
作者回复: 每次执行批处理都能保证得到相同的值,但是流处理无法做到这一点。批处理一般采用fail-fast来保证即使中间出现错误也能实现正确性
2 - 霄嵩2019-06-11老师写的很用心,加油!2
- 文竹2019-06-11目前kafka相关组件太分散以及通过命令行运维,希望有一个平台产品集成所有组件(基础运维,ksql,AI等)
作者回复: Confluent公司的Confluent Kafka做到了这一点。社区版的Kafka没有这样的功能~
2 - 燕子上2019-06-09还是那句话:Apache Kafka 是消息引擎系统,也是一个分布式流处理平台!主:消息引擎,辅:流处理2