nsq学习使用

介绍

NSQ 是实时的分布式消息处理平台,其设计的目的是用来大规模地处理每天数以十亿计级别的消息。

NSQ 具有分布式和去中心化拓扑结构,该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征。

组件介绍

nsqd:一个负责接收、排队、转发消息到客户端的守护进程
nsqlookupd:管理拓扑信息并提供最终一致性的发现服务的守护进程(运行时发现消费者找到生产者服务)
nsqadmin:一套Web用户界面,可实时查看集群的统计数据和执行各种各样的管理任务
utilities:常见基础功能、数据流处理工具,如nsq_stat、nsq_tail、nsq_to_file、nsq_to_http、nsq_to_nsq、to_nsq

使用

消费者:consumer

import (
    "fmt"
    "time"

    "github.com/nsqio/go-nsq"
)

// 消费者
type ConsumerT struct{}

// 主函数
func main() {
    InitConsumer("test", "test-channel", "10.7.15.178:4161")
    for {
        time.Sleep(time.Second * 10)
    }
}

//处理消息
func (*ConsumerT) HandleMessage(msg *nsq.Message) error {
    fmt.Println("receive", msg.NSQDAddress, "message:", string(msg.Body))
    return nil
}

//初始化消费者
func InitConsumer(topic string, channel string, address string) {
    cfg := nsq.NewConfig()
    cfg.LookupdPollInterval = time.Second          //设置重连时间
    c, err := nsq.NewConsumer(topic, channel, cfg) // 新建一个消费者
    if err != nil {
        panic(err)
    }
    c.SetLogger(nil, 0)        //屏蔽系统日志
    c.AddHandler(&ConsumerT{}) // 添加消费者接口

    //建立NSQLookupd连接
    if err := c.ConnectToNSQLookupd(address); err != nil {
        panic(err)
    }
    fmt.Println(c.Stats().Connections)

    //建立多个nsqd连接
    // if err := c.ConnectToNSQDs([]string{"127.0.0.1:4150", "127.0.0.1:4152"}); err != nil {
    //  panic(err)
    // }

    //建立一个nsqd连接
    //if err := c.ConnectToNSQD("10.7.15.178:4150"); err != nil {
    // panic(err)
    //}
    //fmt.Println(c.Stats().Connections)
}

生产者producer

import (
    "bufio"
    "fmt"
    "github.com/nsqio/go-nsq"
    "os"
)

var producer *nsq.Producer

// 主函数
func main() {
    strIP1 := "10.7.15.178:4150"
    InitProducer(strIP1)
    fmt.Println(producer.String())

    running := true

    //读取控制台输入
    reader := bufio.NewReader(os.Stdin)
    for running {
        data, _, _ := reader.ReadLine()
        command := string(data)
        if command == "stop" {
            running = false
        }

        for err := Publish("test", command); err != nil; {
            fmt.Println("err",err)
            //切换IP重连
            InitProducer(strIP1)
            Publish("test", command)
        }
    }
}

// 初始化生产者
func InitProducer(str string) {
    var err error
    fmt.Println("address: ", str)
    producer, err = nsq.NewProducer(str, nsq.NewConfig())
    if err != nil {
        panic(err)
    }
}

//发布消息
func Publish(topic string, message string) error {
    var err error
    if producer != nil {
        if message == "" { //不能发布空串,否则会导致error
            return nil
        }
        err = producer.Publish(topic, []byte(message)) // 发布消息
        return err
    }
    return fmt.Errorf("producer is nil", err)
}

猜你喜欢

转载自blog.csdn.net/niyuelin1990/article/details/80313284
nsq
今日推荐