原文出处: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)的更多相关文章
-
HTTP请求库——axios源码阅读与分析
概述 在前端开发过程中,我们经常会遇到需要发送异步请求的情况.而使用一个功能齐全,接口完善的HTTP请求库,能够在很大程度上减少我们的开发成本,提高我们的开发效率. axios是一个在近些年来非常火的 ...
-
如何实现一个HTTP请求库——axios源码阅读与分析 JavaScript
概述 在前端开发过程中,我们经常会遇到需要发送异步请求的情况.而使用一个功能齐全,接口完善的HTTP请求库,能够在很大程度上减少我们的开发成本,提高我们的开发效率. axios是一个在近些年来非常火的 ...
-
nsq源码阅读笔记之nsqd(四)——Channel
与Channel相关的代码主要位于nsqd/channel.go, nsqd/nsqd.go中. Channel与Topic的关系 Channel是消费者订阅特定Topic的一种抽象.对于发往Topi ...
-
nsq源码阅读笔记之nsqd(二)——Topic
与Topic相关的代码主要位于nsqd/nsqd.go, nsqd/topic.go中. Topic的获取 Topic通过GetTopic函数获取 GetTopic函数用于获取topic对象,首先先尝 ...
-
nsq源码阅读笔记之nsqd(三)——diskQueue
diskQueue是backendQueue接口的一个实现.backendQueue的作用是在实现在内存go channel缓冲区满的情况下对消息的处理的对象. 除了diskQueue外还有dummy ...
-
nsq源码阅读笔记之nsqd(一)——nsqd的配置解析和初始化
配置解析 nsqd的主函数位于apps/nsqd.go中的main函数 首先main函数调用nsqFlagset和Parse进行命令行参数集初始化, 然后判断version参数是否存在,若存在,则打印 ...
-
Iris框架源码阅读和分析
iris包结构简介 iris包含了很多包,下面这些是分析过程中接触到的东西. 能力有限,多多包涵,欢迎联系QQ:2922530320 一起交流 context包包含: Context (接口) con ...
-
fw: 专访许鹏:谈C程序员修养及大型项目源码阅读与学习
C家最近也有一篇关于如何阅读大型c项目源代码的文章,学习..融合.. -------------------- ref:http://www.csdn.net/article/2014-06-05 ...
-
【原】AFNetworking源码阅读(六)
[原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...
随机推荐
-
ASP.NET OAuth:解决refresh token无法刷新access token的问题
最近同事用iOS App调用Open API时遇到一个问题:在access token过期后,用refresh token刷新access token时,服务器响应"invalid_gran ...
-
usaco 2016 Feb 负载平衡
题目大意:平面上一堆点,用两条平行于坐标轴的直线将其分为四部分,使得点数最多的一部分最少 第一维枚举,第二维三分,点集用两棵树状数组维护 #include<bits/stdc++.h> # ...
-
《30天自制操作系统》17_day_学习笔记
harib14a: 接着上一天的内容,我们来思考一个问题:当所有的LEVEL中都没有任务的时候怎么办?采用前面定时器链表中加入“哨兵”的思路,我们加入一个idle任务,去执行HLT.接下来我们只需要将 ...
-
【翻译】使用新的Sencha Cmd 4命令app watch
原文:http://www.sencha.com/blog/using-the-new-app-watch-command-in-sencha-cmd-4/ 作者:Don Griffin Don Gr ...
-
VS Code引用 vue/cli
npm i @vue/cli -g 引用cli脚手架 3.0版本 下载好后 找个空文件夹 vue create myvue 创建vue项目 myvue是自己项目名称 Your connec ...
-
第四节 Python基础之数据类型(集合)
在学习本节之前,我们先对数据类型做一个补充,也就是数据类型的分类: 按照可变和不可变来分: 可变:列表,字典 不可变:数字,字符串,元组 按照访问顺序来分: 顺序访问:字符串,列表,元组 映射的方式访 ...
-
设计模式---组件协作模式之模板方法模式(Tempalte Method)
前提:组件协作模式 现代软件专业分工之后的第一个结构是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常见的模式. 我们常常使用框架来写自己的 ...
- phpstorm怎么设置每个function都用那条横线隔开
-
c#利用反射Assembly 对类和成员属性进行操作
protected static void test() { //获取程序集 Assembly assembly = System.Reflection.Assembly.GetExecutingAs ...
-
设计一个学生类&;班级类
第一题 设计一个学生类 属性:姓名.学号.年龄.成绩 设计一个班级类要求:实现向班级中添加学生.删除学生.查看学生.按照指定条件排序 属性:班级代号,所有学生 需要使用 calss, __int__, ...