原文出处:https://www.cnblogs.com/lihaiping/p/12324371.html

本文记录自己在阅读和学习nsq源码的时候的一些学习笔记,主要目的是个人总结和方便后期查阅。

author:lihaiping1603@aliyun.com

date:2020/01/13

NSQ对于发送出去的消息,是如何保证可靠性的

对于topic下的channel中的消息会有router()函数进行路由,它将消息流转到内存的chan中,即channel中的incomingMsgChan转到memoryMsgChan,如果memoryMsgChan消息满了,堵住的话,就会将消息写入到backend中。

对于memoryMsgChan中消息,会在channel的messagePump()函数中进行再一次的流转,他会将消息从memoryMsgChan通道中接收,然后再次转发到clientMsgChan中去。

对于每个client网络链接,NSQ都会对此client网络链接新建一个IOLoop()的goroutine来处理一切和client的消息。当client发送SUB订阅命令之后,client会根据它订阅的topic和channel,再启动一个goroutine来推送channel中的msg到client,这个函数就是messagePump()函数。而在client的messagePump中,主要的任务就是发送心跳和和接收来自channel中clientMsgChan消息,然后将消息打包发送给client。当然消息发送给client可能会失败,所以NSQ在这里做一个很好的容错失败的策略,当我们将消息推送给client的时候,既然消息可能会失败,所以我们就需要将消息存起来,于是client会将这个消息在它所在的channel中,启动一个超时策略,如果超时的话,消息会被再次以跟宠topic流转到chanel同样的流程进入到channel的消息流转流程。

而client在发送网络消息之前,会通过调用client.Channel.StartInFlightTimeout(msg, client)函数,来将消息msg和client一起生成一个另外的消息对象inFlightMessage,然后再将这个消息对象增加超时时间,进一步封装成pqueue.Item,然后分别存储到 channel的inFlightMessages和inFlightPQ中,其中inFlightMessages是一个map,他以msg的id为key进行存储,方便等会当客户端收到消息应答以后,进行删除操作。同时在inFlightPQ中,这个主要是做超时用的,因为channel中会启动一个goroutine函数inFlightWorker来专门处理inFlightPQ中超时消息。

在inFlightWorker()中,主要根据超时时间来不断的从pq队列中取消息,如果超时时间到了,消息还没有从inFlightPQ队列中删除掉,说明这个消息可能丢失或者出现什么问题了,我们就需要重新流转这个消息。

(原)NSQ源码阅读和分析(1)的更多相关文章

  1. HTTP请求库——axios源码阅读与分析

    概述 在前端开发过程中,我们经常会遇到需要发送异步请求的情况.而使用一个功能齐全,接口完善的HTTP请求库,能够在很大程度上减少我们的开发成本,提高我们的开发效率. axios是一个在近些年来非常火的 ...

  2. 如何实现一个HTTP请求库——axios源码阅读与分析 JavaScript

    概述 在前端开发过程中,我们经常会遇到需要发送异步请求的情况.而使用一个功能齐全,接口完善的HTTP请求库,能够在很大程度上减少我们的开发成本,提高我们的开发效率. axios是一个在近些年来非常火的 ...

  3. nsq源码阅读笔记之nsqd(四)——Channel

    与Channel相关的代码主要位于nsqd/channel.go, nsqd/nsqd.go中. Channel与Topic的关系 Channel是消费者订阅特定Topic的一种抽象.对于发往Topi ...

  4. nsq源码阅读笔记之nsqd(二)——Topic

    与Topic相关的代码主要位于nsqd/nsqd.go, nsqd/topic.go中. Topic的获取 Topic通过GetTopic函数获取 GetTopic函数用于获取topic对象,首先先尝 ...

  5. nsq源码阅读笔记之nsqd(三)——diskQueue

    diskQueue是backendQueue接口的一个实现.backendQueue的作用是在实现在内存go channel缓冲区满的情况下对消息的处理的对象. 除了diskQueue外还有dummy ...

  6. nsq源码阅读笔记之nsqd(一)——nsqd的配置解析和初始化

    配置解析 nsqd的主函数位于apps/nsqd.go中的main函数 首先main函数调用nsqFlagset和Parse进行命令行参数集初始化, 然后判断version参数是否存在,若存在,则打印 ...

  7. Iris框架源码阅读和分析

    iris包结构简介 iris包含了很多包,下面这些是分析过程中接触到的东西. 能力有限,多多包涵,欢迎联系QQ:2922530320 一起交流 context包包含: Context (接口) con ...

  8. fw: 专访许鹏:谈C程序员修养及大型项目源码阅读与学习

      C家最近也有一篇关于如何阅读大型c项目源代码的文章,学习..融合.. -------------------- ref:http://www.csdn.net/article/2014-06-05 ...

  9. 【原】AFNetworking源码阅读(六)

    [原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...

随机推荐

  1. Centos 中文乱码解决方法

    问题描述 crontab -e 添加定时任务时,直接将下面内容粘贴过去,结果竟然乱码了. # 每个星期日凌晨3:00执行完全备份脚本 0 3 * * 0 /bin/bash -x /root/bash ...

  2. Java 第一次课堂测验

    周一下午进行了开学来java第一次课堂测验,在课堂上我只完成了其中一部分,现代码修改如下: 先定义 ScoreInformation 类记录学生信息: /** * 信1805-1 * 胡一鸣 * 20 ...

  3. 交换一个数字的任意两个位置,指定K次的最值

    Anton has a positive integer n, however, it quite looks like a mess, so he wants to make it beautifu ...

  4. dp-LCS(递归输出最短合串)

    Problem Description The company "21st Century Fruits" has specialized in creating new sort ...

  5. playbooks框架部署远程主机

    进入到ansible和python环境 进入python3.6虚拟环境 #su - deploy #source .py3-a2.5-env/bin/activate 加载ansible 2.5版本 ...

  6. CodeSign error: no provisioning profile at path '/Users/zhht-2015/Library/MobileDevice/Provisioning Profiles/79693141-f98b-4ac4-8bb4-476c9475f265.mobileprovision'

    解决方法: 1.关闭Xcode,找到项目中的**.xcodeproj文件,点击右键,show package contents(打开包内容). 2.打开后找到project.pbxproj文件,用文本 ...

  7. python 装饰器-初识

    一.装饰器的形成过程 1.函数无参数,无返回值 import time def f1(): # 无参数,无返回值 time.sleep(1) print("Hello, World!&quo ...

  8. ORM基础2 字段及其参数和meta

    一.ORM简介 1.概念:ORM(Object Relational Mappingt ),对象关系映射 2.实质:类与数据库之间的映射 3.优点: 开发人员不用写数据库 4.缺点: 开发人员,数据库 ...

  9. 使用Oracle Stream Analytics 21步搭建大数据实时流分析平台

    概要: Oracle Stream Analytics(OSA)是企业级大数据流实时分析计算平台.它可以通过使用复杂的关联模式,扩充和机器学习算法来自动处理和分析大规模实时信息.流式传输的大数据可以源 ...

  10. Go的切片:长度和容量

    虽然说 Go 的语法在很大程度上和 PHP 很像,但 PHP 中却是没有"切片"这个概念的,在学习的过程中也遇到了一些困惑,遂做此笔记. 困惑1:使用 append 函数为切片追加 ...