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

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做了修改,我们需要部署所有应用去验证。

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

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

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

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

相关文章:

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

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

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

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

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

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

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

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

windows 上rsync客户端使用方法

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

机器学习开源项目Top10

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

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

本文中提出的最佳实践,来自于作者多年大规模服务设计和部署的经验,为设计、开发对运营友好的服务提供了一系列良好的解决方案。■ 文/James Hamilton 译/赖翥翔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…

step by step YAML 复用

yaml文件适合用来描述软件测试过程的步骤。当不同类型的CI过程集中在一个yaml文件时&#xff0c;首先碰到的一个问题是&#xff1a;大量重复的步骤如何进行复用&#xff1f; 举个例子&#xff1a; stage1:run_it:exec:- A- B- C- D1stage2:run_it:exec:- A- B- C- D2显然&#…

在winform中从外部拖动节点到树形结构(treeview和listview相互拖动)(一)

最近一个项目要用到从listview向treeview拖动item&#xff0c;达到从外部拖动图标成为树形结构的一部分&#xff0c;通过查阅资料总结了一些实现方式&#xff0c;分享给大家。这是winform中的例子。 在进行拖放操作之前&#xff0c;必须要对进行拖放操作的组件的"AllowDro…

node 模块化 require expores,简易实现原理。

为了更好的理解 Node.js 的 require 实现机制&#xff0c;我实现了一个简易的版本。我们node index.js的时候就是require(./index.js)&#xff0c;话不多说我们直接上代码&#xff1a; 目录index.jsa.jsb.jsc.jsindex.js use strictfunction $require(filepath) {const fs req…

100+Python编程题给你练~(附答案)

整理 | Just 出品 | Python大本营 春节马上就要到了&#xff0c;怎么能让自己在假期里不掉队&#xff1f;今天&#xff0c;营长给大家准备一个项目&#xff1a; 100 编程练习&#xff0c;这些题如果能坚持每天至少完成一道&#xff0c;一定可以帮大家轻松 get Python 的编程技…

为了一窥国足输韩国之后人们的评论,我爬了懂球帝App

【导语】2019亚洲杯决赛正如火如荼进行中&#xff0c;国足的晋级之路可谓用“惊现”二字评论。继1月16日&#xff0c;国足对战韩国队败北后&#xff0c;一名Python学习者为了一窥网友们的评论&#xff0c;特意爬了懂球帝App的数据。最新喜讯是在20日国足对战泰国的比赛中&#…