阅读更多

0顶
1踩

研发管理
引用
原文:How Yelp Runs Millions of Tests Every Day
作者:Chunky G.
翻译:贺雨言

快速进行功能开发对企业至关重要,开发团队都试图通过减少测试、配置和监控变化的时间来提高开发人员的效率。为了让开发人员安全地敲代码,Yelp使用内部分布式系统Seagull运行2000多万个测试。
\
什么是Seagull?

Seagull是一个容错和故障恢复的分布式系统,用来并行执行测试包。Seagull由以下几部分组成:
  • Apache Mesos(管理Seagull集群上的资源)
  • AWS EC2(提供组成Seagull和Jenkins集群的实例)
  • AWS DynamoDB(存储调度器的元数据)
  • Docker(隔离测试需要的服务)
  • Elasticsearch(追踪测试运行次数和集群使用数据)
  • Jenkins(搭建代码项目并运行Seagull调度器)
  • Kibana和SignalFx(提供监控和报警)
  • AWS S3(为测试日志提供真实数据来源
挑战

在准备单片Web应用和Yelp主机配置新的生产代码之前,Yelp开发人员在特定的主机上运行整个测试包。测试前,开发人员需启动用来调度集群测试的Seagull。以下两点需要着重考虑:
  • 性能:每个Seagull-run包含将近10万个测试,依次运行完毕需要大约2天时间。
  • 规模:通常一天有300多个seagull-runs在运行,高峰时段要同时运行30-40个测试。
这项任务的挑战在于执行每一个Seagull-run所花费的时间是以“分钟”而不是以“天”来计算,同时保证在这个时间段内成本效益好。

Seagull怎样运作?

首先,开发人员在控制台启动Seagull-run,即启动Jenkins搭建代码项目并生成测试列表。然后,将测试打包传给Seagull集群上的调度器进行测试。最后,将测试结果存储在Elasticsearch和S3中。

1、开发人员为特定的代码版本(基于其分支git SHAs)启动Seagull-run,设git分支为test_branch。
2、生成test_branch的代码项目和测试列表并上传到S3。
3、Bin Packer抓取测试列表和测试的历史时序元数据,从而构建包含测试的多包。有效打包是一个装箱问题,可以用以下两个算法解决,(选择哪种算法)取决于研发人员传给Seagull的参数:
(1)、贪婪算法:首先根据历史测试时长将测试分类,然后将测试时长设置为10分钟的测试归档。
(2)、线性规划(LP):为了防止相关测试,一个测试需要和另一个测试在同一个包里运行。因此,我们使用LP进行打包,LP方程的目标函数和约束条件定义如下:
    1)目标函数:对生成的包总数取最小值
    2)主要约束条件:
                单包的测试时长少于10分钟;
                一个测试只能放入一个包;
                相关测试放入同一个包。

我们使用Pulp LP解算器求解方程:
# Objective function:
problem = LpProblem('Minimize bundles', LpMinimize)
problem += lpSum([bundle[i] for i in range(max_bundles)]), 'Objective: Minimize bundles'

# One of the constraint, constraint (1), looks like:
for i in range(max_bundles):
    sum_of_test_durations = 0
    for test in all_tests:
        sum_of_test_durations += test_bundle[test, i] * test_durations[test]
    problem += (sum_of_test_durations) <= bundle_max_duration * bundle[i], ''

其中,bundle和test_bundle是LP变量,max_bundles和bundle_max_duration是整数。

通常,在LP约束条件中,我们会考虑测试用例的搭建和解除的时长,但是为了简便,在这里我们忽略不计。
4、在Jenkins主机上启动调度器进程,Jenkins主机抓包然后搭建mesos架构。我们为每一个Seagull-run创立一个新的调度器。每一次运行生成300多个包,将运行时长在10分钟左右的包归为一类。调度器为每一个包建立一个Mesos执行器,只要Mesos控制器提供充足的资源,就将Mesos执行器列入Seagull集群时间计划表。
5、一旦执行器被列入到集群,执行器内部将进行以下步骤:

每一个执行器建立一个沙箱,从S3(在步骤(2)中已上传)下载新建项目。然后下载对应于相关测试服务的Docker图片就可以建立Docker容器(服务)了。当所有的容器都启动并运行,就开始进行测试了。最后,测试结果和元数据存储在Elasticsearch(ES)和S3中。我们用内部代理服务Apollo写入ES。

