增强在线可进化性(基础服务类产品)
就我个人而言,这几年来学到的最重要的一课,就是要永远保证一个流式数据平台的在线可进化性(online-evolvable)。
之前我曾经读到 Amazon CTO Werner Vogels 写过的一篇博客,里面就提到这一点,并且有一个精彩的比喻:搭建一个能够在不断产品升级过程中保证永远在线的数据架构,就像是驾驶着一架简单的单螺旋桨飞机起飞,然后在飞行过程中,不断换新零件和添加新引擎,直到最后升级成一架超大的空客飞机,这一切都必须在飞行中同步完成,并且坐在里面的乘客不能有任何感觉,其难度可想而知。
而关于一个流数据平台,对于在线可进化性这一点的需求尤甚:这里我也打一个比方,尽管没有 Vogels 的那样精彩——数据流就像是一个连接城市各个地区的高速公路,高速公路所连接的地方,比如一家超市、一家影院,或者一个居民小区,就如同一个企业里面大大小小的各种应用产品或者数据仓库,超市可以暂时歇业,影院可以暂时关门翻修,居民小区甚至也可以迁出人口夷平重建,就像是产品或者数据仓库都可以短暂下线升级维护。然而高速公路却很难彻底打断重搭,因为随时都有人要上路。更多时候,它只能一边继续完成输送车辆的任务,一边增设车道或者加盖匝道。就像是一个流数据平台本身,因为不会有一个零流量的时刻,所以所有的维护和升级都需要保证同步在线完成,而且期间最好没有任何用户可感知到的性能弱化或者服务差别。而在云环境下,后者显得更为重要。对于 Kafka 而言,如果一个用户没有一个安全稳定的升级路线的话,那么她就只能停留在最初的那个版本,再不会升级。
因此我们从很早以前开始注意保证在线升级的方便性,在这一次的 2.0.0 版本中,更多相关的属性被加了进来,比如 KIP-268、KIP-279、KIP-283 等等。
2019-07-16 技术笔记