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

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

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

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

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

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

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

Struts的select两种遍历方法
转载于:https://blog.51cto.com/9695005/2050390

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

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

[转]C# 2.0新特性与C# 3.5新特性
C# 2.0新特性与C# 3.5新特性 一、C# 2.0 新特性: 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; 复制代码对于加入运行期系统的类及分类,必定会调用此方法,且仅调用一次。 iOS会在应用程序启动的时候调用load方法,在main函数之前调用 执行子类的load方法前,会…

iOS11、iPhone X、Xcode9 适配指南
2017.09.23 不断完善中。。。 2017.10.02 新增 iPhone X 适配官方中文文档 更新iOS11后,发现有些地方需要做适配,整理后按照优先级分为以下三类: 单纯升级iOS11后造成的变化;Xcode9 打包后造成的变化;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 可见,Grape适合构建纯Api系统…

公告三大“罪状”,无人驾驶公司Roadstar联合创始人被罢免
(从左至右依次是为周光、佟显乔、衡量) 整理 | Jane 出品 | AI科技大本营 1 月 21 日,因技术造假等违规行为,国内自动驾驶创业公司 Roadstar (深圳星行科技有限公司)官方宣布,罢免联合创始人周…

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

写高质量的代码,永不言晚!
作者 | Nitesh sharma 译者 | 弯月责编 | 郭芮出转载自 CSDN(ID:CSDNnews) 以下为译文: 在如今这个时代,每个人都在努力提升资源能力。在Web应用程序方面,我们有Spring、Play和Struts等框架,这…

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

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

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

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

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

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

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

Mac下mysql服务器安装
Mac下mysql服务器安装 下载mysql 进入http://dev.mysql.com/downloads/mysql/ 下载Mac OS X 10.9 (x86, 64-bit), Compressed TAR Archive 安装 tar -zxvf mysql-5.6.25-osx10.9-x86_64.tar.gz mv mysql-5.6.25-osx10.9-x86_64 mysql cd mysql sudo scripts/mysql_install_db -…

linux查找文件
find . | grep xyz 将当前目录下(包括子目录)的文件名中含有xyz的文件过滤出来 find . | xargs grep xyz 将当前目录下(包括子目录)的文件内容中含有xyz的行过滤出来 转载于:https://www.cnblogs.com/anovana/p/8036032.html

Grape Api 笔记
关键字:namespace aliases:group,resources,resources,segment define route parameter: 1. namespace :id 2. param_route :id 关键字before 每次api请求前均执行一次 关键字helpers 1. 定义module,通过…

第一个spring boot应用
前提 首先要确保已经安装了java和maven: $ java -version java version "1.8.0_102" Java(TM) SE Runtime Environment (build 1.8.0_102-b14) Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode) $ mvn -v Apache Maven 3.3.9 (bb52d850…