如果让你主导一款千万级,甚至亿级用户产品的功能迭代,你会怎么做?

你需要面对的挑战可能来自商业战略的变化带来的新的产品诉求,而产品的任何改动,哪怕只是界面调整,都将接受无数存量用户的“检阅”。

这时候,作为产品负责人,你会选择稳定压倒一切,还是自我革新以追求用户和市场价值呢?

笔者通过对Facebook、Twitter等互联网巨头的调研,试图窥探他们在瞬息万变的市场中仍然保持“稳定”迭代的秘密——渐进式交付,并进一步探索如何使用Spinnaker实现全自动渐进式交付。

通过本篇文章,你将了解:

  1. 什么是渐进式交付。

  2. 为什么渐进式交付能赋予大规模组织下的产品持续交付及稳定迭代的能力。

  3. 既适用于小项目,又适用于大项目的实践经验。

01
什么是渐进式交付
移动互联网时代诞生了一大批巨型互联网企业和项目,部分大型项目的技术复杂度和组织复杂度甚至不亚于传统工业项目,为了实现对这些项目的管理和迭代,我们试图将目光投向已经完成工业革命的传统工业领域去寻找答案。

“渐进式交付”一词最早起源于大型、复杂的工业化项目,它试图将复杂的项目进行分阶段拆解,通过持续进行小型闭环迭代降低交付成本和时间。

资料显示,“渐进式交付”一词流行于互联网领域是在Kubernetes及云原生理念被普及之后。尤其是在持续部署流水线出现后,渐进式交付为互联网应用提供了基础设施和实现方法。

在产品的迭代过程中,可以将渐进式交付的具体行为附着在流水线中,将整条交付流水线看作产品迭代的一个过程和一次渐进式交付周期。渐进式交付在实践中是以A/B测试、金丝雀/灰度发布等技术手段落地的。

以Facebook为例,其每次发布重大功能,都会经历一次典型的渐进式交付过程:

  1. 迭代发布

  2. 公司全员进行A/B测试

  3. 特定用户进行A/B测试

  4. 灰度发布

  5. 全量发布

在渐进式交付的过程中,A/B测试环节及灰度发布环节都可以根据用户数据和市场反馈决定是否全量发布,这种方式既能够保证迭代敏捷,又能够保证市场安全性。

(1)A/B 测试

可通过对用户画像中地理位置和性别组合条件进行A/B测试,使其访问新版本,而其他的用户则继续访问旧版本。一段时间后,研究用户行为数据和用户体验报告,决定是否继续进入下一个发布环节。图片图片

(2)金丝雀/灰度发布

可使用特定的分流技术使流量由新、老版本共同承担,例如典型的MurmurHash算法。

02
技术和商业价值
从原理上来看,这些技术并不是多么新的技术,比如A/B测试,我们采用最原始的方式(业务代码增加逻辑判断条件)也可以实现,但为什么没有大规模运用呢?

原因很简单:纯业务代码的实现依赖于技术,需求方无法自主控制A/B测试的环境和条件,这种过度依赖于技术的开发方式并不能规模化运用。

我们需要的是一种完全脱离业务代码的实现方式,最好能以自动化/半自动化方式实现,并且尽量能把这个动作加入已有的内部流程内。

现在,有了云原生持续部署工具Spinnaker ,自动化的渐进式交付便成为可能。我们参考Facebook的发布方式,设计了Spinnaker Pipeline。

它主要实现了以下功能:

流水线被触发后,自动执行K8S Job Migrate数据库,并部署新版到预发布环境;

人工确认,发布生产环境前是否进行A/B测试;

A/B测试通过后,设置灰度发布的比例,执行自动灰度发布;

人工确认,是否全量发布到生产环境;

自动配置限流和熔断策略,保证生产稳定。

对于开发人员,这种渐进式交付经过多轮的灰度发布、A/B 测试,能最大程度减少代码BUG发布到生产环境。

对于运维人员,这种几乎全自动的交付方式改变了手动修改yaml文件、手动apply的传统,能大程度减少发布产生的人为错误,通过自动触发的方式降低了与开发的沟通成本。

对于产品经理和运营人员,产品迭代不再靠内部团队猜测,而是基于实际用户体验数据,了解新功能对于用户和市场的反馈,能最大程度降低新功能的市场风险。

