golang的第一个实践小项目为刷脚本的辅助框架。

有帮助的话可以点个Star!

软件需求分析

什么样的项目才能为你的简历增光添彩呢?首先,任何值得展示的项目都需要有实际功能,而不是一些练习。其次,功能不需要很多,聚焦性比较强,整体逻辑比较完善更好,换句话说,项目深度大于项目广度。因此,写软件需求分析这一部分不仅是为了帮助大家了解这个小项目的逻辑,也希望读者可以发现身边值得写得项目,并通过完整的需求进行自我迭代和丰富。

码这个框架的原因已经在上篇中说明了:顾茄:GO语言实践栏目介绍

一个刷脚本辅助框架至少可以提供以下能力:

  • 日志打印,无论成功与否,我们都应该有可以反馈的消息。
  • 超时机制,我们的脚本常常用于写入\删除部分遗失数据到数据库,或者访问网站,进行爬虫或者查询。提供一个超时机制来去除一些阻塞的请求是非常有必要的。
  • 重试机制,刷取脚本时部分数据可能因为资源访问过于频繁导致刷取失败,因此我们也希望可以通过重试机制,尽可能保证脚本访问成功率。

此外控制脚本数据按序刷取等也是可添加的功能。

整体需求逻辑

前置环境

Vscode+go环境搭建,有非常多的资料,此处不再补充

脚本数据:脚本只是测试所需,因此没有特定的数据,大家可以去kaggle搜寻heart相关的数据,然后下载任何一个csv文件。这里仅提供一个链接:https://www.kaggle.com/andrewmvd/heart-failure-clinical-data

程序运行

直接运行main.go文件,或者cd到scripttool/test 执行 go test -v runsh_test.go(注意无论是main.go还是测试文件都要将文件路径改为你自己下载到的数据路径)

为了易于理解,该程序仅仅遍历所有数据,将年龄60岁以上的数据视为更新失败,年龄60岁以下的数据视为刷取成功,并且按序输出日志到csv文件


代码解析

本章讲解整个模块的搭建和接口的使用

总体架构

总体架构如图所示,script模块内为执行脚本刷取的文件,scripttool为实现辅助功能的框架,包括日志打印,超时,重试等等,storage为日志打印等功能所需的数据结构。

scripttool.go文件中核心的函数为RunSh,

该函数的功能为读取数据并对每个数据执行脚本任务。整体较为复杂,且涉及Context,channel、pipeline等相关知识,本章暂不分析函数内部,我们先关注传入参数以及为什么要这么设计


日志模块与对应接口解析

filepath 为数据文件路径, dataReadPattern与proportion为数据读取模式,是为验证数据服务的,有时候我们知识想抽样部分数据,查询数据库或者通过网站验证结果。readData为读取数据函数,是固定的模式。

recorder storage.Recorder 为储存日志的接口,这里之所以选择接口,是因为在未来我们可能有多个日志存储器,可能直接写入本地的CSV,或者写入txt文本,也可能写入某个网站或者数据库。这里就是选择接口的一个理由:当我们有一个模块未来可能有多个实现途径的时候,可以选择接口,这样在代码中就可以规避过多的if-else,也就是golang语言中的多态。此处我们要求日志存储接口拥有三个能力,记录每行数据,刷取缓存,关闭

rushData func(rushDataWrapper storage.RushDataWrapper)(storage.Logger))error

同样日志的打印可能也有开发者希望定制实现,因此这里我们将Logger也作为接口

RushDataWrapper则是对数据做一些包装,记录这个数据的主键,读取该数据的时间等等,这样无论是日志定位还是其他的方面,都有一定的帮助。

在软件设计的前期,我们可以对预计有拓展的模块采用接口模式,对需要一些附属信息的数据结构添加一层包装


最后,刷数据的最重要环节是如何并发的执行和并发安全,并且保证日志顺序,下一张将对runsh中的函数体进行具体分析,感谢大家的关注~。干杯!