当前位置: 首页 > 编程日记 > 正文

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

(本文翻译自http://www.paperplanes.de/2013/10/18/the-smallest-distributed-system.html,由@金斌_jinbin 翻译)

Travis CI一开始仅仅是个想法,在当时甚至还有些理想化。在这个项目启动之前,开源社区还没有一个可用的持续集成系统。

随着作为开源协作平台的Github越来越被人认可,Github也非常需要可以持续对贡献代码进行测试的服务,来保证一个开源项目始终处于稳定健康的状态。

Travis CI开始于2011年初,而且很快得到了一些试用客户。到了2011年夏天,我们每天进行700次构建。所有这些构建都是在一台构建服务器上进行的。Travis CI跟Github完美集成,目前Github还是Travis CI的主要平台。

Travis CI在持续集成领域并没有惊天动地的大动作,但它的确重新定义了一些原有的概念,并增加了一些新的想法。其中一个就是你可以在你的测试运行过程中,接近实时的看这个项目的构建日志流。

最重要的一点,Travis CI允许你通过源码里的文件(.travis.yml)来对构建过程进行配置,而不是复杂的用户界面。


Travis CI一开始的架构很简单。通过Web组件可以让项目和它的构建过程可见,同时,只要一个新的commit提交到了项目,Travis CI就可以接收到来自Github的消息,从而触发构建。

另外一个叫做hub的组件,是负责处理新的提交,将他们转化成一次构建,并且处理构建任务运行和结束时产生的结果数据。

这两个组件都是跟PostgreSQL数据库打交道。

第三部分就是用来控制构建任务本身的线程集合,它们可以用来在虚拟机实例上执行一系列的命令。

本质上,hub会显得比其他部分稍微复杂一些。当hub处理构建日志时,它需要与RabbitMQ进行消息传递。日志会以chunks流的形式从控制构建任务的线程中得到。

Hub更新数据库中的日志和构建结果信息,并且hub推送他们到Pusher。通过Pusher,Travis CI可以在构建开始或结束的时候更新用户界面。

这样的架构一直维持到了2012年,当时我们每天进行7000个构建任务。我们欣喜的看到Travis CI在开源社区越来越广泛的使用,并且开始支持11种语言,包括PHP,Python,Perl,Java 和 Erlang。

随着越来越多的使用,Travis CI越来越像是一个开源项目的必备服务了。但是不幸的是,这个系统从一开始构建的时候就没有考虑过监控。


过去,总是来自社区的用户通知我们系统没有正常运行,构建任务遇到异常,或是任务信息没有被处理好。

那可真是令人尴尬。我们的第一个挑战就是给系统增加监控,数据指标和日志,让Travis CI从一个业务爱好的项目转变为一个重要的商业平台。我们准备发布Travis CI的正式生产版本。

被用户告知系统没有正常运行直到今天仍然是我最大的噩梦,我们不得不努力工作建设好数据监控,以使系统能够在出现问题的一开始就及时通知。

如果没有任何数据记录或者良好的日志,我们根本不可能去搞清我们这个小分布式系统到底发生了什么。无论是从哪个方面看,Travis CI都已经是一个分布式系统了。

加入监控指标和日志是一次循序渐进的学习过程,但是最终,它们让我们可以了解这个系统正在做什么,无论是通过图表还是日志。

这对我们而言是一个巨大的提升。可见性对于运行一个分布式系统是非常重要的。

当你写一个系统时,考虑好如何监控它。

做好监控会有助于你的系统更好的在生产环境运行,而不仅仅是通过测试。

关键是,更多的监控不仅仅是让你可以对系统更了解,你也会发现那些你以前未曾想到或见到的问题。系统更高的可见性带来更多的责任感。现在我们需要去面对这样的事实:我们对系统的错误有了更多的了解,所以我们必须更有效的工作来减少这些错误所带来的影响。

相关文章:

Windows 7时代即将终结!

作者 | 屠敏 转载自CSDN(ID:CSDNnews) 2009 年诞生的 Windows 7 终究没能超过 Windows XP 13 岁的寿命。 2015 年 1 月 14 日,微软宣布结束对 Windows 7 操作系统的第一阶梯主流支持,同时为了给用户过渡升级的时间,…

什么是DWDM

DWDM是Dense Wavelength Division Multiplexing(密集波分复用)的缩写,这是一项用来在现有的光纤骨干网上提高带宽的激光技术。更确切地说,该技术是在一根指定的光纤中,多路复用单个光纤载波的紧密光谱间距,…

MySQL · myrocks · MyRocks之memtable切换与刷盘

概述 MyRocks的memtable默认是skiplist,其大小和个数分别由参数write_buffer_size和max_write_buffer_number控制。数据写入时先写入active memtable, 当active memtable写满时,active memtable会转化为immutable memtable. immutable memtable数据是不会…

URLRewriter在ASP.NET配置文件中的用法

<?xml version"1.0"?><configuration><configSections><sectionGroup name"system.web.extensions" type"System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version1.0.61025.0, Culturene…

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

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

百度开设「黄埔学院」,革新者来

1 月 19 日&#xff0c;百度宣布成立「黄埔学院」&#xff0c;开展深度学习架构师培养计划。并借鉴了黄埔军校大门对联的横批「革命者来」&#xff0c;将口号设置为「革新者来」。 首先&#xff0c;为什么叫「黄埔学院」&#xff1f; 2012 年初&#xff0c;百度开始进行深度学…

Linux-find命令应用举例-按时间筛选和删除文件

find参数说明&#xff1a; find有很多参数是以动作首字母时间的方式用于按访问、改变、更新时间来筛选文件。 动作表达&#xff1a; a(last accessed) 最近一次访问时间 c(last changed) 最近一次改变时间 m(last modified) 最近一次修改时间注意此上的c和m的区别&#xff0c;…

2007年11月网络工程师考试试题

● 若某计算机系统由两个部件串联构成&#xff0c;其中一个部件的失效率为710&#xff0d;6/小时。若不考虑其他因素的影响&#xff0c;并要求计算机系统的平均故障间隔时间为105小时&#xff0c;则另一个部件的失效率应为 &#xff08;1&#xff09; /小时。 &#xff08;1&am…

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

日志的作用有两个&#xff1a;当构建日志的数据块通过消息队列进来时&#xff0c;更新数据库对应行&#xff0c;然后推送它到Pusher用于实时的用户界面更新。 日志块以流的形式在同一个时间从不同的进程中进来&#xff0c;然后被一个进程处理。这个进程每秒最高可处理100个消息…

windows 上rsync客户端使用方法

阅读目录 1.1 获取 windows上实现rsync的软件&#xff08;cwRsync&#xff09;1.2 cwrsync的使用方法1.3 cwrsync的使用回到顶部1.1 获取 windows上实现rsync的软件&#xff08;cwRsync&#xff09; cwRsync是Windows 客户端GUI的一个包含Rsync的包装。您可以使用cwRsync快速远…

机器学习开源项目Top10

整理 | Jane 出品 | AI科技大本营 【导语】又到了我们固定给大家推荐开源项目的时间。本期将为大家推荐 10 个机器学习开源项目&#xff0c;统计了过去一个月中 250 个机器学习开源项目&#xff0c;并从中选取了本期的 Top10。平均 1483 Stars。不知道是不是有你喜欢的欢迎大…

大规模服务设计部署经验谈

本文中提出的最佳实践&#xff0c;来自于作者多年大规模服务设计和部署的经验&#xff0c;为设计、开发对运营友好的服务提供了一系列良好的解决方案。■ 文&#xff0f;James Hamilton 译&#xff0f;赖翥翔1 引言 本文就设计和开发运营友好的服务的话题进行总结…

修改mysql数据库默认编码为utf8

查看当前字符编码&#xff1a; mysql < show variables like character%;为了解决中文乱码问题&#xff0c;修改mysql默认数据库编码为utf8&#xff0c;修改/etc/my.cnf [client]default-character-setutf8[mysql]default-character-setutf8[mysqld]character-set-serverutf…

CSDN创始人蒋涛:AI定义的开发者时代

1月18日&#xff0c;由中国软件行业协会主办的2019中国软件产业年会&#xff0c;在国家会议中心举行。CSDN创始人&董事长蒋涛&#xff0c;在大会上发表了题为《AI定义的开发者时代》的主题演讲。 以下为演讲实录&#xff1a; 我们在PC互联网时代就建立了中国软件开发者社区…

numpy.ndarray的赋值操作

matzeros((3,4)) #生成一个3行4列全部元素为0的矩阵mat[1,:]111 #从第1行第0列开始&#xff0c;一直到最后一列&#xff0c;赋值为1&#xff0c;效果与mat[1,0:3]相同&#xff0c;前置0可以省略&#xff0c;最后的列数可以省略输出&#xff1a;[[ 0. 0. 0. 0.][ 111. 111. 111.…

travis-ci如何配置android

travis-ci如何配置android travis-ci 关于android部分&#xff1a;http://docs.travis-ci.com/user/languages/android/ language: android android:components:- build-tools-19.1.0 # BuildTools version- android-19 # SDK version- sy…

你的微笑,拂过我的心海

??初冬的午后&#xff0c;阳光&#xff0c;懒懒地伸展着腰肢,企业形象宣传片 &#xff0c;偶然从窗帘漏进几缕稀少的斜影。南方的冬天总是姗姗来迟&#xff0c;让人认为&#xff0c;那只不过是秋天残存的脚步&#xff0c;还没来得及捉住&#xff0c;它却已从你的眉间静静地溜…

重读Youtube深度学习推荐系统论文,字字珠玑,惊为神文

作者简介&#xff0c;王喆&#xff0c;硅谷高级机器学习工程师。 本文转载自知乎专栏 https://zhuanlan.zhihu.com/p/52169807 这里是王喆的机器学习笔记&#xff0c;每隔一到两周我会站在算法工程师的角度讲解一些计算广告、推荐系统相关的文章。选择文章必须满足一下三个条件…

Struts的select两种遍历方法

转载于:https://blog.51cto.com/9695005/2050390

nginx http 服务器搭建

下载nginx源码&#xff1a;http://nginx.org/en/download.html 安装&#xff1a; wget http://nginx.org/download/nginx-1.9.3.tar.gz cd nginx-1.9.3 ./configure --prefix/usr/local/nginx发现一个问题&#xff1a; checking for PCRE library ... not found checking for P…

加速电子化报销费控服务,易快报完成1500万美元B轮融资

2019年1月21日&#xff0c;报销费控领头羊品牌——易快报对外宣布完成1500万美元B轮系列融资&#xff0c;本轮融资由美元基金曼图资本领投&#xff0c;DCM、明势、银杏谷等投资机构跟投&#xff0c;冲盈资本为本轮独家财务顾问。国内报销费控SaaS行业是个潜力巨大的增量市场&am…

[转]C# 2.0新特性与C# 3.5新特性

C# 2.0新特性与C# 3.5新特性 一、C# 2.0 新特性&#xff1a; 1、泛型List<MyObject> obj_listnew List();obj_list.Add(new MyObject()); 2、部分类(partial)namespace xxx{public partial class Class1{private string _s1;public string S1{get { return _s1; }set { _…

你需要了解的load和initialize

NSObject类有两种初始化方式load和initialize load (void)load; 复制代码对于加入运行期系统的类及分类&#xff0c;必定会调用此方法&#xff0c;且仅调用一次。 iOS会在应用程序启动的时候调用load方法&#xff0c;在main函数之前调用 执行子类的load方法前&#xff0c;会…

iOS11、iPhone X、Xcode9 适配指南

2017.09.23 不断完善中。。。 2017.10.02 新增 iPhone X 适配官方中文文档 更新iOS11后&#xff0c;发现有些地方需要做适配&#xff0c;整理后按照优先级分为以下三类&#xff1a; 单纯升级iOS11后造成的变化&#xff1b;Xcode9 打包后造成的变化&#xff1b;iPhoneX的适配一、…

Grape和Sinatra结合使用

Grape && Sinatra Grape(https://github.com/intridea/grape) is a REST-like API micro-framework for Ruby Sinatra(http://www.sinatrarb.com/intro.html) is a DSL for quickly creating web applications in Ruby 可见&#xff0c;Grape适合构建纯Api系统&#xf…

公告三大“罪状”,无人驾驶公司Roadstar联合创始人被罢免

&#xff08;从左至右依次是为周光、佟显乔、衡量&#xff09; 整理 | Jane 出品 | AI科技大本营 1 月 21 日&#xff0c;因技术造假等违规行为&#xff0c;国内自动驾驶创业公司 Roadstar &#xff08;深圳星行科技有限公司&#xff09;官方宣布&#xff0c;罢免联合创始人周…

大雁悲歌,月哭泣

??时间&#xff0c;毫无感情的把这段故事剪成了碎片……??――题记????一??眺望天边那抹残红&#xff0c;心瞬间间抖落成一滴血。??无法愈合的伤口&#xff0c;夜夜繁衍着孤寂。爱,颈椎痛 &#xff0c;这个烂熟于胸的字&#xff0c;有时真是扎心般刺眼&#xff0c;…

写高质量的代码,永不言晚!

作者 | Nitesh sharma 译者 | 弯月责编 | 郭芮出转载自 CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 以下为译文&#xff1a; 在如今这个时代&#xff0c;每个人都在努力提升资源能力。在Web应用程序方面&#xff0c;我们有Spring、Play和Struts等框架&#xff0c;这…

ios searchBar 的代理方法 集合

下面是搜索框控件的一些代理方法&#xff1a; - (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar;将要开始编辑时的回调&#xff0c;返回为NO&#xff0c;则不能编辑- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar;已经开始编辑时的回调- (BOOL)…

双绞线接法详解

一直以来很多人&#xff08;包括作者&#xff09;都认为10 base-t 10m网络使用了网线中8条信号线之4条&#xff0c;而100 base-t 100m则使用了全部8条信号线&#xff08;要不怎么那么快呢&#xff1f;&#xff09;。可是作者前不久在使用一条按所谓10m直连接法&#xff08;1与3…