如果你生活在一个分布式系统的世界,你一定无法避免主机故障。Seagull对任何实例故障都具有容错功能。

例如,假设一个调度器要运行两个包。Mesos会提供一个代理(A1)的资源给调度器。假设调度器认为资源充足,那么这两个包会被安排在A1上。假如出于某种原因,A1出故障了,那么Mesos会通知到调度器。调度器的任务管理器决定重试或者丢弃那两个包。如果重试,当Mesos下一次提供充分的资源(这种情况下,是提供代理A2的资源)时,那两个包会被重新安排到时间计划表里。为了防止包被丢弃,调度器会将那两个包测试标记为“未执行”。
6. Seagull UI用Apollo从ES获取结果,并将结果加载到UI供开发人员查看。如果结果全部通过,就可以准备配置了。

规模化挑战

为了确保测试包的及时性,尤其是在高峰期,Seagull集群需要保证大量实例一直处于可用状态。之前我们使用AWS的按需实例AWS ASGs,但对我们来说,要想达到这个容量成本太高了。

为了降低成本,我们开始使用一个叫FleetMiser的内部工具去维持Seagull集群。FleetMiser是一个用来测量基于不同信号的集群的自动缩放引擎,这些信号包括当前集群使用率、管道内的流量数等等。FleeMiser主要由以下两部分组成:
  • AWS Spot Fleet:AWS有现场实例,现场实例比按需实例成本低很多,Spot Fleet能提供交互界面更简单的现场实例。
  • 自动缩放:集群的使用时间不稳定,使用高峰主要集中在10:00-19:00(太平洋标准时间),此时,开发人员工作强度最大。为了动态调整范围,FleetMiser使用集群在不同优先级别下的当前和历史使用数据。Seagull集群每天的波动范围大概介于1500CPU内核和10000CPU内核之间。

FleeMiser为我们的集群节省了大约80%的成本。在使用FleetMiser之前,我们是使用AWS按需实例,没有自动缩放功能。

总结
Seagull使测试结果时长从2天缩短到了30分钟,同时也大大降低了执行成本。从今以后,开发人员可以安心敲代码,不用再花大量时间等待验证变化却束手无策。
  • 大小: 26.8 KB
  • 大小: 186.8 KB
  • 大小: 51.9 KB
  • 大小: 121.6 KB
  • 大小: 14.7 KB
  • 大小: 39.2 KB
