ドッカーの部下NSQクラスタ

  NSQと一定の期間はまだ非常に安定しています。安定性に加えて、特別な値が展開するのは非常に簡単ですがあると言います。常に何かをNSQ使用するすべての人にお勧めするために何かを書きたかったです。しかし、それは彼が使用するには余りにも簡単ですので、文書は比較的簡単です。私が書くことかわかりませんでした!

  NSQ公式サイト:  http://nsq.io/

  

  災害復旧のためにあなたがドッカーを持っていたら、急速な拡大はまだ非常に便利です、nsqdするために複数のマシンの部下が必要です。

  展開後、私は学習を促進するとC#で行くことにいくつかのコードを記述します。

 

  準備:

  「2台のサーバー:192.168.0.49; 192.168.0.105。

  「我々は2台のマシンドッカーにインストールする必要があります

  「ミラーは二つのマシンを引きます 

ドッキングウィンドウプルnsqio / NSQ

  我々はnsqd、105で検索を開始し、クライアントは、ルックアップを接続する必要があります。  

ドッキングウィンドウは、-p --name lookupdの実行41604160 -p 41614161 nsqio / NSQ / nsqlookupd

  

  書き込みアドレスで、検索を開始しnsqd 105と49 105

ドッキングウィンドウは、--nameは-p nsqd実行41504150 -p 41514151      nsqio / NSQ / nsqd --broadcastアドレス= 192.1680.105      --lookupd-TCP-アドレス= 192.1680.1054160
ドッキングウィンドウは、--nameは-p nsqd実行41504150 -p 41514151      nsqio / NSQ / nsqd --broadcastアドレス= 192.1680.49      --lookupd-TCP-アドレス= 192.1680.1054160

 

 

 

  このステップで、あなたは情報を送受信するためのコードを書くことができます。しかし、管理システムは、クリックを開始する必要があります。nsqadmin 

ドッキングウィンドウの実行--name nsqadmin -p 41714171 nsqio / NSQ / nsqadmin --lookupd-HTTP-アドレス= 192.1680.1054161

 

   ます。http://192.168.0.105:4171 /ノードブラウザの経営終わりを見てください。2つのノードが存在し、オープンノードのラベルを検索します。192.168.0.105と192.168.0.49。他のあなたは見に開くように指すことができます。

  私は行くの言語でメッセージを送信する簡単な例を書きました:

  ゴーNSQアドレスを使用してライブラリを行く:  github.com/nsqio/go-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")
        }
    }
}

  可以尝试给49和105都发送一次试试。再看一下我们的管理页面:

  publishtest被ip105和49都发送过。但是还没有channel:

 

 客户端golang代码

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....")
}

 

 

 

  运行一下,会启动两个终端:

  用我们的发送代码发送信息,再看我们的客户端

  

 

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

  https://github.com/tonyredondo/NsqSharp

 

  简单客户端代码为:

 

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
        }
    }

 

おすすめ

転載: blog.csdn.net/mi_duo/article/details/83822508