概要
go-swagger + redismq を試してみました
イメージとしてはある API をコールしたらバックエンドの redis のキューに値を入れる感じです
go-swagger のアプリケーションは前回 までに作成している TODO アプリを使っています
環境
- CentOS 6.7 64bit
- go-swagger dev
- golang 1.8
- redis-server 3.0.2
go 1.8 のインストール
- cd /tmp
- wget “https://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz”
- tar -C /usr/local -xzf go1.8.linux-amd64.tar.gz
- go version
go version go1.8 linux/amd64
インストール
- go get “github.com/adjust/redismq”
コーディング
- cd $GOPATH/src/github.com/hawksnowlog/todo-list
- vim restapi/configure_todo_list.go
import "github.com/adjust/redismq"
var testQueue = redismq.CreateQueue("localhost", "6379", "", 9, "clicks")
api.TodosAddOneHandler = todos.AddOneHandlerFunc(func(params todos.AddOneParams) middleware.Responder {
fmt.Println("TodosAddOneHandler")
if err := addItem(params.Body); err != nil {
return todos.NewAddOneDefault(500).WithPayload(&models.Error{Code: 500, Message: swag.String(err.Error())})
}
testQueue.Put("testpayload") // -> ここを追記
return todos.NewAddOneCreated().WithPayload(params.Body)
})
という感じです
やっている処理はヒジョに簡単です
ビルド
- go fmt restapi/configure_todo_list.go
- go install ./cmd/todo-list-server/
- todo-list-server –host=0.0.0.0 –port=18080
動作確認
まずはリクエストを送ります
curl -XPOST -H "Content-Type: application/io.goswagger.examples.todo-list.v1+json" "http://127.0.0.1:18080/v1/" -d '{"description":"test", "completed":false}'
今回は redis-cli で確認します
DB は 9 を選択しているので SELECT コマンドで切り替えてから操作します
redis-cli するときに -n 9
でも OK です
- redis-cli
- redis> SELECT 9
- redis> keys *
1) "redismq::clicks::failed::size::1487755650"
2) "redismq::clicks"
3) "redismq::clicks::size::1487755650"
4) "redismq::clicks::rate::1487755084"
で、こんな key が入っていれば OK です
それぞれタイプは上から string, list, string, string なのでデータにアクセスする場合は
- redis> GET redismq::clicks::failed::size::1487755650
- redis> LRANGE redismq::clicks 0 -1 LRANGE redismq::clicks 0 -1
- redis> GET redismq::clicks::size::1487755650
- redis> GET redismq::clicks::rate::1487755084
になります
実際に送信したペイロード情報は redismq::clicks に入っています
Consumer を作成してみる
- vim consumer.go
package main
import (
"fmt"
"github.com/adjust/redismq"
)
func main() {
testQueue := redismq.CreateQueue("localhost", "6379", "", 9, "clicks")
consumer, err := testQueue.AddConsumer("testconsumer")
if err != nil {
panic(err)
}
for {
p, err := consumer.Get()
if err != nil {
fmt.Println(err)
continue
}
//fmt.Println(p.CreatedAt)
fmt.Println(p)
err = p.Ack()
if err != nil {
fmt.Println(err)
}
}
}
- go run consumer.go
で待ち状態になるので、これで curl を実行してみると値が表示されるのが確認できると思います
最後に
go-swagger で redismq というライブラリを試してみました
所謂 Message Queue なので Producker と Consumer が登場します
また、pubsub モデルっぽいですが内部では redis の PUBLISH と SUBSCRIBE を使っているわけではないです
https://redis.io/topics/pubsub
内部では紹介したとおり list を使っていてかつ list にあるメタ情報を別の key で管理している感じです
list には ttl がないですが各 key には ttl があるので勝手に消えますが、ttl が過ぎるまで key が大量に増えるのは少し嫌かもしれません
デフォルトだと 7200 秒 (2時間) で設定されているようです
0 件のコメント:
コメントを投稿