淅川| 三明| 广河| 元坝| 岳阳市| 岷县| 毕节| 铜仁| 剑川| 孝感| 黄山市| 赞皇| 修文| 西藏| 双鸭山| 喀喇沁左翼| 长顺| 濠江| 科尔沁左翼后旗| 乐清| 岐山| 平川| 青县| 青岛| 灌云| 武隆| 萝北| 岚山| 吉县| 丰顺| 安顺| 通城| 石林| 江津| 凤山| 万荣| 锦州| 枞阳| 昆明| 商洛| 天全| 仙桃| 孝感| 荥阳| 乌恰| 五河| 白玉| 赣榆| 平山| 吉水| 阜南| 阿坝| 南雄| 山丹| 连平| 城阳| 三门| 高邮| 通许| 蓟县| 五华| 固安| 宿豫| 楚州| 科尔沁右翼中旗| 陇川| 武清| 大同市| 沙河| 永年| 茶陵| 高青| 呼和浩特| 沙湾| 塔什库尔干| 福山| 古田| 费县| 蒙自| 襄城| 上杭| 罗源| 会理| 哈尔滨| 兰溪| 大方| 宜丰| 普格| 蠡县| 巴南| 仁寿| 东兰| 上蔡| 岱岳| 犍为| 永安| 江门| 兴文| 丹凤| 喀喇沁旗| 沿滩| 宝安| 和龙| 陆河| 饶阳| 睢县| 兴海| 叶城| 新邱| 乌恰| 太仓| 浦口| 黎平| 阜新蒙古族自治县| 沿河| 潜山| 科尔沁右翼中旗| 无极| 岢岚| 周村| 平阳| 佛冈| 武清| 呼图壁| 凤县| 容城| 宝安| 莒县| 得荣| 辽源| 宣恩| 都江堰| 绍兴市| 鄂托克前旗| 扎囊| 大同市| 商都| 苏州| 铁岭县| 陈巴尔虎旗| 民和| 双辽| 聂荣| 灵川| 和静| 丹东| 岳阳市| 周村| 三水| 金门| 巴林左旗| 仲巴| 平阳| 鄂温克族自治旗| 巨鹿| 赞皇| 临淄| 安阳| 耒阳| 新龙| 定远| 马祖| 土默特右旗| 屏东| 忻城| 璧山| 广南| 绿春| 乳源| 屯留| 乌什| 婺源| 武邑| 台北县| 阿坝| 北宁| 颍上| 托克逊| 叙永| 山西| 利川| 赤壁| 锡林浩特| 武城| 科尔沁右翼前旗| 曲江| 蓟县| 鄢陵| 焦作| 新干| 晋中| 望江| 凤阳| 木垒| 谢通门| 胶南| 榕江| 武乡| 八宿| 共和| 靖宇| 南城| 神木| 天柱| 巫山| 渭南| 双城| 万年| 三原| 栾川| 呼图壁| 莱西| 丹江口| 保定| 天峻| 奇台| 集美| 英山| 隆子| 宝清| 青浦| 大宁| 通江| 洪江| 社旗| 苍山| 龙陵| 汶上| 拜泉| 临江| 汕头| 吴起| 巴中| 合江| 临海| 琼山| 遂平| 托克逊| 巴彦| 阿拉尔| 海沧| 贵定| 朝阳县| 八公山| 左贡| 江达| 坊子| 永顺| 番禺| 古蔺| 武陵源| 陇西| 弋阳| 凯里| 新城子| 克拉玛依| 德令哈| 息县| 白朗| 赤城| 敦化| 高雄县| 惠州| 华安|

卓易彩票 安装下载:

2018-10-22 07:15 来源:漳州新闻网

  卓易彩票 安装下载:

  也正因如此,车型在引入中国市场时,常在排量方面进行本土化的调整。面对这样的情况,我们不妨抛出这样几个疑问,在这期间特斯拉怎么了?这说明了什么问题?导致裁员的最根本原因还是因为销售不给力。

其次,还有赖于市场环境的转变。贵州省和山东省内的一些区域是不能销售的。

  显然,这一点和其他豪华品牌为了抢占全球最大市场的销量份额,对中国市场采取一味迎合的做法不同。"在我来到一汽丰田的半年多时间里,最先了解到的是小型车战略和年轻化战略,这两项工作是一汽丰田这几年工作的重心,未来还将继续下去。

  带着这样的疑问,凤凰网汽车走进了这家北京地区较大的奔驰4S店里。该车采用邓禄普品牌轮胎,轮胎规格为205/60R16,载重系数91,速度级别V。