03
核心原理
在上面的例子中,我们使用了Traefik作为集群网关,使用Router对Host dev.coding和pro.coding进行匹配,使流量按照不同发布阶段进行不同的分配。

(1)Dev 环境架构图

访问dev.coding时,Router匹配到此Host规则,将流量转发到名为k8s-flask-nodeport 的Service(即Dev环境的Service)。

Traefik Router的核心配置代码如下:

(2)A/B测试环境架构图

访问 pro.coding时,Router匹配到此Host规则,检查Header是否匹配,并将根据匹配结果决定将流量转发到k8s-flask-canary还是k8s-flask环境的Services。

A/B测试Traefik Router的核心配置代码如下:

(3)灰度发布架构图

访问 pro.coding 时,Router 匹配到此Host规则,并根据配置的Weight权重,将流量按比例转发到k8s-flask-canary或k8s-flask Service。

(4)熔断和限流架构图

在生产环境中,我们一般使用限流和熔断技术来应对流量激增,牺牲部分用户的体验来保证生产环境的稳定。Traefik内熔断和限流是通过配置middlewares来实现,对流量进行匹配后,再进行中间件二次流量确认。

Traefik Middlewares限流核心配置代码如下:

Traefik Middlewares熔断核心配置代码如下:

04
小结
Kubernetes和Service Mesh的出现给持续部署带来了更多可能,渐进式交付只是一种借助其便利性而形成的比较典型的发布方式。

我们借助了Traefik作为集群网关,通过分流技术实现了A/B测试和灰度发布,并将这些声明式配置文件用Spinnaker进行编排,实现了渐进式交付过程。

Traefik 提供的熔断和限流能力,结合Spinnaker Pipeline的Webhook触发及监控系统(如Prometheus),可以在业务系统压力较大时自动触发熔断和限流Pipeline,改变限流策略,保证生产环境的稳定性。

当然,你也可以引入Service Mesh,使用Istio管理集群流量,借助Virtual Service和 Destination Rule实现同样的效果。

Spinnaker:云原生多云环境持续部署的未来!如果想了解更多关于Spinnaker的技术细节,欢迎阅读《Spinnaker实战:云原生多云环境的持续部署方案》。

▊《Spinnaker实战:云原生多云环境的持续部署方案》

王炜,王振威 著

开创了云原生多元环境持续部署工具Spinnaker的先例,讲解深入

案例基于大厂一线工程师的实际工作,具有非常好的指导性和实践性

提供丰富的图片资源和实践源码,帮助读者快速上手

本书聚焦于云原生和多云环境的持续部署方案,共分13章,内容涉及声明式持续部署概述、Spinnaker基础与实战、金丝雀发布与灰度发布、部署安全、混沌工程及生产化建议等,结构清晰,循序渐进,深入浅出。

在持续部署最佳实践方面,本书重点介绍了如何实施灰度发布、自动金丝雀分析和混沌工程,这些高级部署功能是Netflix 公司实现快速而稳定迭代的核心技术。关于如何落地Spinnaker,本书站在人和组织架构的视角,为迁移团队提供了指导性的意见,解决了新技术落地难的问题。

