고정 표시기 NSQ 클러스터에 종속

  NSQ와 기간은 여전히 ​​매우 안정적이다. 안정성뿐만 아니라, 특별한 값이 배포 매우 간단이됩니다 말합니다. 항상 뭔가를 NSQ 사용하는 모든 사람에게 추천 뭔가를 쓰고 싶다. 그러나 그가 사용하기에 너무 간단하기 때문에 문서가 비교적 간단하다. 뭐라고 써야할지 모르겠 더라구! ! ! ! !

  NSQ 공식 웹 사이트 :  http://nsq.io/

  

  재해 복구를위한 당신은 부두 노동자가 있으면, 급속한 확장은 여전히 ​​매우 편리합니다, nsqd하기 위해 여러 시스템의 부하 직원을 필요로한다.

  배포 후 나는 학습을 촉진하고 C #을 함께 갈 코드를 작성합니다.

 

  준비 :

  "2 개 서버 : 192.168.0.49; 192.168.0.105.

  "우리는이 기계 도커에 설치해야

  "미러는이 기계를 당겨 

고정 표시기 당겨 nsqio / NSQ

  우리는 (105), nsqd에서 검색을 시작하고 클라이언트가 조회를 연결해야합니다.  

고정 표시기 --name가 -p lookupd는 실행 4160 : 4160 -p 4161 : 4161 nsqio / NSQ / nsqlookupd을

  

  쓰기 주소, 조회를 nsqd 시작 (105), 49 (105)

고정 표시기 --name가 -p nsqd 실행 4150 : 4150 -p 4151 : 4151      nsqio / NSQ / nsqd --broadcast 주소 = 192.168 . 0.105      --lookupd-TCP 어드레스 = 192.168 . 0.105 : 4160
고정 표시기 --name가 -p nsqd 실행 4150 : 4150 -p 4151 : 4151      nsqio / NSQ / nsqd --broadcast 주소 = 192.168 . 0.49      --lookupd-TCP 어드레스 = 192.168 . 0.105 : 4160

 

 

 

  이 단계에서 당신은 전송하고 정보를 수신하는 코드를 작성할 수 있습니다. 그러나 관리 시스템이 클릭을 시작 할 필요가있다. nsqadmin 

고정 표시기 -p --name nsqadmin을 실행 4171 : 4171 = nsqio / NSQ / nsqadmin --lookupd-HTTP 주소 192.168 . 0.105 : 4161

 

   HTTP : //192.168.0.105 : 4171 / 노드 브라우저의 관리 끝 봐. 두 개의 노드가 열려 노드 레이블을 찾을 수 있습니다. 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