Gcore 公共 API 团队的故事令您了解开发者使用更新的软件栈能获得哪些明显或意想不到的好处。
译自 Why Staying Updated with Your Software Stack Matters 。
使用更新的软件栈具有自明的好处:增强功能,提高开发效率,使用最新文档更便利,以及通过覆盖最近暴露漏洞的补丁来增强安全性。
但是在 Gcore,我们希望深入探讨。几年前,我们花了两个半月时间全面更新软件栈,如今正在获得回报,特意与您分享经验。我们将介绍公共 API 的技术基础设施,揭示更新软件栈的显性及隐性益处,并指导您如何将我们的策略应用于自身团队以获得这些好处。
我们的公共 API 团队勤于更新软件栈,并监控新机遇以提升生产力。通过关注他们的努力,我们展示使用更新软件栈为开发者带来的具体好处。
公共 API 是 Gcore 内容分发网络(CDN)的关键管理组件。它是一个面向用户的服务,通过图形用户界面或命令行界面接收命令,将命令应用到 CDN 后端。速度、可靠性、灵活性和安全性是其基石。
Gcore CDN 的软件层:图形用户界面、公共 API、内部 API、CDN 后端、Nginx
公共 API 充当用户请求的网关,仔细处理和转译请求,将其转化为产品后端的可执行命令。由于其连接外部环境,安全性是这个软件组件的首要任务。
和 CDN 软件环境中的其他组件一样,公共 API 必须具备强大的稳定性、可扩展性和高性能。但是,与我们的后端服务不同,公共 API 不仅要具备弹性,还要在开发方面高度适应不断变化的客户需求。
为了更具体地概述我们对软件更新和版本控制的方法,让我们看看 Gcore 公共 API 中使用的具体编程语言、工具和服务。
技术软件栈
以下是最重要的四个:
- Python(当前版本:3.11)是我们的主要编程语言。
- Django(当前版本:4.2)是我们的基础Web框架。
- Django REST框架或drf(当前版本:3.14)是我们的Django扩展,用于更快速地构建API。
- Celery(当前版本:5.3)是一个用于运行异步任务和计划任务的框架。
开发工具
为了提高团队生产力,我们使用了各种服务软件和工具来提高我们的代码可读性并简化测试流程。这里举几个例子:
- Pytest(当前版本:7.4)是我们编写单元测试和功能测试的主要框架。
- Coverage(当前版本:4.1.0)与Pytest结合使用,可以跟踪测试过程中代码覆盖率的百分比。
- Isort是一个方便的工具,用于控制导入语句的格式。
- Black是一个严格的代码格式化程序,我们用它来评估代码是否符合预设的风格。
- Flake8是一个静态代码分析工具,可以监测代码并检测语法错误和缺陷。
- Pyupgrade可以帮助我们自动跟踪和升级语法,以适应Python语言的新版本。
我们定期更新这些工具,以保证它们始终使用最新版本。下面让我们看看如何跟上这些更新。
Public API团队长期以来一直使用过时的软件栈,这带来很多麻烦。尽管我们明白使用最新软件版本的好处,但由于资源有限,我们仍然被困在老旧的软件中。这是一个典型的困境:你很清楚最新的环境可以提高性能,但总有更紧迫的任务排在前面。
突破的关键在于团队的协作与热情。整个更新过程花费了大约2.5个月的时间,不仅需要我们在技术上做出调整,也需要团队形成新的工作流程和心态。下面我们来看看实现新策略的过程:
在这一阶段,我们承认使用过时的软件栈会带来大量额外工作和潜在风险。我们也认识到,这种状态的积累效应很容易破坏我们对其他“高优先级”任务和紧急修复的快速有效响应能力。
这一点看似显而易见,但其实是最难迈过的一步。
在承认问题后,团队选派一位经验丰富的开发人员全力负责此项目。他负责执行所有变更并协调基础设施环境中的依赖关系。
我们更新的重点是技术软件栈。它需要仔细谨慎地处理,所以我们每次只更新一个版本,确认所有功能正常后再更新下一个版本。具体步骤如下:
- 升级Python。
- 升级Django REST框架(drf)。
- 升级Celery。
- 升级Django。
- 修复向后兼容性问题和已弃用的特性。
- 从头再来重复上述步骤。
这种迭代方法使我们能够在没有风险的情况下稳步推进。有时我们会被其他团队的关键工作阻塞,比如CDN后端团队更新PostgreSQL数据库的时候。
主要技术栈更新完成后,我们继续更新开发工具。由于这部分对服务影响不大,我们决定直接批量更新到最新版本,没有逐步迁移。
最后一步是在日常工作中沿用这种更新方式以保持最新。为此,我们设置了Dependabot,一个GitHub机器人,负责自动监测软件并建议更新。
每当Dependabot在我们的栈中发现新版本,就会通知我们并启动CI/CD流程。如果发现任何错误或与现有依赖不兼容,更新会被暂停,新版本也不会被集成。如果一切顺利,我们只需批准变更并合并到主分支。
我们总结了Public API团队使用最新软件栈工作几个月后的体会,将这些好处分为两类:显而易见和意外的。
更好的安全性
使用最新软件版本可以减轻大多数已知漏洞的影响,增强我们的整体安全性,为代码提供基本的内在安全保障。定期更新库和依赖可以积极地预防新发现的漏洞,减小新出现的网络威胁的影响。
性能提升
由于Python是我们Public API服务的主要语言,所用的版本对服务整体性能有关键影响。 Python解释器的新版本通常比老版本更快,这得益于各种优化。例如,合成测试显示Python 3.11比3.10平均提速20-25%。
尽管解释器效率的提高非常诱人地联想到对应服务性能的linear提升,但实际情况很复杂。我们的Web应用包含多个集成和大量数据库交互,很难直接量化代码级提升对整体性能的影响。但我们确实观察到了服务运行加速,尤其是纯代码执行场景,即使无法明确量化。
提高效率和生产力
Python不断进化,提供新的功能,这使开发者的工作更轻松,代码逻辑和可读性也得到改进。 它的库也是如此,每新版本都会更加强大。 对我们的意义是获得更大灵活性,编写代码更快更方便。
使用Flake8等静态代码分析器可以即时修正错误和优化代码一致性,省去debug的需要。 这提高了效率,使我们的团队可以更专注于业务逻辑,而不被代码格式或旧库功能所约束。
轻松获得新功能
使用过时软件会严重阻碍创新,特别对于像我们这样的快速迭代公司。 使用最新版本可以确保我们无缝地在基础设施中集成新软件如PostgreSQL,不必担心兼容性问题。 如果有兼容性疑问,我们可以快速查询开发者文档,避免权宜之计。
提升团队动力
团队动力不容小视:良好的工作环境可以真正提高绩效和体验,尖端的工具更能放大这种效果。 使用前沿技术让我们的团队感到振奋,可以致力于创新的解决方案而不是修补过时系统。 想要引领行业创新但受限于老旧技术会很沮丧,我们努力让开发者始终站在技术前沿。
团队专业知识
另一个关键好处是使我们的团队专业知识保持最优。 接触最新技术不仅让我们获取最新信息,还可以把新知识直接应用到项目中,做出更出色的产品。
创新文化
当现状是和过时软件及不稳定依赖做斗争时,很容易形成一种抵制变革的文化。 相反,如果保持更新是常态,就会自然形成对新事物的开放和包容。 这种心态促进创新文化,鼓励每个人去探索、试验并集成软件新版本的功能。
吸引顶尖人才
最后同样重要的是:当向候选人展示我们的软件栈时,我们经常得到“哇,太棒了!”的反馈。 潜在开发者明白,在我们团队他们可以站在行业技术前沿,获得专业成长。 这种尖端的环境不仅吸引了顶级人才,也使他们持续成长,从而使我们成为备受瞩目的雇主。
从事IT必须与时俱进和具创新精神。 使用过时的软件栈必然会失去竞争优势。 老旧技术会导致各种系统低效,使产品性能下降且容易受攻击。
Public API是Gcore CDN的关键组件,需要高性能和现代的技术栈。 更重要的是,出色的软件环境对开发团队也非常重要。 它提高了效率和动力,扩展了专业知识,并促进开发者的创新思维。
有趣的事实: 在写此文时,我们已将Celery从5.3.0升级到了5.3.4。