正如一本流行读物的标题中揭示的真相《北欧万有理论:北欧人本VS.美国梦,美好生活的终极探求》对美好生活的终极探求才是北欧品牌、北欧生活的正确打开方式。

  在这个过程中,我们透过很多不同的调研,和美国总部进行很多的沟通,慢慢的他们也开始了解中国市场的需求。

  虽然这个细分市场的体量,相比于其它来说绝对量不算大,但增长是最快的。现在快车的价格普遍高于出租车,并且不少平台推出了高峰时段加价、每单加价、加价呼叫位置更远的车辆等各类服务,进一步提升了网约车的消费门槛。

  ”中国海外房产信息平台居外网的首席执行官罗雪欣说,她知道2017年有北京的买主曾准备在纽约市购买500万美元(约合3195万元人民币)左右的住宅,但是后来推迟了计划,以便能够在今年购买。

  上海自贸区平行进口车经销商通过签订三包险来替代授权进口车的售后三包,在1560-4900元不等,在5200-9900元不等,在5200-14900元不等,这部分价格也是左右消费者购买决策的因素之一。"在我来到一汽丰田的半年多时间里,最先了解到的是小型车战略和年轻化战略,这两项工作是一汽丰田这几年工作的重心,未来还将继续下去。

  "在我来到一汽丰田的半年多时间里,最先了解到的是小型车战略和年轻化战略,这两项工作是一汽丰田这几年工作的重心,未来还将继续下去。

  值此年终岁末,独家代理可享高价值营销服务,提供凤凰独家原生营销定制内容,搭载凤凰快车享全国最大事件营销,为当地开发商提供极具传播力的独家策划。

  “工欲善其事,必先利其器”——地方站是国内领先的城市资讯传播平台;其旨在塑造开发商在当地城市品牌,为各城市开发商打开在互联网上的外宣窗口。从产业周期发展的理论来讲,判断一个新兴产业是否进入快速发展阶段,要具备三大要素:一是从技术到市场,已基本形成较为完善的商业模式。

  

  卓易彩票 安装下载:

 
责编:
首页 > 大数据 > 正文

Spark灰度发布在十万级节点上的实践

2018-10-22 10:32:23  来源:Spark

摘要:Spark 灰度发布在十万级节点上的实践本文介绍了顶级互联网公司数万节点下 Spark 的 CI 与 CD & CD 灰度发布实践。包含如何维护源代码,如何维护 Release 多版本,开发版与正式版,以及如何实现灰度发布,如何进行 hotfix 等。为了提高本文内容的可借鉴性,隐去了公司特有内容,只保留通用部分。
关键词: Spark
  Spark 灰度发布在十万级节点上的实践本文介绍了顶级互联网公司数万节点下 Spark 的 CI 与 CD & CD 灰度发布实践。包含如何维护源代码,如何维护 Release 多版本,开发版与正式版,以及如何实现灰度发布,如何进行 hotfix 等。为了提高本文内容的可借鉴性,隐去了公司特有内容,只保留通用部分。

  CI 介绍

  持续集成是指,及时地将最新开发的且经过测试的代码集成到主干分支中。

