日志的作用有两个:当构建日志的数据块通过消息队列进来时,更新数据库对应行,然后推送它到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台构建服务器上运行,这已经不能再算是一个小的分布式系统了。我们现在正着手解决的问题还是从一个相当小的维度来考虑的,但即便在那个维度上,你也能够遇到很多有趣的挑战。根据我们的经验,简单直接的解决方案总是比那些更复杂的要好。

Travis CI : 最小的分布式系统(三)相关推荐

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

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

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

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

  3. 持续集成与持续部署(三)——实现持续集成的效率工具对比之Jenkins、Travis CI、Circle CI和其他持续集成工具

    持续集成与持续部署(三)--实现持续集成的效率工具对比之Jenkins.Travis CI.Circle CI和其他持续集成工具 效率工具对比 点击查看效率工具 1. Jenkins Jenkins, ...

  4. Vite(三)部署静态站点(wordpress与hugo与Vercel、CI/CD、Travis CI、GitLab CI)、环境变量与模式、服务端渲染(SSR)

    Vite(三)部署静态站点(wordpress与hugo与Vercel.CI/CD.Travis CI.GitLab CI).环境变量与模式.服务端渲染(SSR) 文章目录 Vite(三)部署静态站点 ...

  5. .NET Core+Selenium+Github+Travis CI =amp;gt; SiteHistory

    前言 总是三分钟热度的我折腾了一个可以每天自动截取指定网站页面并保存到Github的项目SiteHistory,感觉挺好(每次都这样 frameborder="0" scrolli ...

  6. 使用Travis CI自动部署Hexo博客

    自从使用GitHub Pages和Hexo来发布博客之后,不得不说方便了许多,只需要几个简单的命令博客就发布了.但在不断的使用中发现每次的发布操作也挺耗时的. 我一般的操作是将平时整理好的md文件放到 ...

  7. 持续集成商 Travis CI 爆严重漏洞,数千开源项目机密或被盗

     聚焦源代码安全,网罗国内外最新资讯! 专栏·供应链安全 数字化时代,软件无处不在.软件如同社会中的"虚拟人",已经成为支撑社会正常运转的最基本元素之一,软件的安全性问题也正在成为 ...

  8. gcr.io 国内源 —— 基于 Travis CI + GitHub + DockerHub + Google Cloud 实现自动定时同步 gcr.io 镜像到 DockerHub

    一.背景介绍 由于国内网络原因,gcr.io 仓库里的镜像是无法直接拉取到的,这给开发工作造成了极大的不便 本文介绍一种方法能够实现自动化地定期地将 gcr.io 仓库中的镜像同步到个人 Docker ...

  9. 持续集成服务 Travis CI 教程

    编写代码只是软件开发的一小部分,更多的时间往往花在构建(build)和测试(test). 为了提高软件开发的效率,构建和测试的自动化工具层出不穷.Travis CI 就是这类工具之中,市场份额最大的一 ...

最新文章

  1. C语言指针(就做个笔记)
  2. python如何次传参给线程_python如何给线程中的函数传参?
  3. 学习一段深有感悟的讲话
  4. ML之回归预测:利用多个算法模型(LassoR、KernelRidgeR、ElasticNetR、GBR、LGBMR、XGBR)对国内某平台上海2020年6月份房价数据集【12+1】进行回归预测
  5. 高级数据分析师凭什么月薪三万?一文解答你所有困惑
  6. linux中追踪函数backtrace调用堆栈
  7. 培智学校计算机课教案,培智数学教案
  8. python为什么closed_为什么Python无法解析此JSON数据? [关闭] - Why can't Python parse this JSON data? [closed]...
  9. 信息学奥赛一本通C++语言——1003:对齐输出
  10. 修改打开方式的程序列表中列出程序的名称
  11. 沐猿而冠 -教育-读书笔记(一)
  12. mybatis基础_动态代理开发
  13. 产品经理的简历怎么写?
  14. 基于用户的协同过滤Movielens电影推荐系统简单实例
  15. 【fgm.cc练习4-1】setTimeout应用:重点不是setTimeout,而是各种布局令我头大
  16. 批量删除QQ空间说说
  17. Hibernate数据查询教程
  18. 三级网络技术(八、无线局域网设备安装与调试)
  19. 生成文件夹目录树结构给markdown使用
  20. remark一些小小东西

热门文章

  1. 4.1 ucGUI 图片显示方法
  2. Miller方法产生、检验素数
  3. c语言usb串口输出,C语言实现模拟USB对8bit数据的NRZI编码输出
  4. 中秋祝福网页制作_中秋节祝福语不知怎么写?这3个小程序让你的祝福更精美...
  5. PCL深度图像(1)
  6. 剑指offer:面试题18. 删除链表的节点
  7. 在Ubuntu 14.04 64bit上生成ATS本地离线文档
  8. 用Rhino V7建造机甲学习教程 Building a Mecha using Rhino V7
  9. Blender 2.9中的真实感三维产品全流程制作学习教程
  10. 如何向非技术人员解释“稀疏傅里叶变换”算法?