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の実行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
ドッキングウィンドウの実行--name nsqadmin -p 4171:4171 nsqio / NSQ / nsqadmin --lookupd-HTTP-アドレス= 192.168。0.105:4161
ます。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 } }