(原)NSQ源码阅读和分析(1)
原文出处: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 ...
随机推荐
- Ubuntu生成应用图标
1.DeskTop Entry介绍 现代 Linux 桌面系统也提供了此项功能.目前,Linux KDE 和 Linux GNOME 桌面系统都使用 Desktop Entry 文件标准来描述程序启动 ...
- BeanUtils 如何拷贝 List?
BeanUtils 如何拷贝 List? 一.背景 我们在DO.Model.VO层数据间可能经常转换数据: Entity对应的是持久层数据结构(一般是数据库表的映射模型); Model 对应的是业务层 ...
- ILSpy反编译工具之C#反汇编
1.下载ILspy工具 https://github.com/icsharpcode/ILSpy#ilspy------- 注意: ILspy需要在电脑上安装.NET Framework 4.0. ...
- 如何使用poi在word表格中插入行的4种方法
本文记录了,在word表格中插入新行的几种方法.直接上代码说明 table.addNewRowBetween 没实现,官网文档也说明,只有函数名,但没具体实现,但很多文章还介绍如何使用这个函数,真是害 ...
- OffSet和Utc
DateTime dtt = System.DateTime.Now ;//utcnow是格林威治的时间,与北京时间-8 strin(dtt); public static string strin( ...
- TCP/IP协议与HTTP协议(一)
1.什么是TCP/IP 如果要了解一个人,可以从他归属的集体聊起来.我们的HTTP协议就属于TCP/IP协议家族中的一员,了解HTTP协议再整个网络流程中的地位,也能更加充分的理解HTTP协议. 要 ...
- TCP/IP协议与HTTP协议(二)
TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据. 1.TCP连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过 ...
- jenkins 配置ssh密钥登录
1.找到一台服务器执行 ssh-keygen -t rsa 会在目录/root/.ssh生成id_rsa私钥.id_rsa.pub公钥,将公钥的内容写入到同目录下的authorized_keys文件( ...
- 2.Scanner的进阶使用
package com.duan.scanner; import java.util.Scanner; public class Demo04 { public static void main(St ...
- AutoIT测试实例
AutoIT是一款非常强大的免费功能自动化测试工具,使用它可以轻松实现web和winform的自动化测试.其脚本语言AU3语法类似于VB语言和vbs脚本语言,对于经常使用QTP的童鞋来说,非常容易上 ...