ngx-push-stream模块源码学习(五)——内存清理
1.定时器
采用nginx自身的定时器管理机制,具体细节待学习过nginx源码后加以补充
2.channel的生成周期

(0)、初始(诞生)
发布、订阅均有可能产生channel
- 发布:向channel以post的形式发布消息时,如果不存在channel则产生
- 订阅:模块配置允许订阅产生channel的情况下,如果向一个不存在的channel上订阅时则产生
channel自诞生之日期就是在无奈的等死。。。只要channel被使用一次(发布、订阅)则其寿命被延长一次,保持状态处于“初始”
(1)、死缓
模块每隔一段时间(默认为11s)会进行内存回收——ngx_http_push_stream_collect_expired_messages_and_empty_channels。如果一个channel既没有存储信息也没有订阅者,那它就是废物了,标记为deleted,设定过期时间为当前时间+一段时间(默认为30s),并将该channel移动到垃圾回收站。。。等死吧,不过别慌,你还有活的可能
(2)保外就医
如果有人关心你(订阅、发布、统计channel信息)则将处于死缓状态的channel从垃圾堆中还原
(3)、死刑
除了死缓,还有种机制可以直接将channel判为死刑——以DELETE的方式请求发布通道,则无视该channel的任何亲属关系(存储的信息、订阅者)则直接将其标记为deleted,扔入unrecoverable_channels队列。。。别幻想了,系统会ngx_http_push_stream_alert_worker_delete_channel,通知为该通道工作的ngx worker诛九族(清理该channel的订阅者、存储信息等系统资源)
(4)处决
执行周期性内存清理时,除了ngx_http_push_stream_collect_expired_messages_and_empty_channels外,还会执行ngx_http_push_stream_free_memory_of_expired_messages_and_channels将过期的channel彻底删除;未过期的channel仍处于死缓状态
3.MSG的生成周期

