nsq

NSQ之粗读浅谈

对着背影说爱祢 提交于 2019-12-26 18:19:07
回顾:   以前一直是C++开发(客户端),最近听同事讲go语言不错,随后便决定先从go语法开始投向go的怀抱。由于历史原因学习go语法时,用了半天的时间看完了菜鸟教程上相关资料,后来又看了易百教程上的一些实例代码,感觉都比较简单,毕竟还是有C++基础存在的。。。但是找工作大多都是需要工作经验的,那么怎么办才好呢!后来在知乎上看到有一位大神推荐看NSQ和skynet开源框架,权衡之下我决定从NSQ开始学习,进入我的go学习之路。   要学习NSQ,首先就是上www查找相关NSQ的资料,没想到百度一下相关资料还是挺多,有好几个网友的博客都写的不错,思路比较清晰,但是基本都没有完全的把NSQ分析下来,只能后边继续等待了。文章末尾我会把自己觉着可以帮助理解的文章链接贴上。   本篇文章我不打算直接开始分析NSQ框架代码,而是想从一些零散的地方着手,针对性的讲NSQ,这样有利于后期我们逐模块分析NSQ源码。   下边就开始我们文本的中心内容,文章结构是按点划分,会比较零散但都是个人在看NSQ源码时的心得,也可以说是个人觉得比较难理解的地方吧, 看NSQ之前,只学习了go语法2天时间,因此文中可能会涉及到一些基础性错误,欢迎大家指正 。 一、NSQ部署   我个人电脑是win10 64位,因此在这儿我就给出一个网友写好的Windows下NSQ部署文章 NSQ如何在windows上安装

nsq初探

天大地大妈咪最大 提交于 2019-12-26 18:18:53
一. 安装 参考: http://nsq.io/deployment/installing.html http://www.baiyuxiong.com/?p=873 (推荐.) 不推荐直接把官方的Binary Releases版本down下来扔bin目录. 建议用“Building From Source”方式(看下面的步骤),这样可以把source下到$GOPATH/src里并同时把程序build到$GOPATH/bin里. (然后可以把这个bin目录添加到环境变量$sudo vi /etc/profile加一行:export PATH=$PATH:$GOPATH/bin.) 步骤: (假设已经有golang环境) 1.VPN翻墙. (因为需要访问code.google.com) 2.sudo chown -R xiaou $GOPATH #这个在搞golang环境的时候就设置过了.不搞的话,go get会报错. 接下来才是真正的nsq安装步骤: 3.go get github.com/kr/godep 4.go get github.com/bmizerany/assert 5.godep get github.com/bitly/nsq/... 执行之后在$GOPATH/bin下会有很多可执行文件. 二 部署与测试 依次在不同终端执行这些命令: 1.nsqlookupd 2

NSQ源码剖析之nsqd