\
Continuous Integration

  持续集成的优点

  快速发现错误 每次更新都及时集成到主干分支中,并进行测试,可以快速发现错误,方便定位错误

  避免子分支大幅偏离主干分支 主干在不断更新,如果不经常集成,会产生后期集成难度变大,甚至难以集成,并造成不同开发人员间不必要的重复开发

  为快速迭代提供保障 持续集成为后文介绍的持续发布与持续部署提供了保证

  Spark CI 实践

  目前主流的代码管理工具有,Github、Gitlab等。本文所介绍的内容中,所有代码均托管于私有的 Gitlab 中。

  鉴于 Jenkins 几乎是 CI 事实上的标准,本文介绍的 Spark CI CD & CD 实践均基于 Jenkins 与 Gitlab。

  Spark 源码保存在 spark-src.git 库中。

  由于已有部署系统支持 Git,因此可将集成后的 distribution 保存到 Gitlab 的发布库(spark-bin.git)中。

  每次开发人员提交代码后,均通过 Gitlab 发起一个 Merge Requet (相当于 Gitlab 的 Pull Request)

  每当有 MR 被创建,或者被更新,Gitlab 通过 Webhook 通知 Jenkins 基于该 MR 最新代码进行 build。该 build 过程包含了

  编译 Spark 所有 module

  执行 Spark 所有单元测试

  执行性能测试

  检查测试结果。如果有任意测试用例失败,或者性能测试结果明显差于上一次测试,则 Jenkins 构建失败

  Jenkins 将 build 结果通知 Gitlab,只有 Jenkins 构建成功,Gitlab 的 MR 页面才允许 Merge。否则 Gitlab 不允许 Merge

  另外,还需人工进行 Code Review。只有两个以上的 Reviewer 通过,才能进行最终 Merge

  所有测试与 Reivew 通过后,通过 Gitlab Merge 功能自动将代码 Fast forward Merge 到目标分支中

  该流程保证了

  所有合并进目标分支中的代码都经过了单元测试(白盒测试)与性能测试(黑盒测试)

  每次发起 MR 后都会及时自动发起测试,方便及时发现问题

  所有代码更新都能及时合并进目标分支

  Spark CD 持续交付

  CD 持续交付介绍


  持续交付是指,及时地将软件的新版本,交付给质量保障团队或者用户,以供评审。持续交付可看作是持续集成的下一步。它强调的是,不管怎么更新,软件都是可随时交付的。

  这一阶段的评审,一般是将上文集成后的软件部署到尽可能贴近生产环境的 Staging 环境中,并使用贴近真实场景的用法(或者流量)进行测试。

