还有一个特别值的说的就是部署非常简单
Tagged Tags:

  到了这一步就足以写代码发送和接受消息了。但是还应该有多少个管理种类供给运维一下。nsqadmin 

  》两台服务器:192.168.0.49; 192.168.0.105.

 

  图片 1

  准备干活:

  图片 2

 客户端golang代码

  

 

   用浏览器看一下处理端: 
和 192.168.0.49。其余的你可以点开看看。

 

 

  运营一下,会运维多少个终端:

  

docker run --name nsqadmin -p 4171:4171 nsqio/nsq /nsqadmin --lookupd-http-address=192.168.0.105:4161

 

  nsq官网: 

 

 

  用大家的出殡代码发送新闻,再看我们的客户端

还有一个特别值的说的就是部署非常简单。 图片 3

还有一个特别值的说的就是部署非常简单。 

class Program
    {
        static void Main()
        {
            // Create a new Consumer for each topic/channel
            var consumerCount = 2;
            var listC = new  List<Consumer>();
            for (var i = 0; i < consumerCount; i++)
            {
                var consumer = new Consumer("publishtest", $"channel{i}" );
                consumer.ChangeMaxInFlight(2500);
                consumer.AddHandler(new MessageHandler());
                consumer.ConnectToNsqLookupd("192.168.0.105:4161");
                listC.Add(consumer);
            }


            var exitEvent = new ManualResetEvent(false);

            Console.CancelKeyPress += (sender, eventArgs) => {
                eventArgs.Cancel = true;
                listC.ForEach(x => x.Stop());
                exitEvent.Set();
            };

            exitEvent.WaitOne();


        }
    }

    public class MessageHandler : IHandler
    {
        /// <summary>Handles a message.</summary>
        public void HandleMessage(IMessage message)
        {
            string msg = Encoding.UTF8.GetString(message.Body);
            Console.WriteLine(msg);
        }

        /// <summary>
        /// Called when a message has exceeded the specified <see cref="Config.MaxAttempts"/>.
        /// </summary>
        /// <param name="message">The failed message.</param>
        public void LogFailedMessage(IMessage message)
        {
            // Log failed messages
        }
    }

图片 4

docker run --name lookupd -p 4160:4160 -p 4161:4161 nsqio/nsq /nsqlookupd

图片 5

还有一个特别值的说的就是部署非常简单。  计划完后本人会用go和c#还有一个特别值的说的就是部署非常简单。写一些代码方便我们学习。

还有一个特别值的说的就是部署非常简单。  publishtest被ip105和49都发送过。不过还尚无channel:

图片 6

  能够品味给49和105都发送三遍试跳。再看一下咱们的管制页面:

还有一个特别值的说的就是部署非常简单。  轻便客户端代码为:

图片 7

  》必要在两台机械上设置好Docker

docker pull nsqio/nsq

 

func main() {
    config := nsq.NewConfig()
    // 随便给哪个ip发都可以
    //w1, _ := nsq.NewProducer("192.168.0.105:4150", config)
    w1, _ := nsq.NewProducer("192.168.0.49:4150", config)

    err1 := w1.Ping()
    if err1 != nil {
        log.Fatal("should not be able to ping after Stop()")
        return
    }
    defer w1.Stop()
    topicName := "publishtest"
    msgCount := 2
    for i := 1; i < msgCount; i++ {
        err1 := w1.Publish(topicName, []byte("测试测试publis test case"))
        if err1 != nil {
            log.Fatal("error")
        }
    }
}

  小编用go语言 轻便写一个发送消息的例证:

  用一了段时光NSQ依然很平静的。除了安居,还大概有一个特别值的说的就是布局特别简单。总想写点什么推荐给大家利用nsq来做一些事物。可是正是因为他太轻易易用,文书档案也比较轻便易懂。一直不知情要写什么!!!!!

package main

import (
    "fmt"
    "github.com/nsqio/go-nsq"
    "log"
    "os"
    "os/signal"
    "strconv"
    "time"
    "sync"
)

func main() {

    topicName := "publishtest"
    msgCount := 2
    for i := 0; i < msgCount; i++ {
        //time.Sleep(time.Millisecond * 20)
        go readMessage(topicName, i)
    }

    //cleanup := make(chan os.Signal, 1)
    cleanup := make(chan os.Signal)
    signal.Notify(cleanup, os.Interrupt)
    fmt.Println("server is running....")

    quit := make(chan bool)
    go func() {

        select {
            case <- cleanup:
                fmt.Println("Received an interrupt , stoping service ...")
                for _, ele := range consumers {
                    ele.StopChan <- 1
                    ele.Stop()
                }
                quit <- true
        }
    }()
    <-quit
    fmt.Println("Shutdown server....")
}

type ConsumerHandle struct {
    q       *nsq.Consumer
    msgGood int
}

var consumers []*nsq.Consumer = make([]*nsq.Consumer, 0)
var mux *sync.Mutex = &sync.Mutex{}

func (h *ConsumerHandle) HandleMessage(message *nsq.Message) error {
    msg := string(message.Body) + "  " + strconv.Itoa(h.msgGood)
    fmt.Println(msg)

    return nil
}

func readMessage(topicName string, msgCount int) {

    defer func() {
        if err := recover(); err != nil {
            fmt.Println("error: ", err)
        }
    }()

    config := nsq.NewConfig()
    config.MaxInFlight = 1000
    config.MaxBackoffDuration = 500 * time.Second

    //q, _ := nsq.NewConsumer(topicName, "ch" + strconv.Itoa(msgCount), config)
    //q, _ := nsq.NewConsumer(topicName, "ch" + strconv.Itoa(msgCount) + "#ephemeral", config)
    q, _ := nsq.NewConsumer(topicName, "ch"+strconv.Itoa(msgCount), config)

    h := &ConsumerHandle{q: q, msgGood: msgCount}
    q.AddHandler(h)

    err := q.ConnectToNSQLookupd("192.168.0.105:4161")
    //err := q.ConnectToNSQDs([]string{"192.168.0.105:4161"})
    //err := q.ConnectToNSQD("192.168.0.49:4150")
    //err := q.ConnectToNSQD("192.168.0.105:4415")
    if err != nil {
        fmt.Println("conect nsqd error")
        log.Println(err)
    }
    mux.Lock()
    consumers = append(consumers, q)
    mux.Unlock()
    <-q.StopChan
    fmt.Println("end....")
}

 

  大家在105上运转lookup, nsqd和客户端都亟需一而再这一个lookup。  

 

图片 8

docker run --name nsqd -p 4150:4150 -p 4151:4151     nsqio/nsq /nsqd     --broadcast-address=192.168.0.105     --lookupd-tcp-address=192.168.0.105:4160

docker run --name nsqd -p 4150:4150 -p 4151:4151     nsqio/nsq /nsqd     --broadcast-address=192.168.0.49     --lookupd-tcp-address=192.168.0.105:4160

  

  在105和49上运维nsqd, lookup的地方要写105

  go使用的库是 go-nsq 地址
 : github.com/nsqio/go-nsq

 

  》两台机械上镜像的拉取 

  为了容灾须要对nsqd多机器部属,有了Docker后,快捷扩依旧很有益于的。

  c# 使用的库为NsqSharp.Core 地址为:

发表评论

电子邮件地址不会被公开。 必填项已用*标注