随笔分类 - 消息队列
摘要:延时消息,顾名思义就是发送消息后延迟多少时间接收。 使用场景举例,例如用户买票后,出票后要给用户发一个反现金红包,但是出票一般是异步出票,所以我们可以设定一个最大时间,例如30分钟。在买票30分钟后,根据出票结果决定是否发反现金红包。此时就可以使用延时队列,在用户购票的时候发送一个30分钟的延时消息
阅读全文
摘要:前面几章中可以看到,nsq进行消息消费的时候主要使用tcpServer去处理,也就是如下的方法 func (p *tcpServer) Handle(clientConn net.Conn) { p.ctx.nsqd.logf(LOG_INFO, "TCP: new client(%s)", cli
阅读全文
摘要:本节主要来探究nsq如何监听生产者的消息。 通过上节我们得知nsq接收消息发送主要是靠下面这个http处理器 当然了也可以通过原生tcp的方式进行消息发送,由于具体处理流程类似,所以文末会有提到。 router.Handle("POST", "/pub", http_api.Decorate(s.d
阅读全文
摘要:在上节中已经成功的解析了系统配置并创建了核心结构体nsqd,本文主要从nsqd的main方法入手 在main方法中,主要会创建一系列的tcp监听器,以及轮询检测。 func (n *NSQD) Main() { var err error ctx := &context{n} //检车是否能开启tc
阅读全文
摘要:启动加载配置 直接找到nsqd中main包下的start方法,即下图中代码 func (p *program) Start() error { //返回options结构体 包含了一些默认信息 //例如id,自身监听的tcp端口和http端口等,还包括了一系列阈值 //这儿注意id使用hostnam
阅读全文
摘要:通过查看nsqd.go的主应用入口,会发现其使用了svc来管理应用的生命周期。 func main() { prg := &program{} if err := svc.Run(prg, syscall.SIGINT, syscall.SIGTERM); err != nil { log.Fata
阅读全文
摘要:之前知乎上在go有关学习经验中看到有人推荐可以通过学习NSQ来学习go语言,并且还能顺道了解消息队列的设计,可谓一举两得。所以去了解了下NSQ,发现截止本文编写时间,NSQ在github上已经累积了17.7K 的star,发现比大家经常用到的kafka,rabbitmq的star还要高。汗,看来自己
阅读全文