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

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

查看当前字符编码&#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日国足对战泰国的比赛中&#…

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 将当前目录下&#xff08;包括子目录&#xff09;的文件名中含有xyz的文件过滤出来 find . | xargs grep xyz 将当前目录下&#xff08;包括子目录&#xff09;的文件内容中含有xyz的行过滤出来 转载于:https://www.cnblogs.com/anovana/p/8036032.html

Grape Api 笔记

关键字&#xff1a;namespace aliases&#xff1a;group&#xff0c;resources&#xff0c;resources&#xff0c;segment define route parameter: 1. namespace :id 2. param_route :id 关键字before 每次api请求前均执行一次 关键字helpers 1. 定义module&#xff0c;通过…

第一个spring boot应用

前提 首先要确保已经安装了java和maven&#xff1a; $ 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…