nsq 问题
博客专区 > 昏鸦 的博客 > 博客详情
nsq 问题
昏鸦 发表于4年前
nsq 问题
  • 发表于 4年前
  • 阅读 102
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

在nsq 进行topic get的时候都会对map进行枷锁

func (n *NSQD) GetTopic(topicName string) *Topic {
    n.Lock()
    t, ok := n.topicMap[topicName]
    if ok {
        n.Unlock()
        return t
    } else {
        t = NewTopic(topicName, &Context{n})
        n.topicMap[topicName] = t

        log.Printf("TOPIC(%s): created", t.name)

        // release our global nsqd lock, and switch to a more granular topic lock while we init our
        // channels from lookupd. This blocks concurrent PutMessages to this topic.
        t.Lock()
        n.Unlock()
        // if using lookupd, make a blocking call to get the topics, and immediately create them.
        // this makes sure that any message received is buffered to the right channels
        if len(n.lookupPeers) > 0 {
            channelNames, _ := lookupd.GetLookupdTopicChannels(t.name, n.lookupHttpAddrs())
            for _, channelName := range channelNames {
                t.getOrCreateChannel(channelName)
            }
        }
        t.Unlock()

        // NOTE: I would prefer for this to only happen in topic.GetChannel() but we're special
        // casing the code above so that we can control the locks such that it is impossible
        // for a message to be written to a (new) topic while we're looking up channels
        // from lookupd...
        //
        // update messagePump state
        select {
        case t.channelUpdateChan <- 1:
        case <-t.exitChan:
        }
    }
    return t
}


共有 人打赏支持
粉丝 7
博文 143
码字总数 54861
×
昏鸦
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: