上篇文章简单介绍了nsq writer部分的使用:http://guotie.sinaapp.com/?p=533 ,本文介绍一下reader的使用。
与writer类似,nsq提供了一个高层接口:reader。不过,reader部分还需要提供一个Handler,用来处理收到的消息。
nsq reader的Handler是一个接口,定义如下:
type Handler interface { HandleMessage(message *Message) error }
我们所做的主要就是实现这个接口。
reader的基本步骤如下:
1、新建一个nsq reader;
NewReader的定义如下:
func NewReader(topic string, channel string) (*Reader, error)
topic是nsqd的topic,channel可以理解为这个reader的名称。一个topic可以有多个reader同时去读,每个reader都是一个channel。
2、使用AddHandler将具体处理消息的Handler加入到reader;
除了AddHandler函数外,还有AddSyncHandler,增加一个异步处理消息的函数到reader,详细信息可以参考文档。
3、reader连接Nsqd;搞定!
当reader连接到Nsqd后,go-nsq收到消息后,会调用我们的Handler处理消息。
package nsqexample import ( "github.com/bitly/go-nsq" "fmt" ) var _ = fmt.Printf var ( rd *nsq.Reader ) type ClickHandler struct { nsqaddr string } func NsqClick(nsqaddr string) { rd, err := nsq.NewReader("clicks", "ch1") if err != nil { panic(err.Error()) } click := ClickHandler{nsqaddr: nsqaddr} rd.AddHandler(&click) err = rd.ConnectToNSQ(click.nsqaddr) if err != nil { panic(err.Error()) } } func (c *ClickHandler) HandleMessage(msg *nsq.Message) error { // 处理消息代码 fmt.Println(string(msg.Body)) return nil }
go-nsq的官方文档:http://godoc.org/github.com/bitly/go-nsq#Reader