初探Kafka Streams (3)

Kafka Streams应用中的每个task可能会嵌入一个或者多个state stores用于存储和查询数据。Kafka Streams提供了state stores的容错和自动恢复的能力。下图展示了两个stream task,每个task都有一个自己专用的state store。

初探Kafka Streams

状态存储是在本地的,Kafka Streams这块是如何做容错和自动恢复的呢?

Fault Tolerance

Kafka Streams的容错依赖于Kafka自身的容错能力。Kafka的partition提供了高可能用复制的能力,所以如果将Kafka Streams的数据存储在partition中那就自然的实现了容错。Kafka Streams中的task的容错实际上就是依赖于Kafka consumer的容错能力,如果task所在机器故障,Kafka Streams自动的在可用的应用实例上重启task。

对于每个state store,保持一个可复制的changelog Kafka topic用于跟踪state的任何变更。这些changelog topic同样是被分区的。change log的topic是开启压缩的,所以历史数据会被清除,避免数据无限制的增长。如果一个task所在的机器发生故障,task转移到另一个机器,Kafka Streams将通过change log重建local state store。整个失败处理的过程对用户来说是透明的。

注意,task初始化(或者重新初始化)的耗时通常主要取决于通过重播change log来恢复state store来的时间。为了减少恢复时间,用户可以配置他们的应用拥有一个备用的local states的副本(也就是说,一个state副本的完全拷贝)。当发生了一个task迁移,Kafka Streams试图将task分配到一个应用程序的实例上,这个实例上已经存在一个备用的副本用于最小化task初始化的时间消耗。

总结

Kafka Streams是一个类库,实现了流式计算的能力、除Kafka外无任何外部依赖、充分利用了Kafka的水平扩容和容错等能力

通过state store为状态计算提供了可能;通过replicated change log和log compact解决了state store的容错和数据膨胀的问题

基于offset的计算进度管理以及基于state store的中间状态管理为发生Consumer rebalance或Failover时从断点处继续处理提供了可能,并为系统容错性提供了保障

Kafka Streams适用于哪些输入和输出都存储在Kafka中的业务。类似的,如果在Message Queue的场景中有很多业务都接收来自MQ的消息,处理之后产生新消息投递到MQ中给下游业务处理,那么提供类似的一套Stream的机制将大大简化业务方的开发工作,提升效率(在没有Stream的情况下需要使用Consumer和Producer完成从MQ接收消息和投递消息到MQ,且需要将中间的过程串联起来;Stream的模式下用户则只需要关心自身的业务逻辑)。

初探Kafka Streams

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wspdfj.html