标签:编程 存储库 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 来源:
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。