OpsDev 将至

  • 金灵杰

2016 年 9 月 13 日

话题:语言 & 开发架构DevOps

DevOps 在 09 年被提出之后,热度一直不减。最近几年,随着容器化、微服务等概念的兴起,DevOps 又开始了大规模实践。但是,随着基础设施的增加,软件设计从 Ops 角度出发,可以更好的规避基础设施变更带来的风险。

从苹果公司开始

开发者、用户、投资者、分析师和竞争对手都渴望在 WWDC 上学习到苹果公司维持其领导地位的方式。虽然没有令人兴奋的新产品发布,但是贯穿其中很多话题的核心是:用户体验。

和其他手机厂商的发布会不同,苹果公司专注于客户的体验,而不是其产品的功能和特性。当竞争者在吹捧他们新品拥有的高像素相机和处理器核心数量的时候,苹果公司展示 iPhone 拍摄的优美、富有灵感的照片时,没有提及设备的任何技术细节。

现在,手机已经改变了我们的生活,日常的衣食住行都可以通过手机 app 来协助完成。但是苹果公司认为智能设备还能使我们的生活更加高效。不同于目前每个 app 提供独立的功能,苹果公司希望能够将这些服务整合到一起,对于用户来说,他们只需要使用苹果的服务,而无需打开多个 app。要实现这样的愿景,产品或者服务都需要有新的设计范式。任何期望通过接入苹果服务以对外提供个性化用户体验的公司,都应该考虑 OpsDev 而不是 DevOps。

进入 OpsDev 的世界

我们假设一家电器公司制造的智能冰箱,为用户提供以下体验:

当我坐在车里时,智能冰箱通过手机发出提醒:冰箱存货不足,该去买些食品啦。此时,手机自动生成并推荐了三个采购方案。第一个超市不需要绕路,但是没有我喜欢吃的冰淇淋;第二个超市比第一个远 10 分钟,但是有所有我喜欢吃的所有食物;第三个超市更远,需要多 15 分钟的路程,但是它除了有所有需要采购的东西,还提供额外优惠券。我点击了其中一个方案,车载导航开始自动规划行车路线,并显示在汽车多媒体系统中。

在不久的将来,很多公司会致力于提供集成的个性化用户体验,因此不同的数据源和服务必须被整合到一起。智能冰箱通过传感器判断冰箱内的存货,超市服务提供其库存和优惠信息,其他还有交通信息、地理位置信息等等。这些数据源由不同的提供商提供,并且保存在不同的数据中心。这些数据的访问,需要特定的授权方式、API 和数据处理流程。个性化服务的设计者,必须明确了解每个服务的规约,因为任务信息不能及时正确的获取,都会影响到用户体验。作为零售商,不会希望用户多花了 15 分钟时间过来,结果却因为需要购买的商品缺货,或者无法使用优惠券而造成损失。

由此可见,个性化软件服务的交付影响了现有的软件设计模式。DevOps 克服了传统瀑布流所不能提供的快速交付能力,通过诸如代码审查、编码规范、持续集成等方式解决软件开发遇到的挑战,并且让开发直接参与到了产品上线流程。而 OpsDev 考虑的方面却不同。由于个性化服务依赖于底层一系列基础设施,一旦我们知道了每个独立的数据源的依赖关系和可用性,首先需要设计出将各个数据源结合在一起的组件。因此,设计者必须从运维的角度来考虑,对每个服务的依赖程度、故障修复、容错等;同时,由于每个服务相对独立由于每个服务相互独立,个性化软件服务的升级频率受其依赖的服务升级频率影响,这也需要从运维的角度考虑向下(向上)兼容。

什么是 OpsDev?

OpsDev 是在开发行为开始前,就需要了解应用程序依赖的所有组件,并进行建模。此外,对基础设施稳定性的考量、环境建模、安全审计措施都是第一要务。其次,应用程序组件上线后的部署环境需要被建模。再次,将组件部署到生产环境的流程必须尽可能自动化。通过以上步骤,设计和研发团队可以在开发和测试阶段复制应用程序、环境模型和自动化部署流程。这样设计、研发和测试团队可以清楚的知道应用程序在生产环境的约束和参数。在传统的项目模式下,大量时间浪费在完成验证的应用程序部署到生产环境之后才发现的缺陷。

由于部署自动化在设计之初就被考虑到,应用程序可以随时被部署到开发、测试和生产环境。这种方式不仅可以通过自动化流程加快各个环节的部署速度,还可以减少因为手工部署导致的质量问题。部署程序应该可以聚合多个独立开发的模块。每个模块都可以由独立的开发团队进行开发,并且定制适合自己的持续基础、持续交付流程。发布程序需要预先知道每个模块之间的依赖关系,这样可以快速的聚合每个通过持续集成、持续交付的流程的模块,将它们整合之后部署到集成环境或者生产环境。

通过 OpsDev 方法,发布方式变得更加灵活。整个部署流程被设计的可以插入验证流程。一个典型的持续交付流程可以是:发布程序首先将待发布应用程序部署到集成环境(UAT 测试环境、预发布环境)上,然后触发发布前的自动化、手工验证、性能基线验证等一系列验证措施,整个过程通过之后,部署程序再将应用程序发布到生产环境,发布成功之后记录基线信息和本次变更的状态。

总结

对于物联网或者基于用户体验的移动 app 厂商来说,传统的软件开发流程无法适应它们的产品,因为它们都会对很多 SaaS 服务有依赖,且应用程序包含很多组件(物联网设备中的 app、移动设备中的 app、数据中心的后台服务、网页服务等)。像苹果这样鼓励开发者优先思考用户体验,并提供个性化服务的公司,可能会加速思考方式从 DevOps 向 OpsDev 的转变。


感谢郭蕾对本文的审校。

给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ@丁晓昀),微信(微信号:InfoQChina)关注我们。

语言 & 开发架构DevOps