N26:构建无缝体验的平台工程之路-Part 2


在第一​​​​​​部分,我们介绍了 N26 团队为达成 “在 Day 1 实现轻松部署” 的目标而设定的战略规划和开发人员体验图,在这一部分,我们将带您了解该团队如何构建最简可行平台以及该平台如何运作。
 

01 计划构建最简可行平台

我们通过采用 Story Workshop,将功能分解为三个层级,以洞察其基本特征和范围大小,并更好地确定优先级。
 

在这里插入图片描述
 

在研讨会中,我们深刻认识到软件工程的复杂性。我们讨论了一些简单问题,比如数据库迁移和日志记录,也讨论了更高级的问题,比如在软件交付生命周期(SSDLC)中确保安全性,再比如在分期付款计算和信贷融资等操作中采用 Money 模式来避免四舍五入错误。这些问题的代价不容忽视,而且发生的频率比我们想象的更高。

 

软件开发的残酷事实:永远没有足够的人力、时间和资金来构建你想要的一切。因此,关键是确定重点和优先顺序。而这正是 Story Workshop 的优势所在,因为它能帮助我们定义 “最简可行平台”(TVP)

 

在某些情况下,TVP 可能是作为软件开发构件的组件或服务文档。尽管如此,定义 TVP 还是很重要的,因为软件工程师喜欢构建技术性的东西,如果没有重点,就有可能交付一个忽视开发人员体验的复杂平台。这里我们将着重关注在 TVP 中实现哪些功能,目标是设计一个能够在一周内运行的配置流程,初始功能集将为我们构造平台的基础
 

在这里插入图片描述
 

因此,我们优先安装了 Kubernetes、编排自动化(我们将其命名为 “项目引导器”)和服务架构。但是在没有任何数据库支持的情况下,如何交付呢?我们告诉团队,他们可以使用内存存储库来实现这些目的。TVP 发布后不久,平台团队发布了数据库配置功能。自此产品团队可以在生产中部署完全可运行的服务。

 

对于从事平台工程的人来说,这是一堂重要的产品管理课。通过发布产品,可以部分解决问题。要计划减少构建量,并为用户和利益相关者提供替代方案。在解决临时问题时,协调和沟通非常重要。

 

从那时起,我们的平台发生了翻天覆地的变化。但每一个进步都离不开平台团队的辛勤工作,他们始终计划以迭代的方式推进平台的功能。这一过程的核心是了解业务目标、产品工程师的需求和监管要求,优先考虑能为公司带来价值的功能
 

02 我们的平台如何运行

 

转眼到了2023年7月。我们平台日益壮大,不断优化协同工作,使每个人的工作都更加便捷。开发一项全新的服务时,产品工程师需要复制和管理基础架构的资源库,并运行make命令:
 


$ git checkout -b overnight 
$ make create-team spaces

 
该命令提供了一个目录,产品工程师团队将在该目录中编辑一个配置文件来启动新服务。该文件允许配置服务级别目标(SLO)和数据库集群大小等内容:
 

locals {projects = {overnight = {description = "Calculate the balances' CDI-indexed yield."repository = {bootstrap = truelanguage = "kotlin"}service = {bootstrap = true}monitoring = {bootstrap = trueerror_rate = "0.5"read_latency = "0.4"write_latency = "4"apdex = "0.94"}database = {bootstrap = trueinstance = "db.r6g.large"replicas = 4engine = "aurora-postgresql"}queues = {bootstrap = truenames = ["invoice-paid", "yield-calculated"]}logs = {archive = true}cdn = {bootstrap = false}}}
}

 
​然后,产品工程师提交文件并创建拉取请求,由平台团队进行审核。我们制定了一项政策来防止微服务失败。作为领域驱动设计(Domain-Driven Design)的实践者,我们更倾向于围绕有边界的上下文设计服务,只有经过深思熟虑后才能拆分服务,平台团队才会审查是否符合政策。

 

拉取请求获得批准后,就会触发编排。编排:
 

  • 在 AWS IAM 中为应用程序创建服务用户。
  • 创建启用水平和垂直 pod 自动分级器的 Kubernetes 服务。
  • 将API 网关与 Kubernetes 入口集成,以公开服务的 API。
  • 在 AWS RDS 中创建 Aurora集群,并启用水平自动扩展。
  • 创建消息队列/主题。
  • 创建与内容分发网络(CDN)集成的 S3 目录。
  • 在机密管理系统中存储凭证(API 密钥、数据库密码等)。
  • 使用 service chassis 引导新服务代码库。
  • 在BitBucket 中创建新的服务存储库。
  • 配置 BitBucket 资源库变量。
  • 创建 CI/CD 流水线。
  • 配置质量和安全网关。
  • 运行服务的首次部署。
  • 在 Datadog 中创建服务级别目标 (SLO)。
  • 在 Datadog中配置服务警报。
  • 运行健康检查以确保供应工作。

 

