這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
NSQ的golang用戶端簡單使用
NSQ 是由國外的一個短鏈服務商bitly使用golang開發的一個訊息佇列系統,正好使用到了這個東西,在這裡簡單的記錄下。
擷取用戶端
nsq的golang用戶端是官方版本的
go get github.com/nsqio/go-nsq
即可
簡單的消費者和生產者使用
該用戶端有原始的command函數用於一些基礎操作,也有consumer和producer的封裝,我這裡是直接使用了封裝了。
消費者比較簡單,只要監聽隊列訊息,並處理就可以了,下面是一個簡單的例子。
type NSQHandler struct {}func (this *NSQHandler) HandleMessage(message *nsq.Message) error { log.Println("recv:", string(message.Body)) return nil}func testNSQ() { waiter := sync.WaitGroup{} waiter.Add(1) go func() { defer waiter.Done() consumer, err := nsq.NewConsumer("test", "ch1", nsq.NewConfig()) if nil != err { log.Println(err) return } consumer.AddHandler(&NSQHandler{}) err = consumer.ConnectToNSQD("10.100.156.207:4150") if nil != err { log.Println(err) return } select {} }() waiter.Wait()}
建立好consumer後,只需要自己建立一個struct並實現HandleMessage方法即可,當有訊息時候,再去處理訊息。
需要注意的是,AddHandler的回調是在別的routine中執行的,並且可以添加多個handler用於處理訊息,這裡可能需要注意下線程的同步問題。
生產者也和消費者差不多,首先需要建立一個producer
func (this *MsgQueue) Init(addr string) error { var err error this.addr = addr // try to connect cfg := nsq.NewConfig() this.producer, err = nsq.NewProducer(addr, cfg) if nil != err { return err } // try to ping err = this.producer.Ping() if nil != err { this.producer.Stop() this.producer = nil return err } return nil}
producer封裝了較多的方法,分為同步和非同步兩種。帶Async尾碼的,都是非同步。
同步是收到了nsq的回應後再返回的函數,所以可能會堵塞,而非同步操作,則調用方需要傳入一個chan用於接收結果,當有結果返回或者是逾時的情況下,相應的內容會寫到該chan中。
在這裡我用了同步的api,畢竟訊息佇列假如出了什麼問題,那麼整個服務就不可用了,而且同步改非同步也不會太麻煩,以後可以做下修改。
publish的方法也很簡單,提供一個topic和資料就行了。