作者回复: 举个例子,如果我们使用Kafka计算某网页的PV——我们将每次网页访问都作为一个消息发送的Kafka。PV的计算就是我们统计Kafka总共接收了多少条这样的消息即可。精确一次处理语义表示每次网页访问都会产生且只会产生一条消息,否则有可能产生多条消息或压根不产生消息。
作者回复: 不用拿Flink或Spark举例。我们就说一个普通的producer程序:producer需要接收到broker发送的response才能认为发送成功,如果response在传输过程中因为网络抖动丢失了或超时了(这种情况非常常见)而broker实际上已经写入了该消息,那么producer就会认为发送失败从而尝试重新发送,这就可能造成同一条消息被发送了多次。
作者回复: 同一个组下有多少消费者实例不是看进程数或线程数,而是看创建的KafkaConsumer实例数。所以在你的场景中,B消费者不是一个,而是多个,因为B进程启动了多个线程,而每个线程都维护了单独的KafkaConsumer实例。
作者回复: 嗯嗯,在Spark看来,写入Kafka是一种side effect,它无法控制。所以它无法实现端到端的EOS。Flink 1.4借助了Kafka提供的事务机制来保证E2E EOS,但是没听说Spark也做了这样的改进。
作者回复: 你不要搭建多套这样重量级的系统,只需要一套Kafka集群就可以。并不是说Kafka集群不需要运维管理
作者回复: 嗯嗯,记下了您的建议
作者回复: 如果和rabbitmq和activemq相比,Kafka还是以消息引擎的角色。目前Kafka消息引擎单方面只能提供at least once处理语义,无法实现精确一次的消息交付语义。
另外,正确性一般用在数据计算领域。在消息引擎中我们更多的是谈它的消息交付语义(message delivery semantics)
作者回复: 对Camel不是特别熟悉,但我不认为这两者构成竞争关系。Camel有一些独到之处是Kafka没有的,至少它能汇聚各个中间件的消息,另外它也支持复杂的消息路由。就像Camel宣称的那样,它是一款企业级的数据整合方案。在设计立意上, 我感觉要比Kafka的层次要高。
作者回复: 假设我们统计单词计数。如果不出现问题,对于相同的有限输入(bounded dataset)批处理是不是总是能够得到相同的输出?
作者回复: 每次执行批处理都能保证得到相同的值,但是流处理无法做到这一点。批处理一般采用fail-fast来保证即使中间出现错误也能实现正确性
作者回复: 最近Flink Kafka Connector正式移除了Beta标签【Flink-12806】,应该会更加稳定了吧:)
作者回复: hmm...... 社区的确是宣称Kafka Streams可以做到EOS。但我个人的看法是:目前市面宣称做到EOS这件事更多的还是marketing,即营销的一种手段。我不觉得有哪个流处理框架100%地实现了EOS,否则如果流处理真的实现了正确性,同时还提供低延时,批处理为什么还活着呢?当然这是我一家之言了哈。至少从技术的角度探讨,Kafka Streams是能做到EOS的。
作者回复: 有。Confluent Kafka目前也分社区版和商业版本,前者是免费的
作者回复: 流处理和批处理的区别是前者主要用于处理无限数据集(unbound data set)
作者回复: 严格来说这两个是完全不同领域内的东西。各自都有响当当的理论、框架。
作者回复: 嗯嗯,这说的就是0.11之前的故事。事实上,Apache Flink从1.4开始推出了支持E2E Exactly-Once语义的两阶段SinkFunction。它用的就是Kafka 0.11的事务