LoginSignup
8
9

More than 5 years have passed since last update.

GoでResqueを利用する

Last updated at Posted at 2015-02-22

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に気をつけましょう。

8
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9