纵然是瞬间 提交于 2019-12-26 18:18:19
NSQ简介 NSQ 是实时的分布式消息处理平台,其设计的目的是用来大规模地处理每天数以十亿计级别的消息。NSQ 具有分布式和去中心化拓扑结构,该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征,是一个成熟的、已在大规模生成环境下应用的产品。 NSQ 由 3 个守护进程组成: nsqd 是接收、保存和传送消息到客户端的守护进程。 nsqlookupd 是管理的拓扑信息,维护着所有nsqd的状态,并提供了最终一致发现服务的守护进程。 nsqadmin 是一个 Web UI 来实时监控集群和执行各种管理任务。 这篇文章介绍主要介绍nsqd的实现。 Topic与Channel Topic与Channel是NSQ中重要的两个概念。 生产者将消息写到Topic中,一个Topic下可以有多个Channel,每个Channel都是Topic的完整副本。 消费者从Channel处订阅消息,如果有多个消费者订阅同一个Channel,Channel中的消息将被传递到一个随机的消费者。 要理解Topic Channel中各种chan的作用,关键是要理解golang中如何在并发环境下如何操作一个结构体(多个goroutine同时操作topic),与C/C++多线程操作同一个结构体时加锁(mutex,rwmutex)不同,go语言中一般是为这个结构体(topic,channel

nsq cannot consume message by connecting to nsqlookupd

时光怂恿深爱的人放手 提交于 2019-12-25 01:45:43
问题 I tried to use docker-compose to run nsq, the docker-compose.yml as below: version: '3' services: nsqlookupd: image: nsqio/nsq command: /nsqlookupd ports: - "4160:4160" - "4161:4161" nsqd: image: nsqio/nsq command: /nsqd --lookupd-tcp-address=nsqlookupd:4160 depends_on: - nsqlookupd ports: - "4150:4150" - "4151:4151" nsqadmin: image: nsqio/nsq command: /nsqadmin --lookupd-http-address=nsqlookupd:4161 depends_on: - nsqlookupd ports: - "4171:4171" I am using the nsq client go-nsq to produce and

NSQ

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

How to sync the database with the microservices (and the new one)?

杀马特。学长 韩版系。学妹 提交于 2019-12-12 10:47:23
问题 I'm developing a website with the microservice architecture, and each of the service owns a database. The database stores the data which the microservice needs. Post , Video services need the user information, so both of the services subscribed to the NEW_USER_EVENT . The NEW_USER_EVENT will be triggered when there's a new user registered. Once the services received the NEW_USER_EVENT , they put the incoming user information to each of their own database. So they can do things without asking

Go之NSQ

痴心易碎 提交于 2019-12-08 17:34:28
NSQ   NSQ是目前比较流行的一个分布式的消息队列,本文主要介绍了NSQ及Go语言如何操作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

为什么你得学些 TCP 的知识?

☆樱花仙子☆ 提交于 2019-12-06 23:56:50
这不是指要明白 TCP 的所有东西,也不是说要通读 《TCP/IP 详解》。不过懂一点 TCP 知识是很有必要的。理由如下: 当我还在 Recurse Center 的时候,我用 Python 写过 TCP 协议栈(还写过一篇文章:如果你用 Python 写 TCP 协议栈会遇到什么?)。这是一次有趣的学习经历,但是也仅此而已。 一年以后,工作中有人在 Slack 上提到:“嘿,我在向 NSQ 发布消息时,每次要耗费 40 毫秒”。我已经断断续续思考了一个星期,但是没有任何结果。 一点背景知识:NSQ 是一个消息队列,你通过本地的一个 HTTP 请求向其发布消息。发送本地的一个 HTTP 请求确实不应该花费 40 毫秒,有时候会更差。NSQ 守护进程的负载不高,也没有使用过多的内存,也看不到 GC 停顿。这究竟是为什么呢?神呐,救救我吧! 突然我记起我一周以前看过的一篇叫做“性能研究(In search of performance)”的文章——我们如何为每个 POST 请求节省 200ms。在这篇文章中,他们说到为什么每个 POST 请求会花费额外的 200 毫秒。就是这个原因。这是该文章中的关键段落: 延迟确认(ACK) 与 TCP_NODELAY Ruby 的 Net::HTTP 会将 POST 请求切分为两个 TCP 包,一个消息头,一个消息体。相反,curl

【swoole】结合swoole 和 nsq 的实际应用

别来无恙 提交于 2019-12-05 23:39:00
集合 swoole 的框架设计 为了减少理解度,我尽量的从源头开始引入 1. nsq 案例中是使用 swoole 结合一个php 框架实现的是 NSQ 订阅功能。 启动命令: sudo bash /www/webserver/bin/swoole.sh start nsq adminexport 解释上面一个指令,使用 bash 执行一个项目中的脚本。 start 对应启动命令 nsq : 代表对应使用NSQ 服务 adminexport : 对应的是NSQ 的topic 脚本的本质,通过框架的入口文件,根据传参,进入到的不同的消息中间件,及对应的服务 php 订阅 AdminexportService 继承封装好的 SwooleService。 在init方法中,初始化 swoole服务。并且注册回调函数。 AdminexportService 在重写的 swooleWorkerStart 回调函数中,实现了NSQ 的订阅功能 NSQ 消息的处理 简单封装了重复消息的判断 requeue 没有消费消息的重新投递 3. 引入 swoole 就是构造方法引入 swoole 的实例化 同时,重写 workerStart 的方法。 所以当执行脚本的时候,也就是启动了 对应的swoole 服务。启动了订阅者的客户端。 不断的消费来自nsq topic 的消息 看吧,swoole

剖析nsq消息队列(四) 消息的负载处理

时光毁灭记忆、已成空白 提交于 2019-12-05 22:54:13
剖析nsq消息队列-目录 实际应用中,一部分服务集群可能会同时订阅同一个 topic ,并且处于同一个 channel 下。当 nsqd 有消息需要发送给订阅客户端去处理时,发给哪个客户端是需要考虑的,也就是我要说的消息的负载。 如果不考虑负载情况,把随机的把消息发送到某一个客服端去处理消息,如果机器的性能不同,可能发生的情况就是某一个或几个客户端处理速度慢,但还有大量新的消息需要处理,其他的客户端处于空闲状态。理想的状态是,找到当前相对空闲的客户端去处理消息。 nsq 的处理方式是客户端主动向 nsqd 报告自已的可处理消息数量(也就是 RDY 命令)。 nsqd 根据每个连接的客户端的可处理消息的状态来随机把消息发送到可用的客户端,来进行消息处理 如下图所示: 客户端更新RDY 从第一篇帖子的例子中我们就有配置consumer的config config := nsq.NewConfig() config.MaxInFlight = 1000 config.MaxBackoffDuration = 5 * time.Second config.DialTimeout = 10 * time.Second MaxInFlight 来设置最大的处理中的消息数量,会根据这个变量计算在是否更新 RDY 初始化的时候 客户端会向连接的nsqd服务端来发送updateRDY来设置最大处理数