(0)、初始(诞生)
发布消息时产生,同时预设其死亡时间(如果配置中设定msg_ttl则预设生命期为此值,否则
(2)、死刑生存期为0——生成即死亡);设定一个buffer清理定时器(默认为1s)来清理msg。
(1)、死缓
诞生时即等死,在清理buffer时(默认设置为msg诞生1s后)将该消息标记为deleted,扔入messages_to_delete.queue;新队列超长则执行FIFO,最老的MSG判为死刑(标记为deleted,扔入messages_to_delete.queue)。
(3)(4)执行
对于死缓信息,在下一次垃圾清理(ngx_http_push_stream_free_memory_of_expired_messages_and_channels)时将该过期msg彻底删除。对于死刑信息,在buffer清理定时器到期时将其清除
ngx-push-stream模块源码学习(五)——内存清理的更多相关文章
- ngx-push-stream模块源码学习(四)——订阅
一.概述 push stream模块允许三种模式的订阅者: longpolling:每收到服务端响应数据即断开连接然后迅速重连,连接耗时可以忽略 stream:与服务端保持长连接,持续不断的请求-&g ...
- nginx-push-stream模块源码学习(三)——发布
一.概述 发布:发布者将MSG post到某一特定通道上,channel将信息缓存 在说明发布流程之前有必要说明下channel和msg的数据结构. 二.数据结构 2.1 MSG 发布 ...
- nginx-push-stream模块源码学习(二)——模块初始化
本文重点介绍push stream模块的构成,至于nginx如何启动.维护该模块不会详细阐述,以后有时间会做详细阐述. 一.模块定义 1.1. 模块配置 通用nginx模块的配置struct有三种, ...
- spring源码学习五 - xml格式配置,如何解析
spring在注入bean的时候,可以通过bean.xml来配置,在xml文件中配置bean的属性,然后spring在refresh的时候,会去解析xml配置文件,这篇笔记,主要来记录.xml配置文件 ...
- [spring源码学习]五-BeanPostProcessor的使用
一.接口描述 spring提供了一个接口类-BeanPostProcessor,我们叫他:bean的加工器,应该是在bean的实例化过程中对bean做一些包装处理,里边提供两个方法 public in ...
- Python 源码学习之内存管理 -- (转)
Python 的内存管理架构(Objects/obmalloc.c): _____ ______ ______ ________ [ int ] [ dict ] [ list ] ... [ str ...
- ngx-push-stream模块源码学习(一)——序言
一.概述 与传统的request-response的web应用模式不同,comet是一种长连接(long-held)的应用模式,从而允许服务端主动向客户端推送数据. 主流的comet技 ...
- co模块源码学习笔记
// Sorrow.X --- 添加注释,注释纯属个人理解 /** * slice变量 引用 数组的 slice方法 */ var slice = Array.prototype.slice; /** ...
- 【 js 模块加载 】深入学习模块化加载(node.js 模块源码)
一.模块规范 说到模块化加载,就不得先说一说模块规范.模块规范是用来约束每个模块,让其必须按照一定的格式编写.AMD,CMD,CommonJS 是目前最常用的三种模块化书写规范. 1.AMD(Asy ...
随机推荐
- oracle处理节点之间的父子关系
通常当与树的结构之间的关系处理,这是一个很复杂的事情,我们可以通过程序代码去逐层遍历父或子节点,这样做的缺点是很明显,效率不高,操作复杂性是比较大的.而当我们使用Oracle当数据库,我们可以有一个简 ...
- POJ 3373 Changing Digits 好蛋疼的DP
一開始写的高位往低位递推,发现这样有些时候保证不了第四条要求.于是又開始写高位往低位的记忆化搜索,又发现传參什么的蛋疼的要死.然后又发现高位開始的记忆化搜索就是从低位往高位的递推呀,遂过之. dp[i ...
- 走进windows编程的世界-----windows进程
Windows进程 1 Windows进程 进程是一个容器,包括了一个应用程序实例的各种资源.Windows多任务的操作系统,因此能够同一时候运行多个进程. 2 Windows进程的 ...
- PDF.NET SOD Ver 5.1完全开源
PDF.NET SOD Ver 5.1完全开源 前言: 自从我2014年下半年到现在的某电商公司工作后,工作太忙,一直没有写过一篇博客,甚至连14年股票市场的牛市都错过了,现在马上要过年了,而今天又是 ...
- CSS3可按进度变色的进度条
原文:CSS3可按进度变色的进度条 今天是周末,看到一款利用CSS3实现的进度条应用,觉得非常棒,就将它分享给大家,并且将这款CSS3进度条的实现过程大致整理了一下,实现的关键是根据当前的进度需要能改 ...
- VS代码生成工具ReSharper发布8.1版本
ReSharper是一个著名的VS代码生成工具,能帮助VS成为一个更佳的IDE.JetBrains公司今天发布了ReSharper最新版本8.1. 本次新版本更新涉及到打印稿.与VS2013集成.代码 ...
- ubuntu14.04无法播放更新后完善的解决方案
-------------------------------------- 前几天的ubuntu升级14.04该,(Kubuntu版本)时间去更新一下系统..结果没有声音了,网络视频也看不了了.百度 ...
- Bootstrap Paginator分页插件
Bootstrap Paginator分页插件使用示例 最近做的asp.netMVC项目中需要对数据列表进行分类,这个本来就是基于bootstrap开发的后台,因此也就想着bootstrap是否有分页 ...
- js 计算过去和未来的时间距离现在多少天?
计算传入的任意一时间.计算出这个时间距离现在还有多少天!或者计算过去的时间距离现在已经过去了多少天! 返回值有两种! 1.负值 代表过去了多少天 2.正值 代表距离设定的时间还有多少天 说明:距离设定 ...
- 《互联网初创企业password》书评
今天试用了一下<互联网初创企业password>这本书.我觉得这本书开始的很真实,从学校刚毕业那会儿.它是生命,他们的牛b时间,一直想做点什么来证明自己.具体地,并且现在是在最好的时候.互 ...