Goblero
参考文档: https://github.com/didil/goblero
Pure Go, Simple, Embedded, Persistent Job Queue, backed by BadgerDB
DO NOT USE IN PRODUCTION This library is still in Alpha / Work In Progress
About Goblero
Intro article: Introducing Goblero: a Go Embedded Job Queue
- Pure Go library, no cgo
- Simple, embedded, persistent job queue
- Provides in-process job processing to any Go app
- The jobs/status changes are persisted to disk after each operation and pending jobs can continue processing after an app restart or a crash
- Allows multiple “processors”, each processor/worker processes one job at a time then is assigned a new job, etc
- The storage engine used is [BadgerDB]
P.S: Why is the library named Goblero ? Go for the Go programming language obviously, and Badger in french is “Blaireau”, but blero is easier to pronounce :)
Usage
The full API is documented on godoc.org. There is also a demo repo goblero-demo
Get package
go get -u github.com/didil/goblero/pkg/blero
API
// Create a new Blero backend
bl := blero.New("db/")
// Start Blero
bl.Start()
// defer Stopping Blero
defer bl.Stop()
// register a processor
bl.RegisterProcessorFunc(func(j *blero.Job) error {
// Do some processing, access job name with j.Name, job data with j.Data
})
// enqueue a job
bl.EnqueueJob("MyJob", []byte("My Job Data"))
Demo
package main
import (
"flag"
"fmt"
"log"
"os"
"os/signal"
"syscall"
"time"
"github.com/didil/goblero/pkg/blero"
)
func main() {
// Parse flags
n := flag.Int("n", 1, "number of processors")
flag.Parse()
// Create a new Blero backend
bl := blero.New("db/")
// Start Blero
err := bl.Start()
if err != nil {
log.Fatal(err)
}
// Register processor(s)
for i := 1; i <= *n; i++ {
pI := i
fmt.Printf("Registering Processor %v ...\n", pI)
bl.RegisterProcessorFunc(func(j *blero.Job) error {
fmt.Printf("[Processor %v] Processing job: %v - data: %v\n", pI, j.Name, string(j.Data))
// Simulate processing
time.Sleep(2 * time.Second)
fmt.Printf("[Processor %v] Done Processing job: %v\n", pI, j.Name)
return nil
})
}
// Enqueue jobs
if len(os.Args) > 1 && os.Args[1] == "enqueue" {
fmt.Println("Enqueuing jobs ...")
for i := 1; i <= 50; i++ {
jobName := fmt.Sprintf("Job #%v", i)
jobData := []byte(fmt.Sprintf("Job Data #%v", i))
_, err := bl.EnqueueJob(jobName, jobData)
if err != nil {
log.Fatal(err)
}
}
}
// Wait for SIGTERM or SIGINT to stop Blero and exit
var exitCh = make(chan os.Signal)
signal.Notify(exitCh, syscall.SIGINT)
signal.Notify(exitCh, syscall.SIGTERM)
s := <-exitCh
fmt.Printf("Caught signal %v. Exiting ...\n", s)
// Stop Blero
bl.Stop()
os.Exit(0)
}
Benchmarks
# Core i5 laptop / 8GB Ram / SSD
make bench
BenchmarkEnqueue/EnqueueJob-4 50000 159942 ns/op (~ 6250 ops/s)
BenchmarkEnqueue/dequeueJob-4 5000 2767260 ns/op (~ 361 ops/s)
Todo:
- Restart interrupted jobs after app restart/crashes
- Sweep completed jobs from the “complete” queue
- Failed Jobs retry options
- Allow batch enqueuing
- Add support for Go contexts
- Test in real conditions under high load
- Expose Prometheus Metrics in an Http handler
- Optimize performance / Locking
Goblero 介绍
参考文档: https://blog.csdn.net/gitblog_00002/article/details/139540185
Goblero:一个简单、嵌入式的Go持久化任务队列
项目介绍
Goblero 是一个用纯Go语言编写的简单、嵌入式、持久化的任务队列库。它基于 BadgerDB 作为存储引擎,能够在应用程序重启或崩溃后继续处理未完成的任务。Goblero的设计目标是提供一个轻量级、易于集成的任务队列解决方案,适用于需要本地持久化任务处理的应用场景。
项目技术分析
技术栈
- Go语言:Goblero完全使用Go语言编写,不依赖CGO,确保了跨平台的兼容性和编译的便捷性。
- BadgerDB:作为底层存储引擎,BadgerDB提供了高性能的键值存储,适合用于任务队列的持久化需求。
- 嵌入式设计:Goblero的设计理念是嵌入式,这意味着它可以轻松集成到任何Go应用程序中,无需额外的服务依赖。
核心功能
- 持久化任务处理:任务的状态变化会在每次操作后持久化到磁盘,确保在应用程序重启或崩溃后能够继续处理未完成的任务。
- 多处理器支持:支持多个处理器(worker)同时工作,每个处理器一次处理一个任务,处理完成后继续获取新任务。
- 简单API:Goblero提供了简洁的API,易于上手和集成。
项目及技术应用场景
Goblero适用于以下场景:
- 后台任务处理:适用于需要异步处理任务的应用程序,如邮件发送、数据处理、定时任务等。
- 嵌入式系统:由于其嵌入式设计和轻量级特性,Goblero非常适合嵌入式系统中的任务队列需求。
- 本地持久化任务队列:对于需要在本地持久化任务状态的应用程序,Goblero提供了一个简单且可靠的解决方案。
项目特点
- 纯Go实现:完全使用Go语言编写,不依赖CGO,确保了跨平台的兼容性和编译的便捷性。
- 简单易用:Goblero提供了简洁的API,易于集成和使用。
- 持久化支持:任务状态持久化到磁盘,确保在应用程序重启或崩溃后能够继续处理未完成的任务。
- 高性能:基于BadgerDB的高性能存储引擎,Goblero能够在高负载下保持良好的性能。
- 开源社区支持:Goblero是一个开源项目,欢迎社区贡献和反馈,共同推动项目的发展。
总结
Goblero是一个简单、嵌入式的Go持久化任务队列库,适用于需要本地持久化任务处理的应用场景。其纯Go实现、简单易用的API、持久化支持和高性能特性,使其成为一个值得尝试的任务队列解决方案。虽然目前仍处于Alpha阶段,但Goblero已经展示了其潜力和价值,未来有望成为Go开发者处理任务队列的首选工具之一。
如果你正在寻找一个轻量级、易于集成的任务队列解决方案,不妨试试Goblero,它可能会成为你项目中的得力助手。