\
Continuous Delivery

  持续发布的优点

  快速发布 有了持续集成与持续发布,可快速将最新功能发布出来,也可快速修复已知 bug

  快速迭代 由于发布及时,可以快速判断产品是否符合产品经理的预期或者是否能满足用户的需求

  Spark CD 持续发布实践

  这里有提供三种方案,供读者参考。推荐方案三

  方案一:单分支

  正常流程


  如下图所示,基于单分支的 Spark 持续交付方案如下

  所有开发都在 spark-src.git/dev(即 spark-src.git 的 dev branch) 上进行

  每周一将当前最新代码打包,放进 spark-bin.git/dev 的 spark-${ build # }(如图中第 2 周的 spark-72)文件夹内

  spark-prod 指向当前 spark-dev 指向的文件夹(如图中的 spark-71 )

  spark-dev 指向 spark-${ build # }(如图中的 spark-72)

  自动将 spark-bin.git 最新内容上线到 Staging 环境,并使用 spark-dev 进行测试

  spark-prod 比 spark-dev 晚一周(一个 release 周期),这一周用于 Staging 环境中测试

\
Continuous Delivery Solution 1

  注:

  蓝色圆形是正常 commit

  垂直虚线是发布时间点,week 1、week 2、week 3、week 4

  最上方黑色粗横线是源码时间线

  下方黄色粗横线是 release 时间线

  绿色方框是每周生成的 release,带 build #

  蓝色方框是开发版本的 symbolic

  橘色方框是线上版本的 symbolic

  bug fix

  在 Staging 环境中发现 spark-dev 的 bug 时,修复及集成和交付方案如下

  如果在 Staging 环境中发现了 spark-dev 的 bug,且必须要修复(如不修复,会带到下次的 spark-prod 的 release 中),则提交一个 commit,并且 commit message 包含 bugfix 字样(如图中黑色圆形 commit 9 所示)

  该 bugfix 被 Merge 后,Jenkins 得到通知

  Jenkins 发现该 commit 是 bugfix,立即启动构建,生成spark-${ build # }(如图中的 spark-73)

  spark-dev 指向 spark-${ build # } (如图中的 spark-73 )

\
Continuous Delivery Solution 1 bug fix

  hot fix

  生产环境中发现 bug 时修复及交付方案如下

  如果发现线上版本(即 spark-prod)有问题,须及时修复,则提交一个 commit,并且 commit message 包含 hotfix 字样 (如图中红色圆形 commit 9 所示)

  该 hotfix 被 Merge 后,Jenkins 得到通知

  Jenkins 发现该 commit 是 hotfix,立即启动构建,生成 spark-${ build # }(如图中的 spark-73)

  spark-dev 与 spark-prod 均指向 spark-${ build # } (如图中的 spark-73 )

\
Continuous Delivery Solution 1 hotfix

  Pros.

  spark-src.git 与 spark-bin.git 都只有一个分支,维护方便

  spark-prod 落后于 spark-dev 一周(一个 release),意味着 spark-prod 都成功通过了一周的 Staging 环境测试

  Cons.

  使用 spark-prod 与 spark-dev 两个 symbolic,如果要做灰度发布,需要用户修改相应路径,成本较高

  hotfix 时,引入了过去一周多(最多两周)未经 Staging 环境中通过 spark-dev 测试的 commit,增加了不确定性,也违背了所有非 hotfix commit 都经过了一个发布周期测试的原则

  方案二:两分支

  正常流程

  如下图所示,基于两分支的 Spark 持续交付方案如下

  spark-src.git 与 spark-bin.git 均包含两个分支,即 dev branch 与 prod branch

  所有正常开发都在 spark-src.git/dev 上进行

  每周一(如果是 weekly release)从 spark-src.git/dev 打包出一个 release 放进 spark-bin.git/dev 的 spark-${ build # } 文件夹内(如图中第 2 周上方的的 spark-2 )。它包含了之前所有的提交(commit 1、2、3、4)

  spark-bin.git/dev 的 spark 作为 symbolic 指向 spark-${ build # } 文件夹内(如图中第 2 周上方的的 spark-2)

  spark-src.git/prod 通过 fast-forward merge 将 spark-src.git/dev 一周前最后一个 commit 及之前的所有 commit 都 merge 过来(如图中第 2 周需将 commit 1 merge 过来)

  将 spark-src.git/prod 打包出一个 release 放进 spark-bin.git/prod 的 spark-${ build # } 文件夹内(如图中第 2 周下方的的 spark-1 )

  spark-bin.git/prod 的 spark 作为 symbolic 指向 spark-${ build # }

\
Continuous Delivery Solution 2

  bug fix

  在 Staging 环境中发现了 dev 版本的 bug 时,修复及集成和交付方案如下

  在 spark-src.git/dev上提交一个 commit (如图中黑色的 commit 9),且 commit message 包含 bugfix 字样

  Jenkins 发现该 commit 为 bugfix 后,立即构建,从 spark-src.git/dev 打包生成一个 release 并放进 spark-bin.git/dev 的 spark-${ build # } 文件夹内(如图中第二周与第三周之间上方的的 spark-3 )

  spark-bin.git/dev 中的 spark 作为 symbolic 指向 spark-${ build # }

\
Continuous Delivery Solution 2 bugfix

  hot fix

  在生产环境中发现了 prod 版本的 bug 时,修复及集成和交付方案如下

  在 spark-src.git/dev 上提交一个 commit(如图中红色的 commit 9),且 commit message 包含 hotfix 字样

  Jenkins 发现该 commit 为 hotfix 后,立即将 spark-src.git/dev 打包生成 release 并 commit 到 spark-bin.git/dev 的 spark-${ build # } (如图中上方的 spark-3 )文件夹内。 spark 作为 symbolic 指向该 spark-${ build # }

  通过 cherry-pick 将 commit 9 double commit 到 spark-src.git/prod(如无冲突,则该流程全自动完成,无需人工参与。如发生冲突,通过告警系统通知开发人员手工解决冲突后提交)

  将 spark-src.git/prod 打包生成 release 并 commit 到 spark-bin.git/prod 的 spark-${ build # } (如图中下方的 spark-3 )文件夹内。spark作为 symbolic 指向该spark-${ build # }

\
Continuous Delivery Solution 2 hotfix

  Pros.

  无论是 dev 版还是 prod 版,路径都是 spark。切换版对用户透明,无迁移成本

  方便灰度发布

  hotfix 不会引入未经测试的 commit,稳定性更有保障

  prod 版落后于 dev 版一周(一个 release 周期),即 prod 经过了一个 release 周期的测试,稳定性强

  Cons.

  hot fix 时,使用 cherry-pick,但 spark-src.git/dev(包含 commit 1、2、3、4、5) 与 spark-src.git/prod(包含 commit 1) 的 base 不一样,有发生冲突的风险。一旦发生冲突,便需人工介入

  hot fix 后再从 spark-src.git/dev 合并 commit 到 spark-src.git/prod 时需要使用 rebase 而不能直接 fast-forward merge。而该 rebase 可能再次发生冲突

  bug fix 修复的是当前 spark-bin.git/dev的 bug,即图中的 commit 1、2、3、4 后的 bug,而 bug fix commit 即 commit 9 的 base 是 commit 5,存在一定程度的不一致

  bug fix 后,第 3 周时,最新的 spark-bin.git/dev 包含了 bug fix,而最新的 spark-bin.git/prod 未包含该 bugfix (它只包含了 commit 2、3、4 而不包含 commit 5、9)。只有到第 4 周,spark-bin.git/prod 才包含该 bugfix。也即 Staging 环境中发现的 bug,需要在一周多(最多两周)才能在 prod 环境中被修复。换言之,Staging 环境中检测出的 bug,仍然会继续出现在下一个生产环境的 release 中

  spark-src.git/dev 与 spark-src.git/prod 中包含的 commit 数一致(因为只允许 fast-forward merge),内容也最终一致。但是 commit 顺序不一致,且各 commit 内容也可能不一致。如果维护不当,容易造成两个分支差别越来越大,不易合并

  方案三:多分支

  正常流程


  如下图所示,基于多分支的 Spark 持续交付方案如下

  正常开发在 spark-src.git/master 上进行

  每周一通过 fast-forward merge 将 spark-src.git/master 最新代码合并到 spark-src.git/dev。如下图中,第 2 周将 commit 4 及之前所有 commit 合并到 spark-src.git/dev

  将 spark-src.git/dev 打包生成 release 并提交到 spark-bin.git/dev 的 spark-${ build # }(如下图中第 2 周的 spark-2) 文件夹内。spark 作为 symbolic,指向该 spark-${ build # }

  每周一通过 fast-forward merge 将 spark-src.git/master 一周前最后一个 commit 合并到 spark-src.git/prod。如第 3 周合并 commit 4 及之前的 commit

  上一步中,如果 commit 4 后紧临有一个或多个 bugfix commit,均需合并到 spark-src.git/prod 中,因为它们是对 commit 4 进行的 bug fix。后文介绍的 bug fix 流程保证,如果对 commit 4 后发布版本有多个 bug fix,那这多个 bug fix commit 紧密相连,中间不会被正常 commit 分开

  将 spark-src.git/prod 打包生成 release 并提交到 spark-bin.git/prod 的 spark-${ build # }(如下图中第 2 周的 spark-2) 文件夹内。spark 作为 symbolic,指向该 spark-${ build # }

\
Continuous Delivery Solution 3

  bug fix

  在 Staging 环境中发现了 dev 版本的 bug 时,修复及集成和交付方案如下

  如下图中,第 2 周与第 3 周之间在 Staging 环境中发现 dev 版本的 bug,在 spark-src.git/dev(包含 commit 1、2、3、4) 上提交一个 commit(如图中黑色的 commit 9),且 commit message 中包含 bugfix 字样

  Jenkins 发现该 bugfix 的 commit 后立即执行构建,将 spark-src.git/dev 打包生成 release 并提交到 spark-bin.git/dev 的 spark-${ build # }(如图中的 spark-3) 文件夹内,spark 作为 symbolic,指向该 spark-${ build # }

  通过 git checkout master 切换到 spark-src.git/master ,再通过 git rebase dev 将 bugfix 的 commit rebase 到 spark-src.git/master,如果 rebase 发生冲突,通过告警通知开发人员人工介入处理冲突

  在一个 release 周期内,如发现多个 dev 版本的 bug,都可按上述方式进行 bug fix,且这几个 bug fix 的 commit 在 spark-src.git/dev上顺序相连。因此它们被 rebase 到 spark-src.git/master 后仍然顺序相连

\
Continuous Delivery Solution 3 bugfix

  hot fix

  在生产环境中发现了 prod 版本的 bug 时,修复及集成和交付方案如下

  在 spark-src.git/prod 中提交一个 commit,且其 commit message 中包含 hotfix 字样

  Jenkins 发现该 commit 为 hotfix,立即执行构建,将 spark-src.git/prod 打包生成 release 并提交到 spark-bin.git/prod 的 spark-${ build # }(如图中的 spark-3) 文件夹内,spark 作为 symbolic,指向该 spark-${ build # }

  通过 git checkout master 切换到 spark-src.git/master,再通过 git rebase prod 将 hotfix rebase 到 spark-src.git/master

  在一个 release 周期内,如发现多个 prod 版本的 bug,都可按上述方式进行 hot fix

\
Continuous Delivery Solution 3 hotfix

  灰度发布

  本文介绍的实践中,不考虑多个版本(经实践检验,多个版本维护成本太高,且一般无必要),只考虑一个 prod 版本,一个 dev 版本

  上文介绍的持续发布中,可将 spark-bin.git/dev 部署至需要使用最新版的环境中(不一定是 Staging 环境,可以是部分生产环境)从而实现 dev 版的部署。将 spark-bin.git/prod部署至需要使用稳定版的 prod 环境中

  回滚机制

  本文介绍的方法中,所有 release 都放到 spark-${ build \# } 中,由 spark 这一 symbolic 选择指向具体哪个 release。因此回滚方式比较直观

  对于同一个大版本(dev 或者 prod)的回滚,只需将 spark 指向 build # 较小的 release 即可

  如果是将部分环境中的 prod 版迁至 dev 版(或者 dev 版改为 prod 版)后,需要回滚,只需将 dev 改回 prod 版(或者将 prod 版改回 dev 版)即可

  Pros.

  正常开发在 spark-src.git/master 上进行,Staging 环境的 bug fix 在 spark-src.git/dev 上进行,生产环境的 hot fix 在 spark-src.git/prod 上进行,清晰明了

  bug fix 提交时的 code base 与 Staging 环境使用版本的 code 完全一致,从而可保证 bug fix 的正确性

  bug fix 合并回 spark-src.git/master 时使用 rebase,从而保证了 spark-src.git/dev 与 spark-src.git/master 所有 commit 的顺序与内容的一致性,进而保证了这两个 branch 的一致性

  hot fix 提交时的 code base 与 生产环境使用版本的 code 完全一致,从而可保证 hot fix 的正确性

  hot fix 合并回 spark-src.git/master 时使用 rebase,从而保证了 spark-src.git/dev 与 spark-src.git/master 所有 commit 的顺序性及内容的一致性,进而保证了这两个 branch 的一致性

  开发人员只需要专注于新 feature 的开发,bug fix 的提交,与 hot fix 的提交。所有的版本维护工作全部自动完成。只有当 bug fix 或 hot fix rebase 回 spark-src.git/master 发生冲突时才需人工介入

  spark-bin.git/dev 与 spark-bin.git/prod 将开发版本与生产版本分开,方便独立部署。而其路径统一,方便版本切换与灰度发布

  Cons.

  在本地 spark-src.git/master 提交时,须先 rebase 远程分支,而不应直接使用 merge。在本方案中,这不仅是最佳实践,还是硬性要求

  虽然 bug fix 与 hot fix commit 都通过 rebase 进入 spark-src.git/master。但发生冲突时,需要相应修改 spark-src.git/master上后续 commit。如上图中,提交红色 commit 9 这一 hot fix 后,在 rebase 回 spark-src.git/master 时,如有冲突,可能需要修改 commit 2 或者 commit 3、4、5。该修改会造成本地解决完冲突后的版本与远程版本冲突,需要强制 push 回远程分支。该操作存在一定风险

  Spark CD 持续部署

  持续部署是指,软件通过评审后,自动部署到生产环境中

\
Continuous Deploy

  上述 Spark 持续发布实践的介绍都只到 "将 *** 提交到 spark-bin.git" 结束。可使用基于 git 的部署(为了性能和扩展性,一般不直接在待部署机器上使用 git pull --rebase,而是使用自研的上线方案,此处不展开)将该 release 上线到 Staging 环境或生产环境

  该自动上线过程即是 Spark 持续部署的最后一环
第二十七届CIO班招生
北达软第一期EXIN隐私与数据保护基础认证培训
法国布雷斯特商学院MBA班招生
法国布雷斯特商学院硕士班招生
责编:zhangxuefeng
湖滨公园 瑶街 都伏镇 历城路 太平桥村
澄海 富东街社区 伦敦德里 太平路街道 云和镇