nsq简介
特点
- 消息默认不做持久化,但是可以配置
- 每条消息最少传递一次
- 消息不能保证有序
nsq组件
- nsqd:负责消息接收、保存以及发送消息给消费者的进程
- nsqlookupd :负责维护所有nsqd的状态,提供服务发现的进程
- nsqadmin:web管理平台,实时监控集群以及执行各种管理任务
nsq相关概念
- Topic:对应一个具体的队列
- Channel:一个消费者对应一个Channel(消息可重复消费)
·
nsq架构
环境搭建
暂时还没有搭建hhhh
使用
- 导入相关包
github.com/nsqio/go-nsq
- 生产者
package main import ( "bufio" "fmt" "os" "strings" "github.com/nsqio/go-nsq" ) var producer *nsq.Producer func main() { //nsq的地址 nsqAddress := "127.0.0.1:4150" err := initProducer(nsqAddress) if err != nil { fmt.Printf("init producer failed, err:%v\n", err) return } //读取控制台输入 reader := bufio.NewReader(os.Stdin) for { data, err := reader.ReadString('\n') if err != nil { fmt.Printf("read string failed, err:%v\n", err) continue } data = strings.TrimSpace(data) if data == "stop" { break } err = producer.Publish("order_queue", []byte(data)) if err != nil { fmt.Printf("publish message failed, err:%v\n", err) continue } fmt.Printf("publish data:%s succ\n", data) } } // 初始化生产者 func initProducer(str string) error { var err error config := nsq.NewConfig() producer, err = nsq.NewProducer(str, config) if err != nil { return err } return nil }
- 消费者
package main import ( "fmt" "os" "syscall" "time" "os/signal" "github.com/nsqio/go-nsq" ) // 消费者 type Consumer struct { } //处理消息 func (*Consumer) HandleMessage(msg *nsq.Message) error { fmt.Println("receive", msg.NSQDAddress, "message:", string(msg.Body)) return nil } func main() { err := initConsumer("order_queue", "first", "127.0.0.1:4161") if err != nil { fmt.Printf("init consumer failed, err:%v\n", err) return } c := make(chan os.Signal) signal.Notify(c, syscall.SIGINT) <-c } //初始化消费者 func initConsumer(topic string, channel string, address string) error { cfg := nsq.NewConfig() cfg.LookupdPollInterval = 15 * time.Second //设置服务发现的轮询时间 c, err := nsq.NewConsumer(topic, channel, cfg) // 新建一个消费者 if err != nil { return err } consumer := &Consumer{} c.AddHandler(consumer) // 添加消费者接口 //建立NSQLookupd连接 if err := c.ConnectToNSQLookupd(address); err != nil { return err } return nil }