2017年2月26日日曜日

go-swagger + redismq を試してみた

概要

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 のインストール

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 件のコメント:

コメントを投稿