网站开发研究热点,深圳昨天下午出大事,湖北交投建设集团网站,五合一网站建设阿里妹导读#xff1a;上个月#xff0c;PHP开发者在网上纷纷反映出现 Composer 镜像无法访问的问题。阿里云内部一位 90 后工程师顾咏连夜开工排查#xff0c;快速解决问题后#xff0c;他在问题群里收到了一大波来自用户的红包。顾咏最后谢绝了红包#xff0c;接受了阿里… 阿里妹导读上个月PHP开发者在网上纷纷反映出现 Composer 镜像无法访问的问题。阿里云内部一位 90 后工程师顾咏连夜开工排查快速解决问题后他在问题群里收到了一大波来自用户的红包。顾咏最后谢绝了红包接受了阿里技术的邀请来聊一聊这次事件问题背后的技术。 一则消息
前段时间因为国际网络不稳定问题国内各大Composer镜像都出现了间歇性无法访问情况这对国内PHPer的生产工作造成了极大的影响。受此影响国内各家Composer服务都出现了相同的问题而阿里工程师的这个解决方案堪称“简单粗暴”效率高到没朋友
阿里云的 PHP Composer 最初研发灵感源自阿里内部一位 90 后工程师顾咏。作为负责开发阿里云产品的 PHP SDK的工程师他在工作中经常遇到同一个问题尽管已经根据PHP 最新版本发布了新的 SDK但由于镜像工具没有实时同步版本导致用户安装不成功。 此外云效平台企业开发者对镜像工具的使用体验同样受到这个问题的困扰为此阿里技术团队一起设计开发并开源了这套阿里云版镜像工具。
此次国际网络不稳定导致的镜像问题阿里工程师顾咏第一时间响应了PHPer的诉求连夜排查问题。 “我们程序员都离不开这个越早解决越好”最后终于成功定位问题、完成系统更新解决了大家的燃眉之急。群里的开发者主动发红包向其致谢顾咏十分感动然后拒绝了他“应该做的红包不能收。” 对于PHP 开发者来说Composer 是必不可少的依赖包管理工具作为存储 Composer 依赖包的 Packagist却时常因为网络问题让国内开发者头痛不已国内开发者安装依赖通常很慢或者超时导致无法安装却又没有稳定的镜像服务可以使用。Packagist 鼓励开发者建立镜像但目前的镜像也有诸多不稳定、不可靠的情况。
阿里云Composer 镜像的推出
今年七月阿里云提供了 Packagist/Composer 全量镜像服务其秒级同步的能力、快速稳定的下载服务、页面上的动态数据展示得到了开发者的一致好评。 阿里云Composer 镜像的升级
11月16日开始由于 Composer 镜像出现了间歇性无法访问情况不少网友通过阿里云钉钉服务群反应阿里云镜像出现不可用的情况主要 zlib_decode 和 404 错误。在测试其他镜像作对比时发现其他镜像也存在此类情况。接到反馈后我们第一时间进行问题排查
问题定位阿里工程师立即查看系统状态和日志未发现异常。初步怀疑是由于 CDN 接入层收国际网络延迟导致不可用。
验证阿里工程师笔将相同的数据回传至国内 Bucket 在今经多次、多地域直接访问测试均成功。
决心升级以往偶尔遇到这种问题都被当做正常现象对待而此次持续时间较长影响面广为了彻底解决这类问题阿里决定升级镜像系统部署方案直接将最新数据传回国内。
已知现有 Packagist 镜像的问题
1同步的数据不是 Packagist 的根数据。事实上官方的根数据不对外公开开发者平时所访问的数据是镜像甚至是镜像的镜像。当客户端发起请求后请求会被官方 DNS 指向其他的镜像站这些镜像数据与根数据之间已经存在延迟。而由于国际网络或系统设计原因曾经出现初次官方镜像站与根数据长达数小时不同步 的情况。
2没有处理代码包 dist。大多数依赖包的源代码存储在在github、gitlab上因为网络问题也会导致使用者下载速度慢甚至下载失败。这也是镜像站需要关注处理的一般镜像只提供 meta 数据包数据。例如官方推荐的 Webysthers mirror code 镜像同步系统就不处理dist。
3本地文件存储。目前已知的其他镜像系统是将文件存储在本地或至少先存储在本地再上传这样不仅会消耗大量本地磁盘空间还存在系统最大子目录限制会使得系统存在致命瓶颈。优化版本使用的软连接方案也会随着包的无限增长需要重构。
4单进程性能表现不佳消耗 CPU、内存资源大。且处理数据耗时长更新速度慢系统的设计导致任务不能分发且同步时间间隔越长同步的时间越常。
5没有数据错误统计官方源数据存在错误也需要直观的展示让开发者了解情况。
6系统同步状态、数据不可视化镜像是否已更新什么时候更新今天更新了多少下一次什么时候更新这些数据开发者都不知道。
阿里云镜像的优势
阿里云镜像的架构核心目标是实时、快读、稳定、可移植、可扩展且具备对数据进行自我修复的能力。那么阿里云镜像和其他镜像有什么区别阿里云镜像又是如何做到秒级同步的呢
官方合作
在数据上阿里云与 Packagist 官方合作经过和 Packagist 沟通阿里云在距离官方根数据最近的城市节点部署了服务器同时阿里云的服务器 IP地址 被加入 Packagist 白名单允许直接、频繁地访问其根数据Meta。获取和解析 Meta 后系统从代码仓库中下载源代码压缩包再通过阿里云洛神网络不限带宽的将数据传回国内这从最大程度上保证了国内用户可以及时、快速地获取最新数据。开发者使用 Composer 安装依赖的数据都是镜像甚至是镜像的镜像。例如官方在新加坡的镜像就数次出现长达数小时的不更新以此为镜像源的镜像站就无法为开发者提供正常的服务。
实时
阿里云实时同步源数据对于以下场景的用户具有十分重要的意义
1. 迫切需要更新补丁依赖包的使用者。当一个依赖包被发现有bug得到修复后使用者往往需要第一时间升级更新镜像同步的越及时、服务越稳定使用者的补丁修复的也就越早止损也就更及时。
2. 检查依赖包发布状态的包开发者来说。对于包的开发者在发布包后能尽快的检查发布状态通过安装命令验证其作品的可用性。
自主研发高性能系统
同步系统由阿里云自主研发采用 Golang 编写使用 Redis 做任务队列心跳协程将更新的数据文件分发到任务队列30个协程各自分工获取数据传回国内OSS。这意味着所要同步的数据不再是一个单进程按照顺序一个一个传输而是多个协程甚至是多台机上的多个协程一起分工这又将同步时间大幅度缩短。
只分发有效任务
在任务分发的机制上实现了任务不重复由于内存会记录已经成功处理过的任务和已分发的任务所以不会分发旧文件也不会发布相同的任务这避免无效、重复工作更是大幅度的减少了工作量降低延迟。
重试机制
对于数据获取错误的情况系统具有重试机制对于因为网络问题暂时访问错误的源数据、代码包系统会重试请求。
文件存储
阿里云 Composer 全量镜像依靠阿里云强大的 OSS 存储源数据和代码压缩包不占用本地磁盘在避免最大子目录的问题的同时还能轻松移植、扩展系统。
错误记录
记录和统计官方错误阿里云将官方记录当中的一些错误记录下来在方便内部随时排查问题的同时也能更准确的了解 Packagist 的情况。
自我修复
处理不成功的任务不会被记录在间隔时间极短的下一次同步中会得到修复。而执行错误的任务则会使用重试修复。
如果需要人工修复只需删除响应的 KEY系统即可重新执行并更新状态。
CDN 支撑
镜像数据对外接入了阿里云全国 CDN 节点阿里云强大的网络基础设施保证了开发者如丝般顺滑的使用体验。
状态数据可视化
镜像系统数据状态可视在阿里云 Composer 全量镜像的官方页面上动态显示 Packagist 最后更新时间阿里云同步耗时、下一次刷新 CDN 的时间系统同步的状态和数据让开发者“心中有数”。 免费全量镜像站开发者的福音
阿里做镜像站的历史最早可追溯至2011年从最开始阿里内部的需求扩展到为更广大的开发者免费投入资源提供更快、更稳定的镜像资源。从最初的几台设备成长为现在覆盖主流语言和主流操作系统的全量镜像站。并且在这个过程中一直坚持免费为开发者提供镜像资源不断追求更快、更稳定的服务。
目前阿里云镜像站不仅提供Centos、Ubuntu、 Fedora、Arch Linux、 Deepin 等10多个发行版的软件安装源和ISO下载服务, 还提供Python, Php 等多款开发语言的包管理镜像服务以及nvidia-cuda, homebrew, kubernetes等 10 多款垂直仓库的镜像服务。每月下载包文件数量已经超过 7 亿次。
国内镜像所做的是缓存所有安装包和元数据到自己的服务器并通过国内 CDN 进行加速实现 Composer require/install/update 的操作并达到最快速度。阿里云的 PHP Composer 全量镜像能够实现与 PHP Packagist 官方实时同步通过自研的镜像同步系统实现多协程分工同步、数据自我修复的能力在保证快速同步的同时也能快速修复因网络不稳定造成的数据错误。
最后欢迎在留言区说出你的使用体验。
原文链接 本文为阿里云原创内容未经允许不得转载。