GoBatch是一款用go语言实现的企业级批处理框架,其设计思想来源于SpringBatch,相当于golang下的SpringBatch框架。
项目仓库地址:
Github:GitHub - chararch/gobatch: GoBatch is a batch processing framework in Go like Spring Batch in Javahttps://github.com/chararch/gobatch Gitee:gobatch: GoBatch is a batch processing framework in Go like Spring Batch in Javahttps://gitee.com/chararch/gobatch
GoBatch的主要功能包括:
GoBatch整体架构分为三层:
作为一款批处理框架,GoBatch的核心能力是任务编排和任务执行。应用程序需要首先通过GoBatch接口完成任务编排,才可以执行任务。
从任务结构编排上来说,一个任务(Job)由多个步骤(Step)构成,每个步骤包含一段业务逻辑,各步骤按照先后顺序依次执行。 任务编排即是将不同的业务逻辑构造成多个步骤(Step)并按照一定顺序组装成任务(Job),交由GoBatch运行时管理。作为批处理框架,GoBatch可以管理多个任务。
任务执行时,应用程序可以传递参数给指定任务,GoBatch根据传入的任务参数生成一个任务实例(JobInstance)。一个任务实例可能会被多次执行,每次执行时,GoBatch会创建一条任务执行记录(JobExecution)用于记录任务的执行状态信息。 同理,每个Step的运行也会生成一条步骤执行记录(StepExecution)。GoBatch会将任务实例(JobInstance)、任务执行记录(JobExecution)、步骤执行记录(StepExecution)通过Repository存储到数据库中。
GoBatch没有限定任务执行的触发方式,应用程序既可以通过定时任务、也可以通过实时事件、还可以通过命令行触发任务的执行。
GoBatch批处理应用的执行流程如下:
步骤(Step)分为三类:
上图中的Handler、Reader、Processor、Writer、Partitioner、Aggregator是接口类型,需要应用程序自己实现。
任务编排主要由stepBuilder和jobBuilder两个对象来完成,应用程序先将不同的业务逻辑handler通过stepBuilder生成Step对象,再将Step对象传给jobBuilder生成Job。 如下图:
在构造Step对象时,stepBuilder会根据传入的handler类型选择合适的Step类型:
stepBuilder的执行流程如下:
任务编排的整体流程如下:
应用层可以根据定时任务、外部请求/事件、命令行等触发GoBatch任务的执行。应用程序通过调用jobOperator的Start()/StartAsync()方法启动任务的执行,在启动任务时,需要指定任务名称并传递参数。
同步执行任务的流程图如下:
从流程图中可以看出,Job的执行就是遍历所有的Step并执行Step中的业务逻辑。Step有三种类型,每种类型Step的执行流程有一定区别,我们可以根据业务需要使用不同Step类型。
简单步骤的执行
简单步骤直接在当前Job的线程中执行Handler中的业务逻辑,Handler中的业务逻辑应当是原子性的或具有幂等性。执行流程如下:
从名称可知,简单步骤适合于业务逻辑比较简单的场景。
分块步骤的执行
分块步骤也是在当前任务的线程中执行(单线程),它的执行流程是:
流程图如下:
分块步骤适合用于处理大批量数据、但需要串行执行的场景,或者是数据量较大、计算资源有限、但对处理时限要求不高的场景。
分区步骤的执行
分区步骤的执行流程是:
流程图如下:
分区步骤适合用于处理大批量数据、计算资源比较充足的场景。
GoBatch通过以下4个对象记录批量任务的运行时的状态信息:
这4个对象对应数据库里的4张表,主要的字段及相互关系如下图:
具体的表结构,可以查看:https://github.com/chararch/gobatch/blob/master/sql/schema_mysql.sql
JobExecution和StepExecution中包含Job和Step的运行开始和结束时间、状态等信息。对于chunkStep,在StepExecution里面会记录已经Read、Process、Write的数据量,已提交或回滚的chunk次数等。 Job和Step的执行状态有:
状态转移如下:
通过记录Job和Step的执行状态,GoBatch可以实现断点续跑功能。试想,当我们在运行一个处理大数据量、耗时很长的任务时,中途由于某些原因(如进程crash、部分数据不规整造成程序出错等)导致失败, 在我们解决问题后,如果从头开始运行势必会花费很长时间、甚至会造成重复处理。这时我们可能希望从中断位置继续处理剩余数据,GoBatch能够很好地满足这一诉求。
GoBatch可以管理多个Job,每个Job又包含一个或多个Step,在Job和Step层级都可以并行执行。GoBatch在内部维护了两个协程池(大小可配置):一个用于Job的执行,一个用于Step(专指partitionStep)的执行。
在执行分块步骤(chunkStep)时,对每个分块内一小批数据的处理需要处在一个事务之中,GoBatch引入了一个事务管理器组件,其接口定义如下:
type TransactionManager interface {
BeginTx() (tx interface{}, err BatchError)
Commit(tx interface{}) BatchError
Rollback(tx interface{}) BatchError
}
这个事务管理器需要使用方根据自身的基础设施自行实现并注册到GoBatch。为简便起见,GoBatch提供了一个基于*sql.DB的默认事务管理器实现,如果使用方是采用关系数据库来进行数据处理,可以直接使用默认的事务管理器,如下:
gobatch.SetTransactionManager(gobatch.NewTransactionManager(sqlDb))
1. 获取包
go get -u github.com/chararch/gobatch
2. 创建gobatch数据库和批量任务执行状态表
create database xxx;
//create table from https://github.com/chararch/gobatch/blob/master/sql/schema_mysql.sql
3. 初始化数据库连接并注册*sql.DB到GoBatch:
db, _ := sql.Open("mysql", "user:pswd@tcp(localhost:3306)/xxx?charset=utf8&parseTime=true")
gobatch.SetDB(db)
4. 如果使用chunkStep,还需要注册事务管理器:
gobatch.SetTransactionManager(gobatch.NewTransactionManager(sqlDb))
5. 编写业务逻辑,实现Handler、Reader、Processor、Writer等接口。示例可以参考:GitHub - chararch/gobatch: GoBatch is a batch processing framework in Go like Spring Batch in Java
6. 构造Step和Job,注册到GoBatch
step1 := gobatch.NewStep("mytask").Handler(mytask).Build()
//step2 := gobatch.NewStep("my_step").Handler(&myReader{}, &myProcessor{}, &myWriter{}).Build()
step2 := gobatch.NewStep("my_step").Reader(&myReader{}).Processor(&myProcessor{}).Writer(&myWriter{}).ChunkSize(10).Build()
job := gobatch.NewJob("my_job").Step(step1, step2).Build()
gobatch.Register(job)
7. 启动任务
gobatch.Start(context.Background(), "my_job", "{\"k\":\"v\"}")
//gobatch.StartAsync(context.Background(), "my_job", "{\"k\":\"v\"}")
更多信息和示例代码,可以参见:GitHub - chararch/gobatch: GoBatch is a batch processing framework in Go like Spring Batch in Java
本文对批处理框架GoBatch的功能、架构、设计和使用方法,做了一个简要介绍。GoBatch适合用于开发业务逻辑比较复杂的企业级批处理应用,例如金融等领域,也可用于企业在从Java向Go转型时替换SpringBatch的框架。 作为开源项目,GoBatch目前还处于比较早期的阶段,未来致力于将GoBatch打造成golang下的企业级批处理解决方案,后续会有更多相关内容介绍。
https://github.com/chararch/gobatch/issues/new