用一了段时间NSQ还是很稳定的。除了稳定,还有一个特别值的说的就是部署非常简单。总想写点什么推荐给大家使用nsq来做一些东西。但是就是因为他太简单易用,文档也比较简单易懂。一直不知道要写啥!!!!!

  nsq官网: http://nsq.io/

  

  为了容灾需要对nsqd多机器部属,有了Docker后,快速扩还是很方便的。

  部署完后我会用go和c#写一些代码方便大家学习。

  准备工作:

  》两台服务器:192.168.0.49; 192.168.0.105.

  》需要在两台机器上安装好Docker

  》两台机器上镜像的拉取

docker pull nsqio/nsq

  我们在105上启动lookup, nsqd和客户端都需要连接这个lookup。  

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

  

  在105和49上启动nsqd, lookup的地址要写105

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

  到了这一步就可以写代码发送和接收信息了。但是还有一个管理系统需要启动一下。nsqadmin

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

  用浏览器看一下管理端:http://192.168.0.105:4171/nodes。找开Nodes标签里面有两个节点。192.168.0.105  和 192.168.0.49。其他的你可以点开看看。

  我用go语言 简单写一个发送信息的例子:

  go使用的库是 go-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 :=
for i := ; 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 :=
for i := ; 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 <-
ele.Stop()
}
quit <- true
}
}()
<-quit
fmt.Println("Shutdown server....")
} type ConsumerHandle struct {
q *nsq.Consumer
msgGood int
} var consumers []*nsq.Consumer = make([]*nsq.Consumer, )
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 =
config.MaxBackoffDuration = * 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 = ;
var listC = new List<Consumer>();
for (var i = ; i < consumerCount; i++)
{
var consumer = new Consumer("publishtest", $"channel{i}" );
consumer.ChangeMaxInFlight();
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
}
}

Docker部属Nsq集群的更多相关文章

  1. Docker部署Hadoop集群

    Docker部署Hadoop集群 2016-09-27 杜亦舒 前几天写了文章"Hadoop 集群搭建"之后,一个朋友留言说希望介绍下如何使用Docker部署,这个建议很好,Doc ...

  2. docker安装hadoop集群

    docker安装hadoop集群?图啥呢?不图啥,就是图好玩.本篇博客主要是来教大家如何搭建一个docker的hadoop集群.不要问 为什么我要做这么无聊的事情,答案你也许知道,因为没有女票.... ...

  3. Docker 搭建 etcd 集群

    阅读目录: 主机安装 集群搭建 API 操作 API 说明和 etcdctl 命令说明 etcd 是 CoreOS 团队发起的一个开源项目(Go 语言,其实很多这类项目都是 Go 语言实现的,只能说很 ...

  4. Docker部署Elasticsearch集群

    http://blog.sina.com.cn/s/blog_8ea8e9d50102wwik.html Docker部署Elasticsearch集群 参考文档: https://hub.docke ...

  5. docker~swarm搭建docker高可用集群

    回到目录 Swarm概念 Swarm是Docker公司推出的用来管理docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机.Swarm使用标准的Docker API接口作为其前端访问入 ...

  6. Docker 构建 RabbitMQ 集群

    刚开始,关于RabbitMQ集群的搭建,我找到了这篇文章:Docker 安装 RabbitMQ 集群 从而找到了第三方的RabbitMQ集群容器 rabbitmq-server 但是这个容器只有3.6 ...

  7. Docker Swarm redis 集群搭建

    Docker Swarm redis 集群搭建 环境1: 系统:Linux Centos 7.4 x64 内核:Linux docker 3.10.0-693.2.2.el7.x86_64 Docke ...

  8. Docker搭建PXC集群

    如何创建MySQL的PXC集群 下载PXC集群镜像文件 下载 docker pull percona/percona-xtradb-cluster 重命名 [root@hongshaorou ~]# ...

  9. 基于Docker的redis集群搭建

    Redis集群官方介绍:http://www.redis.cn/topics/cluster-tutorial.html 基于Docker搭建Redis集群 环境:6个节点,三主三从 制作Redis镜 ...

随机推荐

  1. 201521123051《Java程序设计》第九周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. ·所有的异常类是从 java.lang.Exception 类继承的子类. ·Exception 类是 Throwa ...

  2. 201521123099 《Java程序设计》第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1. ...

  3. Markdow使用的简单介绍

    一个例子: 例子开始 1. 本章学习总结 (字体较大,用法:#你要放大的标题) 今天主要学习了三个知识点 封装 继承 多态 用法: - 封装 - 继承 - 多态 2. 书面作业 Q1. java He ...

  4. 你不知道的JavaScript——类型

    一.ECMAScript语言中所有的值均有一个对应的语言类型.ECMAScript语言类型包括Undefined.Null.Boolean.String.Number和Object. 我们这样来定义类 ...

  5. 第一部分----HTML的基本结构与基本标签

    PART-1  HTML的基本结构以及Header的部分 一.什么是HTML? HTML是超文本标签语言,即网页的源码.而浏览器就是翻译解释HTML源码的工具. 二.HTML文档的结构: 三.详细注释 ...

  6. Hyperledger Fabric 1.0 从零开始(三)——环境构建(内网/准离线)

    有公网环境的服务器可以直接看 Hyperledger Fabric 1.0 从零开始(二)--环境构建(公网) ,本篇内容与上篇相似,只不过环境搭建需要在内网下,也就是网络被限制的情况下. 1:环境构 ...

  7. 分布式一致性算法Raft

    什么是分布式一致性? 我们先来看一个例子: 我们有一个单节点node,这个节点可以是数据库,也可以是一台服务器,当client向node发送data时,X节点收到data,记录下来 由此可见对于单个节 ...

  8. ThreadLocal原理及使用示例

    简介:本文已一个简要的代码示例介绍ThreadLocal类的基本使用方式,在此基础上结合图片阐述它的内部工作原理. 欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblog ...

  9. Servlet第一篇【介绍Servlet、HTTP协议、WEB目录结构、编写入门Servlet程序、Servlet生命周期】

    什么是Serlvet? Servlet其实就是一个遵循Servlet开发的java类.Serlvet是由服务器调用的,运行在服务器端. 为什么要用到Serlvet? 我们编写java程序想要在网上实现 ...

  10. Nexus5/6刷 lineageos 过程

    如题,好久没刷机,体验下lineageos 由于之前Xposed官方一直没支持7.x,就没更新 测试三方Xposed正常使用,记录下过程供参考 注意,刷机有风险,刷机前备份,可以使用钛备份 0x01: ...