这里的 service chassis 是一个基于 Ktor 的框架,其封装了细致的开源库和内部开发的组件,以减少对持久性和日志记录等问题的认知负荷。
 
在这里插入图片描述
 

配置完成后,产品工程师会克隆存储库并开始开发新服务。service chassis 会自动生成 Docker Compose 文件,来支持本地开发。所有项目共享相同的引导结构,方便产品工程师在项目间切换。此外,更少的可变性意味着平台工程师在增强工程团队使用的底层工具时,可以加快优化周期。

 

产品工程师可以在早期监控应用性能,并排除查询速度慢和 Apdex 分数低等问题。警报会自动配置并发送到标准化的 Slack 频道(每个团队都有一套标准的 Slack 频道,其中一个专门用于可观察性警报)。

 

为了微调可用算力,产品工程师可以更新配置文件,增加运行服务所需的 Kubernetes pod 数量。从产品工程师的角度来看,建立生产环境的唯一方法就是通过这个抽象了底层云基础设施的配置文件。这就保证了对生产环境的所有更改都会受到全面的审计。

 

同时,我们还有一系列需要人工操作但必须遵循准则或标准的工作。有些指南是在同行评审过程中产生的,比如 API 设计评审。我们努力从语义上设计 API。目前我们团队遵循设计文档中的规则。

 

强调文档的重要性也是我们一直在做的事。文档记录了产品工程师工作中最关键的部分,包括整个软件开发生命周期(SDLC)。例如,产品工程师可以通过阅读文档了解如何创建新凭证并将其机密存储在我们的云环境中,或者如何调整警报阈值。自动化流程和文档是自助服务平台的基础

 

在这里插入图片描述
 

当新人加入我们的团队时,identity provider 会发送一封欢迎电子邮件,告知如何激活笔记本电脑。当然笔记本电脑是已完全配置好的,并更新到最新版本的操作系统和开发工具。软件工程师需要做的唯一工作就是克隆资源库,并运行 README 文件中提供的启动脚本(通常是 Docker Compose 命令)。

 

为了让我们基于网络的工具(如 Rancher、Datadog、Jira、Confluence、1Password、Slack)随时可用,我们使用 Okta 来提供身份管理。只需一个密码,用户就能解锁笔记本电脑并访问所有工具。将我们的平台范围扩大到访问管理和笔记本电脑设置等问题,有助于我们实施工程范围内的变更,如滚动工具更新和增强,而无需中断人员手动运行设置向导。
 

03 总结

 
N26 的平台工程之路漫长而曲折。从定制的协调工具到手动流程的标准化,我们致力于让开发人员在 Day1 就能够轻松部署。在此过程中,我们消除了对第三方基础设施的依赖,从而使应用程序接口延迟大大降低。最终开发人员生产率大幅提高。

 

通过构建内部平台,我们深刻体会到战略性地管理平台的重要性。除了充足的人力、时间和资金,还需要建立许多其他要素。其中,最重要的是产品思维,可以利用现有工具,特别是开源工具,来缩小开发范围;要关注开发者体验以及公司的目标成果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/223072.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode //C - 605. Can Place Flowers

605. Can Place Flowers You have a long flowerbed in which some of the plots are planted, and some are not. However, flowers cannot be planted in adjacent plots. Given an integer array flowerbed containing 0’s and 1’s, where 0 means empty and 1 means no…

高通开发系列 - 功耗问题之添加CPU Idle和Hotplug的功能

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 返回:专栏总目录 目录 概述CPU IdleCPU TopologyCPU Idle DriverCPU Idle GovernorCPU的hotplug函数

docker相关的命令

镜像管理命令 说明 docker images 查看本机镜像 docker search 镜像名称 从官方仓库查找镜像 docker pull 镜像名称:标签 下载镜像 docker push 镜像名称:标签 上传镜像 docker save 镜像名称:标签 -o 备份镜像名称.tar 备份镜像为tar包 docker load -i 备份镜像名…

ifconfig命令和ip命令

1.ifconfig ifconfig是Linux中用于显示和配置网络接口参数的命令。以下是一些常用的ifconfig命令选项: 查看所有网络接口的信息:ifconfig -a查看指定网络接口的信息,例如eth0:ifconfig eth0配置网络接口的IP地址、子网掩码和广播…

TCP/UDP 协议