保持稳定迭代的秘密:基于Spinnaker的全自动渐进式交付相关推荐

  1. 如何利用Docker构建基于DevOps的全自动CI

    来自用户的DevOps实践分享,分享从开发代码到生产环境部署的一条龙操作的实践及经验, 包含工具技术的选型及考量.私有代码库与私有镜像库的应用等. (一)容器服务的Rancher选型 1.为什么说是下 ...

  2. 基于单片机c语言的豆浆机,基于单片机的全自动豆浆机控制系统设计.doc

    论文题目: 基于单片机的全自动豆浆机控制系统设计 摘 要 全自动豆浆机基本工作过程是将事先泡好的大豆放入豆浆机内,并加入适量冷水后将电热管通电加热至80°C,粉碎电机通电工作.进行磨豆浆期间断续工作三 ...

  3. 基于单片机的全自动洗衣机模拟系统

    具体实现功能 具体实现功能: 模拟全自动洗衣机工作过程,以电机替代洗衣机电机. 可以显示洗衣机工作的状态(进水.浸泡.洗衣.脱水.结束).显示工作剩余时间(洗衣程序可自定义,时间精度:秒). 洗衣时交 ...

  4. C语言洗衣机源代码,基于AT89C51的全自动洗衣机(附电路图、源程序代码及外文翻译).doc...

    摘要 洛阳理工学院毕业设计(论文) PAGE IV PAGE 12 基于AT89C51的全自动洗衣机 摘 要 随着数字控制技术的快速发展,其被广泛应用于智能控制的领域中.单片机以体积小.功能全.价格低 ...

  5. 基于云原生的私有化交付PAAS平台

    目录 前言 什么是云原生? 从Docker到Kubernetes:小鲸鱼大记事 docker起源 容器编排之争 CNCF创建 尘埃落定 CNCF - 生态的力量 基于云原生的私有化交付PAAS平台 传 ...

  6. 阿里云机器学习PAI发布基于HLO的全自动分布式系统 TePDist,并宣布开源!

    作者:品曲,宗雁,佀畅,侠雕,伟林 导读 一直以来,大模型在模型效果上被证明具有显著优势.而ChatGPT的出现,证明了其在工业生产工具方面具有巨大潜力.毫无疑问,大模型的训练需要巨大的算力,这对分布 ...

  7. 基于VHDL的全自动洗衣机控制器设计

    全自动洗衣机控制器设计 <数字电子技术>课程设计报告 <数字电子技术>课程设计任务书 设计内容与要求 1.概述 1.1EDA简介 1.2开发软件quartus简介 2.基本原理 ...

  8. 树木分形迭代图 matlab,基于迭代函数系统的分形植物模拟

    1. 引言 自然景物模拟是计算机图形学中一个重要研究课题,其中植物形态仿真模拟引起了广泛的关注.许多学者对其进行了大量的研究,目前常见的方法有L-系统 [1] [2] .迭代函数系统 [3] [4] ...

  9. k8s容器灰度发布最佳实践(基于spinnaker)

    k8s中的容器一般是通过deployment管理的,那么一次滚动升级理论上会更新所有pod,这由deployment资源特性保证的,但在实际的工作场景下,需要灰度发布进行服务验证,即只发布部分节点,这 ...

  10. springboot后台怎么获取前端传过来的excel_基于SpringBoot的全自动办公系统源码文档全部免费分享...

    基于SpringBoot,目标是实现自动办公,现阶段整合springmvc + shiro + mybatis + Thymeleaf等常见框架,包含用户管理.部门管理.通知管理.日志管理等. --- ...

最新文章

  1. 清华教授沈向洋:创新就要做到极致,用开源的方式培养未来的工程师
  2. Ubuntu14搭建配置青岛大学OJ系统
  3. springboot . 配置jpa使用
  4. ce5e.cn fadian.php,空包网 PHP mysql
  5. hihocoder 二分
  6. 你真的了解 “开源” 么?请查收【保姆级】开源百科
  7. 《产品设计与开发(原书第5版)》——3.2 机会识别的评比结构
  8. C# 编译的DLL文件在其他项目中调用时,看不见注释
  9. 66天全部就业,最高薪资25000元!黑马Java学科真牛
  10. 未受信任的企业级开发者_“未受信任的企业级开发者”是什么意思?怎么解决?...
  11. c语言编写dxf文件吗,判断dxf文件的版本
  12. foxmail 163企业邮箱配置
  13. 图像处理3D 人体模型
  14. Selenium-针对alert弹窗无法获取,弹出no such alert的解决方法
  15. python存csv中文乱码问题
  16. MT6169 RF System Datasheet资料介绍
  17. DVWA-XSS(Reflected) 全级别教程
  18. 工程项目管理和施工项目管理立项在钉钉中应该如何设计?
  19. BUUCTF SimpleRev(涉及大小端序存储的问题)
  20. 小白c语言学习笔记(2)——有一篇文章,共有3行文字,每行有80个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格以及其它字符的个数。

热门文章

  1. 13.3.5 【接口和委托的泛型可变性】限制和说明
  2. docker 监控之 cadvisor
  3. 【转】CentOS7 yum方式配置LAMP环境
  4. bzoj 3672 利用点分治将CDQ分治推广到树型结构上
  5. (转)XP和Scrum到底有什么区别?
  6. 教你如何拒绝带病毒的恶意网页陷阱
  7. js实现的笛卡尔乘积-商品发布
  8. LINQ的基本语法包含如下的8个上下文关键字,这些关键字和具体的说明如下
  9. (转载)Sybase:bcp命令参考
  10. UVa 1252 (状压DP + 记忆化搜索) Twenty Questions