nsq

剖析nsq消息队列(一) 简介及去中心化实现原理

谁都会走 提交于 2019-11-29 00:24:27
分布式消息队列 nsq ,简单易用,去中心化的设计使 nsq 更健壮, nsq 充分利用了 go 语言的 goroutine 和 channel 来实现的消息处理,代码量也不大,读不了多久就没了。后期的文章我会把 nsq 的源码分析给大家看。 主要的分析路线如下 分析 nsq 的整体框架结构,分析如何做到的无中心化分布式拓扑结构,如何处理的单点故障。 分析 nsq 是如何保证消息的可靠性,如何保证消息的处理,对于消息的持久化是如何处理和扩展的。 分析 nsq 是如何做的消息的负载处理,即如何把合理的、不超过客户端消费能力的情况下,把消息分发到不同的客户端。 分析 nsq 提供的一些辅助组件。 这篇帖子,介绍 nsq 的主体结构,以及他是如何做到去中心化的分布式拓扑结构,如何处理的单点故障。 几个组件是需要先大概说一下 nsqd 消息队列的主体,对消息的接收,处理和把消息分发到客户端。 nsqlookupd nsq 拓扑结构信息的管理者,有了他才能组成一个简单易用的无中心化的分布式拓扑网络结构。 go-nsq nsq 官方的go语言客户端,基本上市面上的主流编程语言都有相应的客户端 在这里 还有可视化的组件 nsqadmin 和一些工具像 nsq_to_file 、 nsq_stat 、等等,这些在后期的帖子里会介绍 使用方式 直连方式 nsqd 是独立运行的

安装NSQ

我的未来我决定 提交于 2019-11-27 15:44:58
安装文档 https://nsq.io/deployment/installing.html 打开连接后,根据系统找到对应的二进制包 一般都是linux则下载 https://s3.amazonaws.com/bitly-downloads/nsq/nsq-1.1.0.linux-amd64.go1.10.3.tar.gz 启动模块 通过supervisord启动守护进程 三个配置文件 nsq.ini $ cat /data/etc/supervisord/nsq.ini [group:nsq] programs=nsqadmin,nsqd,nsqlookupd nsqd.ini [program:nsqd] command=/data/app/nsq-1.1.0.linux-amd64.go1.10.3/bin/nsqd --broadcast-address=127.0.0.1 --lookupd-tcp-address=127.0.0.1:4160 --msg-timeout="15m0s" --mem-queue-size=0 --max-msg-size=10240000 --sync-timeout=1s --max-body-size=10240000 --data-path=/data/app/nsq-1.1.0.linux-amd64.go1.10.3/data

教你一招如何使用 php 父子进程坑人

不羁的心 提交于 2019-11-26 18:44:33
现在项目中大多都会使用MQ(消息队列)用来解耦和提升服务稳定性,然后都会面临一个问题,就是消息积压,解决这个问题除了提升处理消息的速度以外,另外就是多开些消费者进程,并发的消费数据。 如果是其他语言可以多开些线程或协程消费数据,但是这些东西,在 php 里并没有很好地支持,所以大家多采用多进程的方式来增加消费者,然后这里又有了两种方式,父子多进程和普通多进程。 然后这里就有了一个有趣的坑人方法,小小一技就能把人坑的想打你,那就是使用父子进程。 这是 php 使用父子进程的一个伪代码 $pid = pcntl_fork(); //父进程和子进程都会执行下面代码 if ($pid == -1) { //错误处理:创建子进程失败时返回-1. die('could not fork'); } else if ($pid) { //父进程会得到子进程号,所以这里是父进程执行的逻辑 pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。 } else { //子进程得到的$pid为0, 所以这里是子进程执行的逻辑。 } 那么怎么坑人呢? 坑人第一步,监听 signal //使用ticks需要PHP 4.3.0以上版本 declare(ticks = 1); //信号处理函数 function sig_handler($signo) { switch (

NSQ异步消费模型

风流意气都作罢 提交于 2019-11-26 17:08:23
网上搜了很久,除了官网的类库,没找到合适的PHP作为消费者的容易理解的案例,那干脆自己写一个好了。 搭建环境 # 拉取官方最新镜像 docker pull nsqio/nsq:latest # 启动lookupd 大管家 docker run -d --name lookupd -p 4160:4160 -p 4161:4161 nsqio/nsq /nsqlookupd # 启动nsqd 真正干活的,里面的broadcast-address是容器本身的ip docker run -d --name = nsqd -p 4150:4150 -p 4151:4151 nsqio/nsq /nsqd --broadcast-address = 172.17.0.2 --lookupd-tcp-address = 172.17.0.2:4160 # 启动web端admin,可选 docker run -d --name = nsqadmin -p 4171:4171 nsqio/nsq /nsqadmin --lookupd-http-address = 172.17.0.2:4161 生产者模型 package main // nsq-productor.go import ( "github.com/bitly/go-nsq" "log" "flag" "encoding/json"