`
Goldice
  • 浏览: 107721 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Travis CI : 最小的分布式系统(二)

 
阅读更多


大约1年之前,我们发现当时的架构有些不合理了。尤其是Hub,它上面承担了太多的任务。Hub要接收新的处理请求,处理并推动构建日志,它要同步用户信息到Github,它要通知用户构建是否成功。它跟一大群外部API打交道,全部都是在一个进程中处理。

Hub需要继续演化,但它却不太可能自由扩展。Hub只能以单进程的方式运行,也因此成为我们最有可能发生的单点错误。

Github API是一个有趣的例子。我们是Github API的重度用户,依靠这些API我们的构建任务才能执行。无论是获取构建配置信息,更新构建状态,还是同步用户数据,都离不开这些API。

回顾历史,当这些API中的某一个不可用,hub就会停止当天正在处理的任务,而转移到下一个任务上。所以,当Github API不可用时,我们的很多构建都会失败。

我们对这些API赋予了很多信任,当然现在也一样,但是说到底,这些是我们不能掌控的资源。这些资源不是我们自己来维护,而是由另外的一个团队,在另外的网络系统中,有他们自身的弱点。

我们过去没有这样想。过去我们总是把这些资源当做我们可以信赖的朋友,以为他们随时都会响应我们的请求。

我们错了。

一年之前,这些API无声无息的对某个功能做了修改。这个一个虽然没有文档说明,但是我们非常依赖的功能。这个功能就是这么消无声息的被修改了,于是导致了我们这边的问题。

结果,我们的系统完全乱套了。原因很简单,我们把Github API当做了自己的朋友,我们耐心的等待这些API回应我们的请求。每一次新的提交,我们都等了很长的时间,每次都有几分钟。

我们的超时设置太宽松了。因为这个原因,当对Github API的请求最终超时时,我们的系统也已经发生错误。那天晚上我们花了很长的时间处理这个问题。

即便是小问题,当某个时刻凑到一块了,也能够破坏一个系统。

我们开始隔离这些API请求,设置更短的超时时间。为了保证我们不会因为Github方面的中断而导致构建失败,我们同样加了重试机制。为了保证我们能够更好的处理外部的异常,我们的每一次重试都会依次延长过期时间。

你应该接受那些在你控制之外的外部API随时可能失败的现实。如果你不能将这些失败完全隔离,你就有必要考虑如果去处理他们。

如何去处理每一个单点错误场景是基于商业上的考虑。我们可以承受一个构建出异常吗?当然,这不是世界末日。如果因为外部系统的问题,我们能够让数百个构建出现异常嘛?我们不能,因为无论什么原因,这些构建异常够影响到了我们的客户。

Travis CI最初是一个好心的家伙。它总是很乐观地认为每一件事情总会正确的工作。

很不幸,那不是事实。每一件事在任何时刻都可能导致混乱,但是我们的代码却从来没考虑过这一点。我们做过很多努力,现在我们仍然在努力,去改变这种情况,去提高我们的代码处理外部API或者系统内部异常的能力。

回到我们的系统,hub承担的任务很容易导致异常,所以我们将其分割成很多的小应用。每个小应用都有其自身的目的和承担的任务。

做好任务隔离,这样我们就能更轻松的扩展系统。大部分任务都是直接的从上到下运行的。

现在我们有了三个进程;处理新的提交,处理构建通知,和处理构建日志。

突然之间,我们有了新的问题。

虽然我们的应用已经分割开了,但是他们都依赖一个叫做travis-core的核心。核心包括数量很多的Travis CI所有部分的商业逻辑。这可真是一个big ball of mud

对核心的依赖意味着核心代码的改动可能影响到所有应用。我们的应用是按照各自的任务进行划分,但是我们的代码不是。

我们现在还在为最早的架构设计而支付学费。如果你增加功能,或是修改代码,对公用部分的一点点改变都可能带来问题。

为了保证所有应用的代码都可以正常工作,当travis-core做了修改,我们需要部署所有应用去验证。

任务并不仅仅意味着你必须从代码的角度将其分隔。任务本身也同样需要物理分隔。

复杂的依赖影响了部署,同样,它也影响了你交付新代码、新功能的能力。

我们慢慢的将代码的依赖变小,真正的从代码隔离开每个应用间的任务。幸运的是,代码本身已经有很好的隔离程度了,所以这个过程显得容易多了。

有一个应用需要特别关注,因为它是我们做扩展最大的挑战。

 

 

 

  • 大小: 38.5 KB
  • 大小: 23.8 KB
  • 大小: 52 KB
  • 大小: 35.2 KB
分享到:
评论

相关推荐

    凤凰架构:构建可靠的大型分布式系统.pdf

    在线阅读可以通过提供的网址进行,文档被部署在GitHub Pages上,并利用Travis-CI进行持续集成和CDN加速。离线阅读则需通过克隆文档源码、安装依赖后进行编译。文档的PDF导出功能支持自动生成PDF文件,而技术演示工程...

    BarSocial-SD:UFLA分布式系统最终工作的原型

    8. **持续集成/持续部署(CI/CD)**:项目可能使用Jenkins、Travis CI或GitHub Actions等工具实现自动化构建和部署,以保证代码质量和快速迭代。 9. **安全性**:对于用户隐私和数据安全,系统可能实施了身份验证、...

    Integracao:集成GitHub com Travis Ci

    【集成GitHub与Travis CI:实现持续集成的Python项目流程】 在现代软件开发中,持续集成(Continuous Integration,CI)是一种重要的实践,它允许开发者频繁地将代码更改合并到主分支,同时通过自动化构建和测试...

    TeamAmerica:流星分布式黑客马拉松2015

    10. **持续集成/持续部署(CI/CD)**:可能使用GitLab CI/CD、Travis CI或Jenkins实现自动化测试和部署,保证代码质量和项目流程的顺畅。 总的来说,"TeamAmerica"在"流星分布式黑客马拉松2015"中很可能展示了他们对...

    agile-parent:Agile 分布式微服务架构综合脚手架

    7. **持续集成/持续部署(CI/CD)**:为了保证快速迭代和高质量交付,项目可能集成了Jenkins、GitLab CI/CD或Travis CI等工具,实现代码提交自动触发构建和测试,确保每次变更都可靠。 8. **监控与日志**:为了监控...

    CI规范的管理制度(CI系列)

    7. **集成服务器**:配置如Jenkins、Travis CI或GitHub Actions等集成服务器,自动化执行构建、测试和部署任务。 8. **持续反馈**:快速反馈机制对于CI至关重要。一旦构建失败,所有相关人员应立即收到通知,以便...

    Api-Auditoria:在分布式软件体系结构一文中开发的项目。 它是模拟审核的Api

    此外,使用持续集成工具(如Jenkins、Travis CI)可以自动化测试和部署流程。 总结来说,Api-Auditoria项目是一个在分布式系统中实现API审计的工具,采用C#编程语言,涵盖了API设计、安全、监控、日志等多个方面,...

    vagrant-travisci:示例项目,显示如何使用VirtualBox在TravisCI上运行Vagrant

    Travis CI 是一款云托管的持续集成服务,广泛应用于GitHub等版本控制系统。它监听仓库的代码提交,当有新的代码推送到仓库时,Travis CI会自动拉取代码、构建项目、运行测试,并将结果报告给开发者。这对于团队协作...

    UC_Sistemas:资料库,目的是介绍在UC-分布式系统中进行的活动

    10. **持续集成/持续部署(CI/CD)**:在JavaScript项目中,Jenkins、Travis CI或GitLab CI/CD可以自动化构建、测试和部署流程,这对于保证分布式系统在多环境中的一致性非常有帮助。 通过深入研究这个UC_Sistemas...

    yun:分布式云盘项目

    同时,采用CI/CD工具(如Jenkins、GitLab CI/CD或Travis CI)自动化构建、测试和部署过程,确保代码质量和快速迭代。 总之,【yun: 分布式云盘项目】是一个涵盖了分布式系统设计、文件存储、数据安全、并发控制、...

    大型分布式网站架构设计与实践.带目录书签.完整版

    10. **持续集成与持续部署(CI/CD)**:Jenkins、GitLab CI/CD和Travis CI等工具帮助实现自动化测试、构建和部署,以确保快速迭代和高质量的代码发布。 通过《大型分布式网站架构设计与实践》这本书,读者可以全面...

    pluto-server:分布式游戏服务器使用c ++和python

    - **持续集成**: 如Jenkins或Travis CI,自动化测试和部署流程。 - **日志系统**: 如`log4cpp`或`logging`,用于收集和分析运行时信息。 ### 8. 性能优化 - **负载均衡**: 分布式系统中的节点可以动态调整负载,...

    PyPI 官网下载 | travis-cargo-0.1.7.tar.gz

    结合以上信息,我们可以推测`travis-cargo`可能是一个用于集成Travis CI(一个持续集成/持续部署服务)和Apache ZooKeeper的Python库,它可能帮助开发者在云环境中更便捷地管理和协调分布式系统。使用这个库,开发...

    测试归档集合.zip

    - Travis CI:云基础的CI服务,常用于GitHub项目。 5. **静态代码分析工具**: - SonarQube:用于代码质量管理,发现潜在的代码问题和漏洞。 - ESLint:JavaScript代码风格和错误检查工具。 6. **测试文档和...

    AWS-app-web:AWS应用nodejs,结合travis,显示来自S3的文件并上传文件到S3,添加数据到SQS队列和simpleDB

    SQS 是 AWS 的一个无服务器、完全托管的消息队列服务,用于解耦和扩展分布式系统。在这个应用中,当用户触发某些操作时,比如文件上传,数据会作为消息被添加到 SQS 队列。这样,后台处理程序可以从队列中取出这些...

    微服务

    5. **持续集成/持续部署(CI/CD)**:Jenkins、GitLab CI/CD或Travis CI等工具帮助自动化构建、测试和发布流程,确保快速、可靠地迭代服务。 6. **通信协议**:RESTful API是最常见的服务间通信方式,基于HTTP/HTTPS...

    baobaodistsys

    11. **持续集成/持续部署(CI/CD)**:"baobaodistsys"可能利用Jenkins、GitLab CI/CD或Travis CI等工具实现自动化构建和部署流程,以提高开发效率。 12. **微服务架构**:如果"baobaodistsys"是一个大型项目,它...

    mqant是一款基于Golang语言的简洁,高效,高性能的分布式微服务框架-mqant.zip

    8. **版本控制与持续集成**:mqant-master这个文件名可能暗示了项目采用Git进行版本控制,并且可能支持与常见的持续集成工具(如Jenkins、Travis CI等)集成,实现自动化测试和部署。 9. **扩展性**:mqant作为一个...

    RCMP.zip_remote

    4. **自动化工具**:为了简化远程编译流程,可以使用自动化工具,如Jenkins、Travis CI或GitHub Actions。这些工具可以自动触发编译,执行测试,并在完成时通知开发者。 5. **性能优化**:远程编译的优势在于可以...

    基于Python分布式爬虫打造搜索引擎源码.zip

    10. **测试与持续集成**:确保代码质量和稳定性,项目可能包含单元测试、集成测试,甚至使用Jenkins或Travis CI等工具实现持续集成,自动化构建和测试过程。 以上就是基于Python分布式爬虫打造搜索引擎涉及的主要...

Global site tag (gtag.js) - Google Analytics