存档

文章标签 ‘nsq’

nsqlookupd 源码分析(2)- topic通道注册,查询代码分析

2018年6月5日 没有评论 29089次阅读    

上篇文章介绍了一下nsqlookupd 启动服务的简单流程,限于篇幅到这里来写一下nsqlookupd主要的工作:通道注册登记,以及查询服务。
nsqlookupd 有两个主要的功能:

  1. nsqd来注册所有topic、channel的分布信息,nsqlookupd记录哪些topic在哪些机器上;
  2. 给消费端来查询对应的topic所在的机器列表,以供订阅消费;

阅读全文...

Share
分类: GO, nsqd, nsqd 标签: , ,

nsqd 源码分析(5)- 消息的订阅流程

2018年5月27日 没有评论 28770次阅读    

这里记录一下消息的消费者订阅流程,配合上面文章写的消息发送流程。不过这里暂时没讲lookupd的过程,后面在详细介绍。

  1. 消费者使用TCP协议,发送SUB topic channel 命令订阅到某个channel上,记录其client.Channel = channel,通知c.SubEventChan;
  2. 消费者启动后台协程protocolV2.messagePump订阅c.SubEventChan 并得知channel有订阅消息;
  3. 开始订阅管道subChannel.memoryMsgChan/backend, 每个客户端都可以订阅到channel的内存或者磁盘队列里面;
  4. 待生产者调用第四步后,其中一个client会得到消息:msg := <-memoryMsgChan;
  5. 客户端记录StartInFlightTimeout的发送中消息队列,进行超时处理;
  6. SendMessage 将消息+msgid发送给消费者;
  7. 消费者收到msgid后,发送FIN+msgid通知服务器成功投递消息,可以清空消息了;

阅读全文...

Share
分类: GO, nsqd, nsqd 标签: , ,

nsqd 源码分析(4)- 消息的发送流程

2018年5月27日 没有评论 28844次阅读    

本文从消息发送者的PUB到最后消息被SUB接收,整个流程串起来讲一下nsqd是怎么接收消息的,这部分先写发送流程。

  1. 生产者PUB topic消息;
  2. topic.PutMessage 到 topic.memoryMsgChan;
  3. 每topic消息有后台协程topic.messagePump进行Topic.memoryMsgChan监听;
  4. topic.messagePump 遍历每个channel调用channel.PutMessage发送消息到channel.memoryMsgChan ;

阅读全文...

Share
分类: GO, nsqd, nsqd 标签: , ,

nsqd 源码分析(3)- Channel实现原理

2018年5月27日 没有评论 30327次阅读    

写一下Channel的实现,比topic相对简单一些,但channel是最接近消费者端的,有他特有的东西,包括投递,确认等;
nsqd的channel的作用在于能对指定的队列topic,进行多份投递,或者说消费,一份队列可以给多个消费者重复消费,有点类似于kafka的consumer_group,每个consumer_group拥有独立的position, 不同group之间可以消费同一份内容的多个副本。
这里稍微做个对比,kafka的已经消费国的消息是可以继续保留的,而nsq则如果消费完了,就会删除掉,也就是没有position可以供回溯,或者重复消费,只要客户端发发送FIN后,消息就会销毁,也不会保留在磁盘上面,这点比kafka简单多了,当然,轻量级消息队列也不太需要这么复杂的功能。

阅读全文...

Share
分类: GO, nsqd, nsqd 标签: , ,

nsqd 源码分析(2)- Topic实现原理

2018年5月22日 没有评论 29638次阅读    

这回记录一下nsqd的topic是怎么实现的。先以官网一张著名的动图开始, 下面这图介绍了发送一条消息到一个topic上的流程:

阅读全文...

Share
分类: GO, nsqd, nsqd 标签: , ,