ResqueをGoで利用したかったので調べた。幾つか参考になるサイトがあったが補足が必要だったので併せて記述する
参考にしたサイト
はじめに
GoでResqueを扱うのにgoworkerがあるが、これはworkerの実装に特化していてenqueueする機能がない。そのため、GoでEnqueueする方法として、go-resque packageを利用する。
参考にしたサイトで詰まったのはqueueのnamespaceで、そこら辺について補足する形でまとめる
設定
redis
- hostはlocalhost
- ポートは6379
queueのnamespace(ここの指定が微妙に異なる)
- redis:queue:{namespace}
Enqueue
go-resqueこちらを参考に
package main
import (
"github.com/kavu/go-resque" // Import this package
_ "github.com/kavu/go-resque/godis" // Use godis driver
"github.com/simonz05/godis/redis" // Import godis package
)
func main() {
client := redis.New("tcp:127.0.0.1:6379", 0, "") // Godis redis client
enqueuer := resque.NewRedisEnqueuer("godis", client)
enqueuer.Enqueue("resque:queue:default", "MyClass", 1, 2, "woot")
}
Queueに入れる
go run enqueue.go
を実行すると Redisのresque:queue:default
に追加される
Dequeue
package main
import (
"fmt"
"github.com/benmanns/goworker"
)
func myFunc(queue string, args ...interface{}) error {
fmt.Printf("From %s, %v\n", queue, args)
return nil
}
func init() {
goworker.Register("MyClass", myFunc)
}
func main() {
if err := goworker.Work(); err != nil {
fmt.Println("Error:", err)
}
}
Queueから取り出す
go run dequeue.go -queues=default -concurrency=1
concurrencyは任意で変更したら良い。queueのnamespaceはenqueue時と異なり実行時の引数で設定することでflagによって処理される。
ハマりポイント
resqueのnamespaceはresque:queue:
が先頭につくが、enqueueのpackageはデフォルトで設定されないのでこの辺ミスるとハマる。というかハマった。
まとめ
enqueueとdequeueでpackageが異なるのでnamespaceに気をつけましょう。