goworker (Go-based background worker)

Table of Contents

1. Goworker 简介

goworker 是一个 Resque (Ruby 实现的后台任务)兼容的, 基于 Go 语言的后台任务,号称比 Ruby 版本有 10 到 100000 倍的性能提升。

使用 goworker 可以实现简单发布——订阅的工作模式,一个程序往 redis 写消息,另一个程序从 redis 中读出消息进行处理。

2. Goworker 实例

下面是一个简单的例子:

package main

import (
	"fmt"
	"github.com/benmanns/goworker"
)

func init() {
	goworker.Register("Hello", helloWorker)
	//                    ^
	//                    |
	//          如果队列中数据的class为Hello,则调用helloWorker函数
}

func helloWorker(queue string, args ...interface{}) error {
	fmt.Printf("Hello, world! From queue %s, %v\n", queue, args)
	return nil
}

func main() {
	if err := goworker.Work(); err != nil {
		fmt.Println("Error:", err)
	}
}

测试过程如下。

第一步、启动 redis 服务器。

第二步、编译运行上面程序:

$ go build -o goworker_example goworker_example.go
$ ./goworker_example -queues=hello     # 会一直等待,不会退出

第三步、打开另一终端,使用 redis-cli 往 redis 中插入两条相同数据,指定 class 为"Hello"

$ redis-cli -r 2 RPUSH resque:queue:hello '{"class":"Hello","args":["hi","there"]}'

可以看到在运行程序 goworker_example 所在终端中会显示下面输出:

Hello, world! From queue hello, [hi there]
Hello, world! From queue hello, [hi there]

Author: cig01

Created: <2018-11-03 Sat>

Last updated: <2019-06-09 Sun>

Creator: Emacs 27.1 (Org mode 9.4)