Go 中使用 Temporal.io 实现高效工作流程:存储库模式
作者:互联网
存储库模式架构
此模式涉及创建一个用于数据访问的专用存储库层,它将数据访问层从应用程序的其余部分中抽象出来。
结构
main.go去
配置/
配置。转到
存储库/
数据库。转到
example_repository。去
服务/
服务。转到
工作流程/
example_workflow。去
活动/
example_activity。去
main.go文件是应用程序的入口点。它导入必要的包并启动工作流程。
config 包包含一个config.go文件,该文件从文件或环境变量中读取配置值以设置应用程序。
存储库包包含一个database.go文件,该文件与数据库交互以检索或存储数据。我们还有一个 example_repository.go 文件,它实现存储库模式以从业务逻辑层抽象数据访问层。
服务包中包含一个service.go文件,该文件封装了复杂的业务逻辑,并通过存储库层与数据库进行交互。
工作流程包包含example_workflow.go文件,该文件定义 Temporal.io 引擎的主要工作流程逻辑。
活动包包含一个example_activity.go文件,该文件定义了 Temporal.io 引擎执行的活动逻辑。
以下是 example_workflow.go 和 example_activity.go 中的ExampleWorkflow和ExampleActivity函数的示例:
// example_workflow.go
func ExampleWorkflow (ctxworkflow.Context) error {
var data [] string
err :=workflow.ExecuteActivity(ctx, ExampleActivity, "example" ).Get(ctx, &data)
if err != nil {
return err
}
// 通过服务层传递数据
service := NewExampleService(NewExampleRepository())
result, err := service.DoSomeComplexBusinessLogic(data)
if err != nil {
return err
}
// 将结果返回给调用者
return工作流.SetResult(ctx, 结果)
}
// example_activity.go
func ExampleActivity (ctx context.Context, input string ) ([] string , error ) {
// 尝试检索数据 3 次,每次重试之间间隔 2 秒,以防出现错误
retryOptions :=temporal.RetryOptions{
InitialInterval: time.Second * 2 ,
BackoffCoefficient: 2.0 ,
MaximumAttempts: 3 ,
DoNotRetry: [] error {ErrNonRetryable},
NonRetryableErrorTypes: []reflect.Type{reflect.TypeOf(ErrNonRetryable)},
}
// 使用存储库从数据库中检索数据
repo := NewExampleRepository()
data, err := repo.GetDataFromDatabaseByKey(ctx, key)
if err != nil {
return nil , temporal.NewContinueAsNewError(ctx, ExampleActivity, input)
}
返回数据,无
}
这些函数演示了存储库模式如何与 Temporal.io 引擎配合使用来管理工作流程和活动。如果出现退避指数错误,ExampleActivity 函数会重试 RetrieveDataFromDatabase 函数,并将检索到的数据通过服务层传递以执行业务逻辑。当业务逻辑执行没有任何错误时,ExampleWorkflow 函数使用 Temporal.io 引擎来设置工作流的结果。
通过以这种方式构建应用程序,我们可以保持数据访问和业务逻辑层解耦,从而更容易维护、管理和测试应用程序。
此模式涉及创建一个用于数据访问的专用存储库层,它将数据访问层从应用程序的其余部分中抽象出来。
结构
main.go去
配置/
配置。转到
存储库/
数据库。转到
example_repository。去
服务/
服务。转到
工作流程/
example_workflow。去
活动/
example_activity。去
main.go文件是应用程序的入口点。它导入必要的包并启动工作流程。
config 包包含一个config.go文件,该文件从文件或环境变量中读取配置值以设置应用程序。
存储库包包含一个database.go文件,该文件与数据库交互以检索或存储数据。我们还有一个 example_repository.go 文件,它实现存储库模式以从业务逻辑层抽象数据访问层。
服务包中包含一个service.go文件,该文件封装了复杂的业务逻辑,并通过存储库层与数据库进行交互。
工作流程包包含example_workflow.go文件,该文件定义 Temporal.io 引擎的主要工作流程逻辑。
活动包包含一个example_activity.go文件,该文件定义了 Temporal.io 引擎执行的活动逻辑。
以下是 example_workflow.go 和 example_activity.go 中的ExampleWorkflow和ExampleActivity函数的示例:
// example_workflow.go
func ExampleWorkflow (ctxworkflow.Context) error {
var data [] string
err :=workflow.ExecuteActivity(ctx, ExampleActivity, "example" ).Get(ctx, &data)
if err != nil {
return err
}
// 通过服务层传递数据
service := NewExampleService(NewExampleRepository())
result, err := service.DoSomeComplexBusinessLogic(data)
if err != nil {
return err
}
// 将结果返回给调用者
return工作流.SetResult(ctx, 结果)
}
// example_activity.go
func ExampleActivity (ctx context.Context, input string ) ([] string , error ) {
// 尝试检索数据 3 次,每次重试之间间隔 2 秒,以防出现错误
retryOptions :=temporal.RetryOptions{
InitialInterval: time.Second * 2 ,
BackoffCoefficient: 2.0 ,
MaximumAttempts: 3 ,
DoNotRetry: [] error {ErrNonRetryable},
NonRetryableErrorTypes: []reflect.Type{reflect.TypeOf(ErrNonRetryable)},
}
// 使用存储库从数据库中检索数据
repo := NewExampleRepository()
data, err := repo.GetDataFromDatabaseByKey(ctx, key)
if err != nil {
return nil , temporal.NewContinueAsNewError(ctx, ExampleActivity, input)
}
返回数据,无
}
这些函数演示了存储库模式如何与 Temporal.io 引擎配合使用来管理工作流程和活动。如果出现退避指数错误,ExampleActivity 函数会重试 RetrieveDataFromDatabase 函数,并将检索到的数据通过服务层传递以执行业务逻辑。当业务逻辑执行没有任何错误时,ExampleWorkflow 函数使用 Temporal.io 引擎来设置工作流的结果。
通过以这种方式构建应用程序,我们可以保持数据访问和业务逻辑层解耦,从而更容易维护、管理和测试应用程序。
标签:编程,存储库,Temporal.io 来源: