nsq

NSQLookupd Main方法分析

送分小仙女□ 提交于 2019-12-01 09:50:21
上一篇 http://my.oschina.net/astute/blog/296955 已经分析了 nsqlookupd 启动时的命令行解析,最终构造了 NSQLookupd 结构体,这是一个很重要的结构体。 type NSQLookupd struct { options *nsqlookupdOptions // 命令行参数 tcpAddr *net.TCPAddr // tcp 端口 httpAddr *net.TCPAddr // http 端口 tcpListener net.Listener httpListener net.Listener waitGroup util.WaitGroupWrapper DB *RegistrationDB } 这篇文章分析下 daemon.Main() 执行过程 1、创建 context,内部只有一个指向NSQLookupd的指针 context := &Context{l} 2、创建 listener;Listen 方法支持面向流的监听,包括 unix domain stream socket。 tcpListener, err := net.Listen("tcp", l.tcpAddr.String()) 3、创建 tcpServer struct,内部只含有一个 context 指针,为什么需要对 NSQLookupd

NSQ系列之nsqlookupd代码分析三(详解tcpServer 中的IOLoop方法)

女生的网名这么多〃 提交于 2019-12-01 09:50:07
NSQ系列之nsqlookupd代码分析三(详解nsqlookupd tcpServer 中的IOLoop) 上一章我们大致了解了 nsqlookupd 中的 tcpServer 的大致的代码, tcpServer 与client也就 nsqd 之间协议处理在 IOLoop 这个方法中,今天我们就分析一下 IOLoop 这个方法 废话不多说,直接上代码吧(代码位于nsq/nsqlookupd/lookup_protocol_v1.go这个文件中) //这段代码位于nsq/nsqlookupd/client_v1.go这个文件中 type ClientV1 struct { net.Conn //组合net.Conn接口 peerInfo *PeerInfo //client的信息也就是前面所讲的product的信息 } //初始化一个ClientV1 func NewClientV1(conn net.Conn) *ClientV1 { return &ClientV1{ Conn: conn, } } //实现String接口 func (c *ClientV1) String() string { return c.RemoteAddr().String() } //定义ClientV1结束 type LookupProtocolV1 struct { ctx *Context

NSQ系列之nsqlookupd代码分析二(初识nsqlookupd tcpServer)

