(原)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 ...
随机推荐
- 快速开发一个npm包(轮子)
动机 很多人都想写一个自己的轮子,可是开始动手的时候你总会遇到以下问题 一个基本的 js 库应该如何编写 基本的前端项目都要哪些文件 又要怎么打包发布到 npm 上 你的 es6 语法如何才能让别人识 ...
- 关于Integer 和Double包装类创建对象时的底层解析
public void method1() { Integer i = new Integer(1); Integer j = new Integer(1); System.out.println(i ...
- Go中锁的那些姿势,估计你不知道
什么是锁,为什么使用锁 用俗语来说,锁意味着一种保护,对资源的一种保护,在程序员眼中,这个资源可以是一个变量,一个代码片段,一条记录,一张数据库表等等. 就跟小孩需要保护一样,不保护的话小孩会收到伤害 ...
- Yolo V3损失函数占个坑
https://blog.csdn.net/weixin_43384257/article/details/100974776目前来看讲的最清楚的博客 https://zhuanlan.zhihu.c ...
- Kettle中JavaScript内置函数说明
本文链接:https://blog.csdn.net/u010192145/article/details/102220563 我们在使用JavaScript组件的时候,在左侧核心树对象栏中可以看到K ...
- Netty之缓冲区ByteBuf解读(一)
Netty 在数据传输过程中,会使用缓冲区设计来提高传输效率.虽然,Java 在 NIO 编程中已提供 ByteBuffer 类进行使用,但是在使用过程中,其编码方式相对来说不太友好,也存在一定的不足 ...
- woj - 将一个问题转换为背包问题
Problem 1538 - B - Stones II Time Limit: 1000MS Memory Limit: 65536KB Total Submit: 428 Accepte ...
- HTTP图解笔记(六)—— 第6章 HTTP首部
前言 为啥第一章直接跳到第六章呢,因为...博主当初看书的时候挑着看..只看了第一章和第六章┗( ▔, ▔ )┛ HTTP图解对于不熟悉HTTP的小伙伴来说是很好的书籍,建议入手! 一. HTTP报文 ...
- git 工作实用创建删除分支
一.创建分支 .创建本地分支并切换 git checkout -b dev_wt2 .创建切换并关联远程分支 git checkout -b dev_wt3 orgin/dev_wt3 .创建远程分支 ...
- vue拦截器
1.在路由添加 meta:{ requireAuth:true } 完整 { path: '/xx', name: 'xx', component: xx, meta:{ requireAuth:tr ...