文档章节

nsq nsqd源码1

昏鸦
 昏鸦
发布于 2014/03/25 16:12
字数 322
阅读 176
收藏 1
点赞 0
评论 0

1 启动类: main.go

 

利用:flag.NewFlagSet 解析传递的参数

'注册系统的信号量

exitChan := make(chan int)

    signalChan := make(chan os.Signal, 1)

    go func() {

        <-signalChan

        exitChan <- 1

    }()

    signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)

 

调用optios.go 做默认的参数  NewNSQDOptions

 

启动server的服务: nsqd := NewNSQD(opts)

 

加载硬盘上的数据:nsqd.LoadMetadata()

    err := nsqd.PersistMetadata()

 

nsqd.Main()

执行lookup 服务的初始化工作

n.waitGroup.Wrap(func() { n.lookupLoop() })

 

n.waitGroup.Wrap(func() { util.TCPServer(n.tcpListener, tcpServer) }) 开启tcp的监听服务

 

n.waitGroup.Wrap(func() { util.HTTPServer(n.httpListener, httpServer) }) 开始http的监听服务

 

main.go 的流程走完

 

接下来看看有客户端连接以后的服务:

tcp.go

     (p *tcpServer) Handle(clientConn net.Conn)

                   一系列的校验。。。

         调用:ProtocolV2. IOLoop

                            client := NewClientV2(clientID, conn, p.context) 初始化客户端

                                               go p.messagePump(client) 客户select服务

response, err := p.Exec(client, params)  执行具体的客户端操作

func (p *ProtocolV2) Exec(client *ClientV2, params [][]byte) ([]byte, error) {
    switch {
    case bytes.Equal(params[0], []byte("FIN")):
        return p.FIN(client, params)
    case bytes.Equal(params[0], []byte("RDY")):
        return p.RDY(client, params)
    case bytes.Equal(params[0], []byte("REQ")):
        return p.REQ(client, params)
    case bytes.Equal(params[0], []byte("PUB")):
        return p.PUB(client, params)
    case bytes.Equal(params[0], []byte("MPUB")):
        return p.MPUB(client, params)
    case bytes.Equal(params[0], []byte("NOP")):
        return p.NOP(client, params)
    case bytes.Equal(params[0], []byte("TOUCH")):
        return p.TOUCH(client, params)
    case bytes.Equal(params[0], []byte("IDENTIFY")):
        return p.IDENTIFY(client, params)
    case bytes.Equal(params[0], []byte("SUB")):
        return p.SUB(client, params)
    case bytes.Equal(params[0], []byte("CLS")):
        return p.CLS(client, params)
    }
    return nil, util.NewFatalClientErr(nil, "E_INVALID", fmt.Sprintf("invalid command %s", params[0]))
}



© 著作权归作者所有

共有 人打赏支持
昏鸦
粉丝 6
博文 155
码字总数 58873
作品 0
程序员
去中心化分布式服务实时消息平台-NSQ

NSQ是一个基于Go语言的开源的分布式实时消息平台 NSQ可用于大规模系统的实时消息服务,它的设计目标是为在分布式环境下提供一个强大的去除中心化的分布式服务架构,可以每天处理数以亿计的实...

kiwisoft ⋅ 2016/10/27 ⋅ 0

NSQ 0.3.1 发布,开源高性能消息系统

NSQ 0.3.1 发布了,该版本包含一些小 bug 修复和新特性。改进了 nsqstat 和 nsqtofile 助手应用(支持 #ephemeral 主题)。此外 TLS 选项继续改进对 --tls-min-version 的支持以及 TLSFALLB...

oschina ⋅ 2015/01/27 ⋅ 5

游戏服务器骨架--gonet2

欢迎使用 gonet/2是新一代游戏服务器骨架,基于go语言开发,采用了先进的http/2作为服务器端主要通信协议,以microservice作为主要思想进行架构,采用docker作为服务发布手段。相比第一代gon...

xtaci ⋅ 2015/10/15 ⋅ 0

nsq 使用笔记

nsqd 出现问题 https://github.com/nsqio/nsq/issues/691 https://github.com/nsqio/nsq/issues/506 nsqadmin 在访问的时候报错误 这个错误就是DNS访问出了问题。 解决方法: 使用 -broadca...

solate ⋅ 2016/11/01 ⋅ 0

nsq在docker部署后nsqadmin无法resolve所有nsqd的host的解决方法

nsq在docker部署后nsqadmin无法resolve所有nsqd的host的解决方法 疯子的自留地2017-12-173 阅读 docker方法部署 问题 最开始部署 nsq 的时候是直接在云主机上直接部署的,但是作为一个牛逼的程...

疯子的自留地 ⋅ 2017/12/17 ⋅ 0

Docker部属Nsq集群

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

lpxxn ⋅ 2017/10/25 ⋅ 0

NSQ:分布式的实时消息平台

NSQ是一个基于Go语言的分布式实时消息平台,它基于MIT开源协议发布,代码托管在GitHub,其当前最新版本是0.3.1版。 NSQ可用于大规模系统中的实时消息服务,并且每天能够处理数亿级别的消息,...

hejunyi1204 ⋅ 2015/08/14 ⋅ 0

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

NSQ系列之nsqlookupd代码分析一(初探nsqlookup) 是守护进程负责管理拓扑信息。客户端通过查询 来发现指定话题()的生产者,并且提供 节点广播话题()和通道()信息。 有两个接口: 接口...

大蓝妹 ⋅ 2015/08/27 ⋅ 0

Web 安全扫描平台--Gryffin

Gryffin 是雅虎开发的一个大规模 Web 安全扫描平台。它不是另外一个扫描器,其主要目的是为了解决两个特定的问题 —— 覆盖率和伸缩性。 该平台采用 Go 语言开发,依赖: Go PhantomJS, v2 S...

红薯 ⋅ 2015/09/27 ⋅ 0

NSQ系列之nsqlookupd代码分析四(详解nsqlookupd中的RegitrationDB)

NSQ系列之nsqlookupd代码分析四(详解nsqlookupd中的RegitrationDB操作方法) 上一章我们大致了解了的中的协议的处理逻辑,里面有提到一个存储的以及 数据信息的的一些操作方法。今天我们就来...

大蓝妹 ⋅ 2015/09/02 ⋅ 2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

BS与CS的联系与区别【简】

C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、InFORMix或 SQL Server。客户端需要安装专用的客户端软件。 B/S是Brower/...

anlve ⋅ 54分钟前 ⋅ 0

发生了什么?Linus 又发怒了?

在一个 Linux 内核 4.18-rc1 的 Pull Request 中,开发者 Andy Shevchenko 表示其在对设备属性框架进行更新时,移除了 union 别名,这引发了 Linus 的暴怒。 这一次 Linus Torvalds 发怒的原...

问题终结者 ⋅ 今天 ⋅ 0

在树莓派上搭建一个maven仓库

在树莓派上搭建一个maven仓库 20180618 lambo init 项目说明 家里有台树莓派性能太慢。想搭建一个maven私服, 使用nexus或者 jfrog-artifactory 运行的够呛。怎么办呢,手写一个吧.所在这个...

林小宝 ⋅ 今天 ⋅ 0

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 今天 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 今天 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 今天 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 今天 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部