百般思念 提交于 2019-12-01 09:49:51
NSQ系列之nsqlookupd代码分析二(初识nsqlookupd tcpServer) 在上一章 nsqlookupd 初探中了解到, nsqlookupd 中开启了一个 tcpServer 和一个 httpServer ,那么今天我们来初步了解下 tcpServer 。 废话不多说,直接上代码吧,简单粗暴点比较好。 type tcpServer struct { ctx *Context //上一章中提到的Contexto } func (p *tcpServer) Handle(clientConn net.Conn) { p.ctx.nsqlookupd.logf("TCP: new client(%s)", clientConn.RemoteAddr()) // The client should initialize itself by sending a 4 byte sequence indicating // the version of the protocol that it intends to communicate, this will allow us // to gracefully upgrade the protocol away from text/line oriented to whatever... //这里有注释了,但是我英文不好

NSQ系列之nsqlookupd代码分析一(初探nsqlookup)

梦想与她 提交于 2019-12-01 09:49:40
NSQ系列之nsqlookupd代码分析一(初探nsqlookup) nsqlookupd 是守护进程负责管理拓扑信息。客户端通过查询 nsqlookupd 来发现指定话题( topic )的生产者,并且提供 nsqd 节点广播话题( topic )和通道( channel )信息。 nsqlookupd 有两个接口: TCP 接口, nsqd 用它来广播。 HTTP 接口,客户端用它来发现和管理。 本系列的代码分析均是基于nsq v0.3.5的代码进行的分析,如有不对之处欢迎大家指正指导。 nsqlookup struct分析 代码文件路径为 nsq/nsqlookupd/nsqlookupd.go type NSQLookupd struct { sync.RWMutex //读写锁 opts *Options //nsqlookupd 配置信息 定义文件路径为nsq/nsqlookupd/options.go tcpListener net.Listener httpListener net.Listener waitGroup util.WaitGroupWrapper //WaitGroup 典型应用 用于开启两个goroutine,一个监听HTTP 一个监听TCP DB *RegistrationDB //product 注册数据库 具体分析后面章节再讲 } /

nsqlookupd 入口文件分析

ぐ巨炮叔叔 提交于 2019-11-30 04:45:16
nsq 中 nsqlookupd 角色相对简单,适合作为分析 nsq 的入口 apps/nsqlookupd/nsqlookupd.go nsqlookupd 是一个独立的程序,所以放到 apps 目录下,依赖内部包 nsqlookupd, util,外部包: github.com/BurntSushi/toml # TOML是一种配置文件规范,此包是golang的解析包 github.com/mreiferson/go-options # 把命令行和配置文件参数注入到struct中的工具包,只有一个文件 关键代码解析 1、全局变量定义 go 中命令行参数成为 flag,flag 的集合成为 FlagSet,解析命令行参数之前需要先创建 FlagSet,定义每一个 flag,如下面的全局变量所示,同时提供了重要的默认值 var ( flagSet = flag.NewFlagSet("nsqlookupd", flag.ExitOnError) config = flagSet.String("config", "", "path to config file") /////////////// ) 2、命令行参数解析 flagSet.Parse(os.Args[1:]) os.Args 是所有的命令行参数;os.Args[0] 是执行程序的全路径名; flagSet.Parse

docker 部署 nsq

十年热恋 提交于 2019-11-30 02:16:39
这篇文章主要介绍如何使用 docker 部署 nsq 组件 环境准备 本文基于一台 ubuntu 虚拟机试验 docker 安装 docker 安装方式 使用 docker version 命令检查 docker 是否安装成功 docker-compose 安装 apt-get install docker-compose nsq docker 部署 nsq 主要有三个组件: nsqlookupd, nsqd, nsqadmin。这三个组件都包含在 nsqio/nsq 镜像中, 每一个组件都可以通过指定组件名的方式去启动,启动命令的形式如下: ` docker run nsqio/nsq /command 拉取基础镜像 docker pull nsqio/nsqd docker部署 nsqlookupd docker run --name lookupd -p 4160:4160 -p 4161:4161 -d nsqio/nsq /nsqlookupd 说明: -p 是映射端口 -d 是后台运行容器 /nsqlookupd 就是启动命令 nsqd 首先通过 ifconfig 获取虚拟机的 ip, 以本机 ip 172.16.49.92为例, nsq 的启动命令如下: docker run --name nsqd -p 4150:4150 -p 4151:4151 -d nsqio

docker 部署 nsq

岁酱吖の 提交于 2019-11-29 21:27:23
这篇文章主要介绍如何使用 docker 部署 nsq 组件 环境准备 本文基于一台 ubuntu 虚拟机试验 docker 安装 docker 安装方式 使用 docker version 命令检查 docker 是否安装成功 docker-compose 安装 apt-get install docker-compose nsq docker 部署 nsq 主要有三个组件: nsqlookupd, nsqd, nsqadmin。这三个组件都包含在 nsqio/nsq 镜像中, 每一个组件都可以通过指定组件名的方式去启动,启动命令的形式如下: docker run nsqio/nsq /command`` 首先拉取基础镜像 docker pull nsqio/nsq ## docker部署 ### nsqlookupd docker run --name lookupd -p 4160:4160 -p 4161:4161 -d nsqio/nsq /nsqlookupd 说明: * -p 是映射端口 * -d 是后台运行容器 * /nsqlookupd 就是启动命令 ### nsqd 首先通过 ifconfig 获取虚拟机的 ip, 以本机 ip 172.16.49.92为例, nsq 的启动命令如下: docker run --name nsqd -p 4150:4150 -p

基于 RocketMQ 的同城双活架构在美菜网的挑战与实践

南楼画角 提交于 2019-11-29 19:11:41
本文整理自李样兵在北京站 RocketMQ meetup分享美菜网使用 RocketMQ 过程中的一些心得和经验,偏重于实践。 嘉宾李样兵,现就职于美菜网基础服务平台组,负责 MQ ,配置中心和任务调度等基础组件开发工作。 今天主要从三个方面进行分享: 美菜网消息队列的历史 基于 RocketMQ 我们做了那些事情 同城双活的选型和思考 美菜网消息队列的历史 美菜网历史上是多套 MQ 并存,Kafka 用于大数据团队;NSQ 和 RocketMQ 用于线上业务。 多套集群存在的问题: 1、维护和资源成本高昂:Kafka 用 Scala 语言, NSQ 用 GO 语言, RocketMQ 用 Java 语言,维护成本较高,每套 MQ 不论消息量多少,至少部署一套,资源成本较高。 2、易用性较差:三套 MQ 基本上都是开箱直接使用,二次开发比较少,业务接入不方便,使用混乱。消费者接入时,需要知道 topic 在那套集群上,使用哪种客户端接入。 3、可靠性:比较了一下 RocketMQ 和 NSQ 内置的复制机制。NSQ 多通道之间是复制的,但是其本身是单副本的,存在消息丢失的风险。 统一集群的选型比较: 1、功能性,核心的功能每个 MQ 都有,考虑更多的是附加功能,比如延迟消息、顺序消息、事务消息,还有就是消息的回溯、基于 key 的检索。 2、可靠性, RocketMQ

基于 RocketMQ 的同城双活架构在美菜网的挑战与实践

风格不统一 提交于 2019-11-29 18:59:52
本文整理自李样兵在北京站 RocketMQ meetup分享美菜网使用 RocketMQ 过程中的一些心得和经验,偏重于实践。 嘉宾李样兵,现就职于美菜网基础服务平台组,负责 MQ ,配置中心和任务调度等基础组件开发工作。 今天主要从三个方面进行分享: 美菜网消息队列的历史 基于 RocketMQ 我们做了那些事情 同城双活的选型和思考 美菜网消息队列的历史 美菜网历史上是多套 MQ 并存,Kafka 用于大数据团队;NSQ 和 RocketMQ 用于线上业务。 多套集群存在的问题: 1、维护和资源成本高昂:Kafka 用 Scala 语言, NSQ 用 GO 语言, RocketMQ 用 Java 语言,维护成本较高,每套 MQ 不论消息量多少,至少部署一套,资源成本较高。 2、易用性较差:三套 MQ 基本上都是开箱直接使用,二次开发比较少,业务接入不方便,使用混乱。消费者接入时,需要知道 topic 在那套集群上,使用哪种客户端接入。 3、可靠性:比较了一下 RocketMQ 和 NSQ 内置的复制机制。NSQ 多通道之间是复制的,但是其本身是单副本的,存在消息丢失的风险。 统一集群的选型比较: 1、功能性,核心的功能每个 MQ 都有,考虑更多的是附加功能,比如延迟消息、顺序消息、事务消息,还有就是消息的回溯、基于 key 的检索。 2、可靠性, RocketMQ

Go操作NSQ

喜你入骨 提交于 2019-11-29 12:15:43
NSQ是目前比较流行的一个分布式的消息队列,本文主要介绍了NSQ及Go语言如何操作NSQ。 NSQ NSQ介绍 NSQ 是Go语言编写的一个开源的实时分布式内存消息队列,其性能十分优异。 NSQ的优势有以下优势: NSQ提倡分布式和分散的拓扑,没有单点故障,支持容错和高可用性,并提供可靠的消息交付保证 NSQ支持横向扩展,没有任何集中式代理。 NSQ易于配置和部署,并且内置了管理界面。 NSQ的应用场景 通常来说,消息队列都适用以下场景。 异步处理 参照下图利用消息队列把业务流程中的非关键流程异步化,从而显著降低业务请求的响应时间。 应用解耦 通过使用消息队列将不同的业务逻辑解耦,降低系统间的耦合,提高系统的健壮性。后续有其他业务要使用订单数据可直接订阅消息队列,提高系统的灵活性。 流量削峰 类似秒杀(大秒)等场景下,某一时间可能会产生大量的请求,使用消息队列能够为后端处理请求提供一定的缓冲区,保证后端服务的稳定性。 安装 官方下载页面 根据自己的平台下载并解压即可。 NSQ组件 nsqd nsqd是一个守护进程,它接收、排队并向客户端发送消息。 启动 nsqd ,指定 -broadcast-address=127.0.0.1 来配置广播地址 ./nsqd -broadcast-address=127.0.0.1 如果是在搭配 nsqlookupd 使用的模式下需要还指定