1
为什么需要任务分发平台
在一个基本的评测系统中我们有了评测执行工具、评测数据、评测环境就能进行一次评测任务的执行,但现在是大数据时代,我们更多的需求是针对大量数据进行评测。比如在输入法评测中我们有10000个语料文件需要下发到100台手机上执行测试,如果靠人工控制逐一分配任务难免非常复杂混乱,影响工作效率。而一个任务分发管理平台的意义就是实现对所有任务进行统一管理,保证有序高效执行。
2
一个优秀的任务分发平台是怎样的
在输入法项目的评测工作中,我们对任务分发管理也有了一些经验,我们认为一个优秀的任务分发管理平台需要具备以下三个特征:
结果准确
正确下发任务是平台的基本功能,保证用户获取的任务信息准确无误。比如一个输入法评测任务:评测10.1版本输入法在体育类别语料中的基础品质,那获取的任务中包含的评测数据集以及软件版本等信息必须完整且准确,否则错误任务的执行不仅耗时,还可能产生错误的评测结论。
另外,需要注意的是海量任务评测必须处理好高并发的用户场景,比如100台手机同时获取评测任务时,需要平台保证所有任务无重复且无遗漏的下发。
高效执行
平台的稳定性是保证效率的基本要求,否则每一个崩溃的修复都会增加测试成本。
大量数据的高效执行需要我们提供智能分发能力,计算最优下发策略。比如任务列表中包含3任务,执行一次的时间分别为A任务4小时、B任务4小时、C任务8小时,现有2台机器并发工作。任务分发平台下发任务的不同策略会导致不同的时间成本,方案一:下发顺序ABC,则三个任务执行完毕总消耗的时间为12小时;方案二:下发顺序CAB,则总消耗为8小时。因此智能分发是提高效率的有效途径。
使用便捷
平台的设计更多需要从用户的角度出发,作为平台的开发者必须熟悉评测的需求才能编写出便捷易用的产品。
对接用户需求是关键,比如我曾经遇到过如下问题,在任务平台的结果展示界面中有任务进度展示表格,表格中展示了该项目任务的语料信息、软件信息,评测进度等,在每一行的表格编号展示时,以开发者的习惯设计为递增的行号。后来以评测执行者的身份查看该表格时发现设计为该项目在数据库中对应的id号更合适,在后续可以通过该id值与其他任务结果展示表格数据产生直观的连接。
3
如何做任务分发管理平台
任务分发管理平台的设计实现我们分为数据库、后端和前端三个模块。
数据库
首先在评测前需要先做好数据的存储,海量数据的合理存储能够给整个评测的工作提供稳定的数据支持。
数据库设计时需要考虑如何节省空间和查询高效。第一、尽量减少冗余数据,比如输入法评测中一个任务中包含软件信息,而显然任务数据是百万量级的,而软件信息一般是百量级的,因此将软件信息和任务信息设计为两个数据表,通过外键的方式连接可以节约数据存储空间,提高数据访问速度。第二、建立高效索引,一般用户的各种需求实现时需要对数据表进行各种组合条件查询,而对于百万量级的数据表如果不能建立高效合适的索引,查询的效率显然无法满足要求。
后端
数据处理
我们在做各种数据处理时主要遵循两个原则:准和快。
首先数据要准确,比如用户误操作重复添加的任务能及时过滤,用户删除的任务能及时更新任务数据,高并发时要保证数据的线程安全等等。
其次数据处理要高效,这个体现在很多方面,比如在数据库的访问中不同的语法的效率便有很大的差异,在如下所示代码中同样是查询状态为pending的第一条任务,第二种语句的实现显然效率更高。
语法一:
task = TaskInfo.query.filter(and_(TaskInfo.status == "pending").all()[0]
语法二:
task = TaskInfo.query.filter(and_(TaskInfo.status == "pending").first()
任务流
一个完整的任务流一般分为任务的添加、任务的获取、任务的下发和任务信息的回收,而这也正好对应任务的生命周期中的四个状态任务就绪(pending)、等待执行(waiting)、执行中(running)、结束(finished)。
一个任务流分为以下四步:
1)新任务首次写入数据库中,初始状态置为pending。此过程直接与用户交互,因此在用户操作后可以将任务先加入缓存Redis中,及时给予用户反馈,然后再后台定期将Redis中任务写入数据库中;
2)从数据库获取pending状态的任务,写入缓存任务队列,任务状态置为waiting,等待被执行。用户获取任务的过程频繁,因此提前将所有未执行任务取出可以减少数据库的访问次数,其次将任务缓存在Redis的数据结构中还可以提高用户获取任务的响应速度;
3)执行机器从缓存任务队列中获取任务开始执行,任务状态置为running;
4)任务执行完毕后,任务状态置为finished。
用户交互
用户交互部分的实现一般需要注意两点:
第一、接口规范要统一,先收集用户需求,然后与前端统一定义好接口的参数,使用规范,提高工作效率。
第二、考虑用户对响应性能的要求,对于一些需要执行很长时间的任务,如果不能及时响应,用户的前端界面就会一直卡在那儿,影响体验。因此需要考虑用户场景优化底层实现算法,比如分布式调度任务、多线程处理、分页优化算法等等以提高交互性能。
前端
前端是直接面向用户的,因此前端的设计必须对接用户的需求,要有产品思维,从用户的角度出发设计前端,做到简单、美观和规范。而在实现上,选择一款合适的前端框架也能事半功倍,目前比较主流的框架有React、Vue和Angular等等。每种框架都有其适用的开发场景,比如React在浏览器兼容方面很有优势,Vue是轻量级的渐进式框架,与现代化的工具链以及各种支持库的结合非常优秀,非常容易上手,而Angular框架是JS框架,有着丰富的Angular指令,可以扩宽html。在开发任务分发平台的前端时可以选择以上任意一种框架,按照开发者的习惯即可。
4
总结
在当今大数据AI时代,对大数据的测试会成为业界趋势,具备相关的技术能力也是我们测试的必要功课,做好任务分发也是其中必不可少的一环。对于大数据测试大家有什么心得体会,也欢迎与我们一起分享~~~。