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

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

 
阅读更多

日志的作用有两个:当构建日志的数据块通过消息队列进来时,更新数据库对应行,然后推送它到Pusher用于实时的用户界面更新。

日志块以流的形式在同一个时间从不同的进程中进来,然后被一个进程处理。这个进程每秒最高可处理100个消息。

一般情况下这样处理日志流的方式也相当OK,但是这也意味着我们很难处理某些时刻突然增长的日志消息,因此这个唯一的进程对于我们系统的扩展会成为一个很大的障碍。

问题在于,进程是按照这些消息到达消息队列的先后顺序来进行处理的,而Travis CI中的所有事情都依赖于这些消息。

更新数据库里的一条日志流意味更新包含所有日志的一行数据。更新用户界面的日志当然意味着在DOM树上附加一个新的结点。

为了解决这个棘手的问题,我们需要改很多代码。

但是首先,我们需要理清楚什么才是一个更好的解决方案,好的解决方案应该是能够让我们很方便的扩展日志处理的部分。

我们决定让处理的顺序作为消息本身的一个属性,而不是隐含的依赖于它们被放进消息队列的顺序。

这个想法是受到Leslie Lamport于1978年发表的一篇论文《Time, Clocks, and the Ordering of Events in a Distributed System》的启发。

在这篇论文中,Lamport描述了在分布式系统中,使用递增计数器来保留事件发生的顺序的方法。当一个消息被发送,发送者会在消息被接收者接收到之前增加计数器的值。

我们可以简化那个想法,因为在我们的场景中一个日志块只能来自一个发送者。进程只要不断增加计数器的值,就可以让之后的日志收集工作变得简单。

剩下的工作就是根据计数器的值来对日志块进行排列了。

困难之处在于,这样设计之后等同于允许向数据库写入小的日志块,这些小日志块只有在对应任务结束后才会写入到完整的日志中。

但是这会直接影响到用户界面。我们不得不面对消息以无序的方式到来。这个变化的确影响的范围大了些,但它反过来简化了很多部分的代码。

从表面看,这个改动似乎无关紧要。但是依赖于你本不需要依赖的顺序会带来更多潜在的复杂性。

我们现在不用依赖于信息是如何传送的,因为现在我们可以在任何时间得到他们的顺序。

我们修改了不少代码,因为那些代码做了一个假设,任何信息都是顺序过来的,而这个假设是完全错误的。在分布式系统中,事件可以以任何顺序在任何时间到达。我们只需要确保之后我们可以将这些片段重新组装回去。

你可以从我们的博客获取这个问题更详细的说明。

到了2013年,我们每天已经在运行45000次构建。我们还是在为早先的设计付出着代价,但是我们也在慢慢的改进设计。

我们现在还有一个麻烦。系统所有的组件还是在共享同一个数据库。如果数据库出现问题,自然的所有组件都会出现问题。这个故障上周我们刚刚遇见一次。

这同样意味着日志写入的数量(目前可以达到每秒300次)影响到了我们API的性能,当用户浏览我们的用户界面时可能会慢一点。

另外,当我们从构建任务的数量上考虑时,我们的下一个挑战就是如何去扩展我们的数据容量。

Travis CI在500台构建服务器上运行,这已经不能再算是一个小的分布式系统了。我们现在正着手解决的问题还是从一个相当小的维度来考虑的,但即便在那个维度上,你也能够遇到很多有趣的挑战。根据我们的经验,简单直接的解决方案总是比那些更复杂的要好。

 

 

 

  • 大小: 29.1 KB
  • 大小: 34.7 KB
  • 大小: 20.7 KB
  • 大小: 31 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

    "vagrant-travisci" 项目结合了这三者,旨在演示如何在Travis CI上配置和运行Vagrant。在Travis CI的`.travis.yml`配置文件中,你需要指定使用VirtualBox作为虚拟化平台,并设置Vagrant的相关操作,如初始化、...

    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 队列。这样,后台处理程序可以从队列中取出这些...

    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作为一个...

    微服务

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

    RCMP.zip_remote

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

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

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

Global site tag (gtag.js) - Google Analytics