Rive:Go中的快速可靠后台任务
River是一个强健的高性能作业处理系统,适用于Go和Postgres。请参见主页、文档和godoc,以及River UI及其现场演示。为了Postgres构建的River鼓励在应用程序数据和作业队列中使用相同的数据库。通过与其他数据库更改一起以事务方式排队作业,可以避免整类分布式系统的问题。如果事务提交,则保证作业被排队;如果事务回滚,则作业被移除;并且在提交之前不可见。有关这一哲学背后的更多背景,请参见事务排队作业参数和工人。作业在结构对中定义,包含JobArgs的实现和Worker之一。作业参数包含json注解,并定义了作业是如何序列化到数据库中和从数据库中反序列化的,以及一个“类型”,这是一种稳定字符串,可唯一标识作业。类型SortArgs结构{ // Strings是待排序字符串的切片。字符串[]字符串`json:"strings"`}函数(SortArgs)Kind()字符串{return"sort"}工人公开一个Work函数,规定作业的运行方式。类型SortWorker结构{ // 嵌入WorkerDefaults设置默认方法以实现其余的 // Worker接口:river.WorkerDefaults[SortArgs]}函数(w *SortWorker)Work(ctx context.Context,作业*river.Job[SortArgs])错误{sort.Strings(作业.Args.Strings)fmt.Printf("已排序字符串:%+v\n",作业.Args.Strings)return nil}注册工人作业通过其“类型”字符串唯一标识。工人在启动时注册,以便River知道如何将作业分配给工人:工人:= river.NewWorkers() // AddWorker如果工人已注册或无效将引发恐慌:river.AddWorker(工人,&SortWorker{})启动客户端River客户端提供插入作业的接口,并管理作业处理和维护服务。客户端是使用数据库池、驱动程序和包含工人捆绑包及其他设置的配置结构创建的。以下是一个处理一个队列("default")、最多同时使用100个工作协程的客户端:riverClient,err:= river.NewClient(riverpgxv5.New(dbPool),&river.Config{Queues:map[string]river.QueueConfig{river.QueueDefault:{MaxWorkers:100},},Workers:工人,}如果err!= nil{恐慌(err)} // 以内联方式运行客户端。所有执行的作业将从ctx继承:如果err:= riverClient.Start(ctx);err!= nil{恐慌(err)}可以省略工人,但最好包含它,以便River可以检查插入的作业类型是否有可以运行它们的工人。停止客户端也应在程序关闭时停止。可以有多种方法来完成此操作(请参阅优雅关闭),但最简短的方法是在程序准备停止时取消发送到Start的上下文。例如,要在SIGINT/SIGTERM时停止:riverClient,err:= river.NewClient(riverpgxv5.New(dbPool),&river.Config{SoftStopTimeout:10 * time.Second,...}如果err!= nil{恐慌(err)}信号Ctx,停止:= signal.NotifyContext(ctx,syscall.SIGINT,syscall.SIGTERM)延迟停止() // 停止获取新工作并等待活动作业完成。在SoftStopTimeout到期后取消作业。如果err:= riverClient.Start(signalCtx);err!= nil{恐慌(err)}<- riverClient.Stopped()另一种选择是显式调用停止:如果err:= riverClient.Stop(ctx);err!= nil{恐慌(err)}仅插入的客户端将插入作业,但不进行处理,且不需要启动或停止。插入作业Client.InsertTx与工作参数实例结合使用,以在事务中插入作业以进行处理:_,err=riverClient.InsertTx(ctx,tx,SortArgs{Strings:[]字符串{"whale","tiger","bear",},},nil)如果err!= nil{恐慌(err)}请参阅InsertAndWork示例以获取完整代码。其他功能批量作业插入,可以使用Postgres COPY FROM 高效插入多个作业。可以从工作函数内部取消作业。错误和恐慌处理。多个队列,以更好地保证作业吞吐量、工人可用性和组件之间的隔离。定期和Cron作业。计划在未来的预定时间自动运行的作业。从工作函数内部睡眠作业。对队列活动和统计的订阅,提供简单的钩子以进行遥测,例如日志记录和指标。测试助手以验证作业是否按预期插入。事务作业完成以保证作业完成与事务中的其他更改一起提交。根据参数、周期、队列和状态唯一作业。用于检查和与作业及队列交互的Web UI。工作函数以简化工人实现。跨语言排队River支持以某些非Go语言插入作业,然后由Go实现处理。在对性能要求敏感的情况下,这可能是理想的,以便作业可以利用Go的快速运行时。
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