• NSQ学习 逻辑梳理


    消费者连接NSQD或NSQLookupd

    消费者可以连接多个NSQLookupd,消费者从每一个NSQLookupd查询拥有需要消费的TopicNSQD,并与查询得到的每一个NSQD建立连接。 每当NSQDTopicChannle出现了变动,NSQD会通知每一个与它相连的NSQLookupd

    一条消息的生命周期

    一条消息首先被生产者投递到NSQDTopic,然后由Topic.messagePump这个方法分发给TopicChannel

    nsq/nsqd/protocol_v2.go中的protocolV2.IOLoop方法一边根据客户端的接收情况把Channel中的消息发给客户端(protocolV2.messagePump),一遍处理来自客户端的指令如REQFIN等。 消息发给客户端之前,首先push到InFlightQueue这个优先队列中,这个队列可以表示正在处理中的消息。 InFlightQueue是最小堆,用于比较的属性是过期时刻。 每当消费者发送表示执行成功的FIN指令给NSQD时,NSQD就会把执行成功的消息从对应ChannelInFlightQueue删除; 如果直到超时还未收到消费者的FIN指令,那么对应的消息会从InFlightQueue删除,然后重新投递给Channel; 如果收到REQ指令,说明对应消息需要重新执行,这条消息会从InFlightQueue删除然后进入DeferredQueue,等到需要被执行的时刻再重新投递给ChannelDeferredQueue也是最小堆,用于比较的属性是消息被执行的时刻。

    启动和关闭

    DeferredQueue和InFlightQueue

    NSQD启动时,通过Metadata生成TopicChannel,并根据TopicChannel找到对应的文件队列。

    NSQD关闭时,每一个ChannelmemoryMsgChan的消息会被写到对应的文件队列里,inFlightMessagesdeferredMessages同上。

  • 相关阅读:
    (三)字符串、列表、元组、字典
    (二)判断语句和循环语句
    (一)python基础知识
    Python之禅
    《Vue.js实战》一书 p117 练习 1& 2 (2019.12.19)
    React练习 17:02_11_鼠标移过修改图片路径
    React练习 16:02_10_提示框效果
    React练习 15:02_09_单一按钮显示隐藏
    React练习 14:02_08_简易js年历
    React练习 13:02_07_简易选项卡
  • 原文地址:https://www.cnblogs.com/ToRapture/p/12055227.html
Copyright © 2020-2023  润新知