0
1
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 干货 | Yelp是如何使用Docker的?

    本文讲的是干货 | Yelp是如何使用...每天都有成千上万的人在使用Yelp的SeatMe来完成餐厅预订服务。这篇博客将会深入地讲解Yelp是如何使用Docker来开发并部署SeatMe系统的。Docker是一个非常强大的生产环境助推器,它...

  • YELP NLP 文本信息提取项目

    为了做研究,进了Yelp这个大坑。自己选的题,哭着也得搞出来… 感觉边写代码边记录下心得体会、下一步的构想等等有的没的,是个很好的整理思路的过程。所以我接下来会长篇累牍地写自己在做这个项目的过程中所遇到的...

  • Yelp,如何使用深度学习对商业照片进行分类

    Yelp是美国最大点评网站,拥有世界各地的Yelper上传的成千上万的照片。各种各样的照片给进入当地的商业提供了一个丰富的窗口。通过开发一个照片理解系统使Yelp能够创建有关个人照片的语义数据。跟Yelp第一次在基于...

  • python数据分析六个环节_六个鲜为人知的python数据分析库

    Python 提供了高质量的环境和丰富的第三方库为开发者提供数据分析支持。不管是数据处理还是数据 可视化等等, 都有许多有用的库。一些库非常有名:Pandas, Numpy,...mrjobmrjob是一个帮助你写用Python写MapRe...

  • 为什么私有云的定位应该是PaaS,而不是IaaS?

    本文讲的是为什么私有云的定位应该是PaaS,而不是IaaS,【编者的话】IT界已经对私有云架构争论了好久,虽然有很对公司尝试了Iaas私有云方案,但始终不尽如人意,因为把目光仅仅集中在Iaas上是一个一开始就错误的想法...

  • 机器学习与深度学习资料整理

    介绍:每天请一个大牛来讲座,主要涉及机器学习,大数据分析,并行计算以及人脑研究。 https://www.youtube.com/user/smolix  (国内或许不能访问) 《Awesome Machine Learning》 介绍:一个超级完整的机器学习...

  • 机器学习与深度学习资料

    介绍:每天请一个大牛来讲座,主要涉及机器学习,大数据分析,并行计算以及人脑研究。 https://www.youtube.com/user/smolix  (国内或许不能访问) 《Awesome Machine Learning》 介绍:一个超级完整的...

  • 深度学习和机器学习的相关资料

    介绍:每天请一个大牛来讲座,主要涉及机器学习,大数据分析,并行计算以及人脑研究。 https://www.youtube.com/user/smolix  (需翻墙) 《Awesome Machine Learning》 介绍:一个超级完整的...

  • 机器学习(Machine Learning)&深度学习(Deep Learning)资料

    介绍:每天请一个大牛来讲座,主要涉及机器学习,大数据分析,并行计算以及人脑研究。 https://www.youtube.com/user/smolix  (需翻墙) 《Awesome Machine Learning》 介绍:一个超级完整的机器学习...

  • python公司一般都是什么样的公司-人们对Python在企业级开发中的10大误解

    全世界有数以百万计的Python开发人员,几十个Python会议,StackOveflow上几万个Python相关的问题,一些公司,如YouTube,美国银行,和LucasArts/Dreamworks雇用了成千上万的Python开发人员。在eBay和PayPal,我们有...

  • 谷歌算法统治互联网的秘诀

    这是一个很普通的搜索,谷歌每天要处理成千上万的这种搜索。但事实上这一搜索过程十分复杂,可能使一些搜索引擎误解。如果把这些单词输入到必应,第一个结果是美国国家橄榄球联盟的历年球员名单,其中有一个名叫...

  • linkedin爬虫_我是如何使LinkedIn接触者添加机器人的-实际得到了一些采访

    您可以在此处输入任何JavaScript代码进行测试。 您可以使用输入的代码与浏览器中打开的页面进行交互。 For example, try typing in the following code in the console and press Enter. 例如,尝试在控制台中输入...

  • 被10大谬论害惨的编程语言(Python)

    伴随着所有的初创公司正在使用它以及孩子们最近也在学习它的事实,这个谬误为何仍然存在是可以理解的。实际上 Python 已经 超过23岁了, 它最初发布于1991年, 早于 HTTP 1.0协议 5年且早于 Java 4年. 目前比较有著名...

  • python简单程序实例-python简单项目实例

    语言多元化是PayPal编程文化中一个重要的组成部分。在C++和Java长期流行的同时,更多的团队选择了Jva和Scala。同时,Braintree的收购也引入了一个久经世故的Ruby社区。Python作为一门特别的语言,在eBay和PayPal有很...

  • Python不能用于大型项目?人们对Python的十大误解

    而存在一个不争而有趣的事实是, Python 是比Java更加强类型的. Java 对于原生类型和对象区分了类型系统,它让null存在于一个灰色地带. 另一方面,现代的 Python 拥有一个统一的强类型系统, 其中什么都没有(None) ...

  • 谁说不能用 Python开发企业应用?

    点击上方 "程序员小乐"关注,星标或置顶一起成长每天凌晨00点00分,第一时间与你相约每日英文Be true to who you are. Stop trying to please other people or be someone else. It’s better to be an original ...

  • PHP语言基础知识详解及常见功能应用.docx

    本文详细介绍了PHP的基本语法、变量类型、运算符号以及文件上传和发邮件功能的实现方法,适合初学者了解和掌握PHP的基础知识。

  • 公司金融课程期末考试题目

    公司金融整理的word文档

  • 适用于 Python 应用程序的 Prometheus 检测库.zip

    Prometheus Python客户端Prometheus的官方 Python 客户端。安装pip install prometheus-client这个包可以在PyPI上找到。文档文档可在https://prometheus.github.io/client_python上找到。链接发布发布页面显示项目的历史记录并充当变更日志。吡啶甲酸

Global site tag (gtag.js) - Google Analytics