大型分布式C++框架《四:netio之请求包中转站 上》
本来一篇文章就该搞定的。结果要分上下篇了。主要是最近颈椎很不舒服。同时还在做秒杀的需求也挺忙的。 现在不能久坐。看代码的时间变少了。然后还买了两本治疗颈椎的书。在学着,不过感觉没啥用。突然心里好害怕。如果颈椎病越来越重。以后的路怎么走。
现在上下班有跑步,然后坐一个小时就起来活动活动。然后在跟着同时们一起去打羽毛球吧。也快30的人了。现在发觉身体才是真的。其他都没什么意思。兄弟们也得注意~~
废话不多说。下面介绍下netio。
netio在系统中主要是一个分包的作用。netio本事没有任何的业务处理。拿到包以后进行简单的处理。再根据请求的命令字发送到对应的业务处理进程去。
一、多进程下的socket epoll以及“惊群现象”
1)比如我们想创建三个进程同时处理一个端口下到来的请求。
首先如果一个端口正在被使用,无论是TIME_WAIT、CLOSE_WAIT、还是ESTABLISHED状态。 这个端口都不能被复用,这里面自然也是包括不能被用来LISTEN(监听)。所以在三个进程里分别listen和bind端口肯定会失败的
因为SO_REUSEADDR允许在同一端口上启动同一服务器的多个实例,只要每个实例捆绑一个不同的本地IP地址即可。对于TCP,我们根本不可能启动捆绑相同IP地址和相同端口号的多个服务器。
netio起5个进程
james 2356 1 0 08:22 pts/0 00:00:00 ./netio netio_config.xml james 2357 2356 0 08:22 pts/0 00:00:00 ./netio netio_config.xml james 2358 2356 0 08:22 pts/0 00:00:00 ./netio netio_config.xml james 2359 2356 0 08:22 pts/0 00:00:00 ./netio netio_config.xml james 2360 2356 0 08:22 pts/0 00:00:00 ./netio netio_config.xml
after epoll_wait pid:2358 after epoll_wait pid:2358 after epoll_wait pid:2358 after epoll_wait pid:2358 after epoll_wait pid:2358 after epoll_wait pid:2358 after epoll_wait pid:2358 after epoll_wait pid:2358 after epoll_wait pid:2358 after epoll_wait pid:2358
after epoll_wait pid:2358 after epoll_wait pid:2358
这个时候我们客户端fork8个进程并发请求服务。发现2357和2358开始交替处理
after epoll_wait pid:2358 after epoll_wait pid:2358 after epoll_wait pid:2357 after epoll_wait pid:2358 after epoll_wait pid:2357 after epoll_wait pid:2358 after epoll_wait pid:2357 after epoll_wait pid:2358
after epoll_wait pid:2358 after epoll_wait pid:2357 after epoll_wait pid:2359 after epoll_wait pid:2356 after epoll_wait pid:2360
1
|
after epoll_wait pid:2358
|
当我们并发两个请求的时候。发现唤醒了两个进程
after epoll_wait pid:2357 after epoll_wait pid:2359
中所以其他进程一直recvfrom =-1
的进程不够及时。这个消息没处理。epoll的特性是会一直通知进程来处理。所以其他进程会一直读自己的unix域。然后就一直recvfrom =-1
二、netio之定时器
const uint32_t DEFAULT_QUEUE_LEN = 1 + 64;m_pNodeHeap = new CNode*[DEFAULT_QUEUE_LEN];
struct CNode {CNode(ITimerHandler *pTimerHandler = NULL, int iTimerID = 0) : m_pTimerHandler(pTimerHandler), m_iTimerID(iTimerID), m_dwCount(0) , bEnable(true){ }ITimerHandler *m_pTimerHandler;int m_iTimerID;CTimeValue m_tvExpired; // TimeValue for first checkCTimeValue m_tvInterval; // Time check intervalunsigned int m_dwCount; // Counter for auto re-schedulebool bEnable; };
m_pTimerHandler 主要是用来保存父类指针。当时间事件触发的时候。通过父类指针找到继承类。来处理具体的 时间事件 m_tvExpired 记录过期时间。比如一个事件过期时间是10秒。那么m_tvExpired就是存的当前时间+10秒这个值。每次比较的时候。拿最小堆的的这个值跟当前时间比对。如果当前时间小于m_tvExpired说明 没有任何时间时间被触发。如果当前时间大于这个值。则认为需要处理时间事件 m_dwCount 这个是用来设置自动过期时间的次数。比如我们有一个时间事件。我们希望它执行三次。每次的间隔以为1分钟。那么这个值设置为3. 当第一次到达时间时间的时候。我们发现这个值大于0.则对m_tvExpired赋值当前时间+1分钟 重新进入最小堆。然后m_dwCount减一。 下次依然是这样处理。直到m_dwCount这个值到0.我们就认为不需要再自动给这个时间设置定时任务。 bEnable 这个值是用来判断这个事件事件是否还有效。这里的做法很有意思。当一个时间事件执行完。或者不需要的时候。我们先是帮它设置为false.等下次check时间最堆的时候。如果发现这个时间事件是无效的。这个时候在delete m_tvInterval 这个是时间事件的间隔时间。比如我的时间事件是每10秒执行一次。则这个值就设置为10秒 m_iTimerID 这个是时间事件的唯一ID这个值是自增的。每来一个新时间事件。m_iTimerID都会+1. 因为初始化的时候。这个值为1了。所以最开始的时间事件m_iTimerID的值为2
if (dwCount > 0)m_l_pNode->m_dwCount = dwCount;elsem_l_pNode->m_dwCount = (unsigned int)-1;
三、netio 之日志分析
最后:
1)对大型系统。统计日志很重要。可以时事了解系统的状态
2)一定要处理好多进程的关系
3)最后 一定要保护好身体。 身体才是根本啊~~~
大型分布式C++框架《四:netio之请求包中转站 上》相关推荐
- 大型分布式C++框架《三:序列化与反序列化》
一.前言 个人感觉序列化简单来说就是按一定规则组包.反序列化就是按组包时的规则来接包.正常来说.序列化不会很难.不会很复杂.因为过于复杂的序列化协议会导致较长的解析时间,这可能会使得序列化和反序列化阶 ...
- 分布式服务框架-原理与实践:14---流量控制-学习笔记(理论篇)
2019独角兽企业重金招聘Python工程师标准>>> 上次学了灰度发布,这次我们学习流控. ============================================ ...
- 分布式任务调度框架XXL-JOB --配置部署
配置部署"调度中心" 调度中心项目:xxl-job-admin 作用:统一管理任务调度平台上调度任务,负责触发调度执行,并且提供任务管理平台. 步骤一:调度中心配置: 调度中心配置 ...
- 搭建大型分布式服务(十四)SpringBoot整合dubbo starter
一.本文要点 接上文,我们已经把SpringBoot整合mybatis+Hikari+es+redis+kafka了,本文将介绍SpringBoot如何整合dubbo.系列文章完整目录 dubbo注解 ...
- dubbo-快速入门-分布式RPC框架Apache Dubbo
文章目录 分布式RPC框架Apache Dubbo 1. 软件架构的演进过程 1.1 单体架构 1.2 垂直架构 1.3 SOA架构 1.4 微服务架构 2. Apache Dubbo概述 2.1 D ...
- 深度解析大型分布式电商网站演变过程以及构架部署解决方案
前言: 本文是学习大型分布式网站架构的技术总结.对架构一个高性能,高可用,可伸缩,可扩展的分布式网站进行了概要性描述,并给出一个架构参考.一部分为读书笔记,一部分是个人经验总结.对大型分布式网站架构有 ...
- 分布式服务框架XXL-RPC
<分布式服务框架XXL-RPC> 一.简介 1.1 概述 XXL-RPC 是一个分布式服务框架,提供稳定高性能的RPC远程服务调用功能.拥有"高性能.分布式.注册中心. ...
- 腾讯资深架构师干货总结:一文读懂大型分布式系统设计的方方面面
1.引言 我们常常会听说,某个互联网应用的服务器端系统多么牛逼,比如QQ.微信.淘宝.那么,一个大型互联网应用的服务器端系统,到底牛逼在什么地方?为什么海量的用户访问,会让一个服务器端系统变得更复杂? ...
- 分布式事务框架seata介绍
分布式事务框架seata介绍 一 . 事务特性(ACID) 1.原子性(A) 在整个事务中的所有操作,要么全部完成,要么全部不做,没有中间状态.对于事务在执行中发生错误,所有的操作都会被回滚,整个事务 ...
最新文章
- Activiti——工作流程-核心API(二)
- 20101029总结
- King of Range
- springboot系列十五、springboot集成PageHelper
- 清空运行中的jar 日志_Java日志体系权威总结
- 春眠不觉晓,SQL 知多少?| 原力计划
- flume-sink
- JS---DOM操作有哪一些
- python访问服务器注册表,使用Python的Windows注册表访问(Winreg)
- 计算机控制中的pid是什么意思,PID代表的是什么意思?
- 360无线网卡驱动 linux驱动,小度Wifi、360Wifi Windows、linux驱动
- 医咖会免费SPSS教程学习笔记—非参数检验之两相关样本
- 从零开始 DIY 智能家居 - 基于 ESP32 的智能语音合成播报模块
- 软件测试工程师离职原因_这就是软件工程师不离职的原因
- k8s中安装traefix并配置dashboard访问权限
- (转)Weblogic 8.1的安装与配置
- python解析_第107天: Python 解析 PDF
- 葡萄城报表模板库再次更新!补充医院Dashboard及房地产销售行业报表
- 基于协同过滤算法的商品推荐购物电商系统
- ubuntu, xftp 命令安装 testlink (xampp-linux-x64-5.5.3,Linux Un 5.4.0-39)
热门文章
- python普通菜单_python多级菜单
- vim一直以来的切换命令行窗口(term)执行程序的烦恼终于由8.1版本的一个命令解决了
- 看漫画学python 豆瓣_看漫画就能学好python?
- e开头的正则 php,PHP正则表达式e模式
- 德云斗笑社何九华为什么没参加_江西省会为什么是南昌?
- php resultset用法,PHP PDOStatement::nextRowset讲解
- 使用 cout 输出数据之控制输出格式(二)
- AWS的EC2上构建一个爬虫
- 【设计模式】基本概念
- 【吉林】2021年下半年软考报考时间及通知