目录 一.TCP协议 1.介绍 2.报文格式 ​编辑 确认号 控制位 窗口大小 3.TCP特性 二.TCP协议的三次握手 1.tcp 三次握手的过程 三.四次挥手 2.有限状态机 四.tcp协议和udp协议的区别 五.udp协议 UDP特性 六.telnet协议 一.TCP协议 1.介绍 TCP(Transm…

DBCA创建RAC的过程截图

以下错误是由于配置的内存较大,而大页(HugePage)配置较小导致,调整大页后就好了。

挑战52天学小猪佩奇笔记--day22

52天学完小猪佩奇--day22 ​【本文说明】 本文内容来源于对B站UP 脑洞部长 的系列视频 挑战52天背完小猪佩奇----day22 的视频内容总结,方便复习。强烈建议大家去关注一波UP,配合UP视频学习。 day22的主题:掉牙齿 语境:最开始是佩…

Kafka基础理论与常用命令详解(超详细)

文章目录 前言一、Kafka概述1. Kafka简介2. Kafka架构2.1 Broker(代理服务器)2.2 Topic(主题)2.3 Producer(生产者)2.4 Consumer(消费者)2.5 Consumer Group(消费者组&am…

Centos硬盘操作合集

一、硬盘命令说明 lsblk 列出系统上的所有磁盘列表 查看磁盘列表 参数意义 blkid 列出硬盘UUID [rootzs ~]# blkid /dev/sda1: UUID"77dcd110-dad6-45b8-97d4-fa592dc56d07" TYPE"xfs" /dev/sda2: UUID"oDT0oD-LCIJ-Xh7r-lBfd-axLD-DRiN-Twa…

Mybatis详解

MyBatis是什么 MyBatis是一个持久层框架,用于简化数据库操作的开发。它通过将SQL语句和Java方法进行映射,实现了数据库操作的解耦和简化。以下是MyBatis的优点和缺点: 优点: 1. 灵活性:MyBatis允许开发人员编写原生的…

如何正确使用缓存来提升系统性能

文章目录 引言什么时候适合加缓存?示例1示例2:示例3: 缓存应该怎么配置?数据分布**缓存容量大小:**数据淘汰策略 缓存的副作用总结 引言 在上一篇文章IO密集型服务提升性能的三种方法中,我们提到了三种优化…

Kafka-Kafka基本原理与集群快速搭建

一、Kafka介绍 ​ ChatGPT对于Apache Kafka的介绍: Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发并于2011年开源。它主要用于解决大规模数据的实时流式处理和数据管道问题。 Kafka是一个分布式的发布-订阅消息系统,可以快速地处理…

【基础篇】一,认识STM32

一,什么是STM32? STM32是一款由意法半导体公司开发的32位微控制器;其中ST指意法半导体;M指MCU或MPU,32指32 位。 STM32覆盖了Cortex-M的多种系列,包括M0、M0、M3、M7等。在分类上,STM32有很多…

MyBatisPlus基础入门笔记

MyBatisPlus基础入门笔记,源码可见下载链接 大家阅读时可善用目录功能,可以提高大家的阅读效率 下载地址:MyBatisPlus源码笔记 初识MyBatisPlus 入门案例 SpringBoot整合MyBatis(复习) 创建SpringBoot工程勾选使用的…

56.windows docker 安装ES、Go操作ES(github.com/olivere/elastic/v7库)

文章目录 一、环境准备1、 docker安装ES2、启动容器3、图像化客户端工具ElasticSearch-Head 二、Go ES连接与认证1、 连接ES2、配置ES认证 三、索引的增删改查四、文档的增删改创建单个文档根据文档id删除文档批量删除文档批量创建文档 五、文档查询列表查询精确匹配模糊匹配嵌…

五、Microsoft群集服务(MSCS)环境的搭建

一、【目的】 学会利用Windows Server布置群集环境。 二、【设备】 FreeNAS11.2,Windows Server 2019 三、【要求】 学会利用Windows Server布置群集环境,掌握处理问题的能力。 配置表: 节点公网IP(public)内网IP(private)群集IP(clust…

linux磁盘空间清理

查看磁盘使用情况 查看磁盘分区上可以使用的磁盘空间 $ df -h若要查看文件类型和block,使用下面的命令 $ df -T查看每个文件和目录的磁盘使用空间,也就是文件的大小。 $ sudo du -sh /* $ sudo du -h --max-depth1 /清理旧的 Snap 包版本以释放磁盘空…

华为OD试题六(数据最节约的备份方法、TLV解码)

1. 数据最节约的备份方法 题目描述: 有若干个文件,使用刻录光盘的方式进行备份,假设每张光盘的容量是500MB,求 使用光盘最少的文件分布方式 所有文件的大小都是整数的MB,且不超过500MB;文件不能分割、分卷…

centos-LAMP搭建与配置(论坛网站)

文章目录 LAMP简介搭建LAMP环境安装apache(httpd)安装mysql安装PHP安装php-mysql安装phpwind LAMP简介 LAMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写:Linux操作系统,网页服务器Apache,…

【知识分享】Java实现排序的方法及代码实现

Java实现排序的基础方法有很多,下面介绍几种比较常见的排序算法及其代码实现。 1.冒泡排序 冒泡排序是一种基础的排序算法,其思想是依次比较相邻的两个元素,如果顺序不对则交换它们的位置,直到整个数组都排好序为止。 代码实现…