痛苦的epoll+线程池实践 1 程序架构

本文关键字:连接  程池  关闭  队列  使用  业务  摸索  架构 


 
  感谢 《经验实在太重要了:epoll的一些补充
  我陷在epoll摸索的泥潭中,没有这个文章,不知道何时才能脱身;

  公司游戏网关原来使用单线程poll,从整体需求来说,支持 4000 在线客户端即可,初步感觉原有架构已足够使用;有瓶颈的话,适当调优即可;
  但是老大拍脑袋决定使用 epoll+线程池,个人又非常想摸索一下 epoll,而且这对提高系统性能有很大帮助,所以何乐而不为呢;

  实践中发现 epoll+线程池 自己摸索就很折腾,再加上把业务逻辑做到网关(每个连接绑定系统唯一UserName、如有重复登录需踢掉旧连接、连接

断开需通知到在线服务器),整个过程充满艰辛;
  一开始精力都耗费在多线程的业务逻辑上,如果程序从头写起,估计思路会清晰点;

  程序整体架构,分三块: 1、主线程 epoll;  2、线程池业务处理;  3、异步关闭连接线程
  主要数据结构:1、连接会话 ConnSession,包含 fd, 绑定username,数据缓存; 2、fd可读队列 3、连接会话ConnSession 关闭队列

  主线程:负责响应 epoll事件,将可读的fd 写到队列;
  线程池业务处理:阻塞在可读fd队列;有可读fd取出,根据fd 找到相应的 ConnSession,并做读取数据到ConnSession数据缓存,同时找到需转发

的ConnSession,转发;
  标志ConnSession 的关闭:任何有异常的连接,不能直接关闭及delete相应的ConnSession实例(因为线程池并发查找、处理ConnSession);应先从

epoll清除该连接fd,同时将该ConnSession标识为即将关闭,并入到连接会话ConnSession 关闭队列;
  异步关闭连接线程:阻塞在连接会话ConnSession 关闭队列;判断该ConnSession是否已经标示即将关闭,且最后一次操作的时间需在3、4秒之气;

 如满足这些条件,将队列中的连接会话ConnSession ;否则将该ConnSession 入到队列末尾;


扩展:

keepalived安装教程

Keepalived安装前需要的环境:wget、gcc、opensll、zlib、popt-devel(其中前四个已在Nginx安装配置中讲解过,在此只将popt-devel) (1)popt-devel 用于从外网上下载插件 ①检查系统中是否已y经安装popt,使用命令man popt 若出现下图popt相关描述则说明系统中已经安装popt 若报系统找不到命令说明popt未安装 ②若popt未安装则进行安装,安装命令: yum install –y popt-devel Keepalive......

Android中线程池的使用

本文来自:Amit Shekhar的一篇译文,地址 https://medium.freecodecamp.com/threadpoolexecutor-in-android-8e9d22330ee3#.c451hqaf2本文主要讲解线程池、线程池Executor在Android的使用,并且通过代码片段来覆盖这些主题。 线程池(主要包含线程池和任务队列).线程池管理一池的工作线程(最终数量还得依赖线程池的具体实现)。.任务队列存放等待被线程池中的空闲线程处理的任务,一旦有后台有新的任务等待空......

构建Web应用程序结构

构建Web应用程序结构        这里我们使用一个仅有基本功能的示例来说明EFS,此法也适用于其它相同的逻辑与设计的应用。目的是使外部用户或者内部用户能够通过安全的HTTPS通道来访问数据。这里我们需要配置一个虚拟目录,这样用户不仅可以访问存储于本地的数据,而且还能通过本地web服务器来访问其它服务器。建立虚拟目录增加了配置难度,但其提供我们实际部署要求下的镜像服务。如果只访问本地服务,那实在是微不足道。然而,当需要访问其他服务器上......

我的2013:在程序的路上不断求索

前言每年到这个时候,总需要回顾过去,展望未来。2013这一年学到了很多东西,收货了很多,也成长了很多。主要在技术和生活上面,让自己有了记录一下的冲动。技术在技术上面,这一年接触了很多新的东西,让自己眼界开阔不少,同时也开始自我提升,疯狂的在github上面玩开源,只是很多都惨不忍睹。Openresty今年最开始接触的新东西就是openresty,一个集成nginx的web应用开发框架。最开始,我们项目的架构采用的是前端nginx做proxy,然后将请求反向代理到后端python t......

我的2013---程序员的奋斗历程

   写这篇文章,算是对自己这一年进行一个总结吧,不然会觉得不自在的。   年初的时候,那时候我还只能算是一个大二的学生,在学校呆了一年半了,但我一直都知道要奋斗,努力,利用好一点一滴的时间来学习,提升自己。正月初6,7开始就呆在家里,练习编程,从学校回到家里的时候带了两本书,和我的笔记本,在这里还是介绍一下书的名字,是李兴华的<<java开发实战经典>>和<<javaweb开发实战经典基础篇>>,......

最简单的基于FFMPEG的Helloworld程序

=====================================================最简单的基于FFmpeg的视频播放器系列文章列表:100行代码实现最简单的基于FFMPEG+SDL的视频播放器(SDL1.x)最简单的基于FFMPEG+SDL的视频播放器 ver2 (采用SDL2.0)最简单的基于FFmpeg的解码器-纯净版(不包含libavformat)最简单的基于FFMPEG+SDL的视频播放器:拆分-解码器和播放器最简单的基于FFMPEG的Helloworld程序==......

我的2011--记我的程序员小时代

class Person{public $name;public $age;public $sex;public $home ;public $college;public $job;public $mysex;public function __construct($name,$age,$sex,$home,$college,$job){$this->name = $name;$this->age = $age;$this->sex = $sex;$this->home......

我的2016——初入程序员

       2015年年初,入职了上海一家游戏公司,有20多个人,是一个大公司下面的子公司,刚进入时,公司在做一款3DRPG手游,公司氛围相对轻松。作为一个只有java基础的菜鸟,在公司的那几个月每天都加班到晚上10点,会有公司的同事带着熟悉项目,回到家,差不多晚上11点了吧。       在周末我也会在网上找一些C++的视频来学习,然而,对C++没有一个......

Dream it possible-我的2016

Dream it possible-我的2016I will run, I will climb, I will soar.I'm undefeated听着这首《dream it possible》,我仿佛回到了家乡的群山之巅。 “啊……啊……”,狂风并没有淹没弟弟略带稚嫩却豪情万丈的呐喊,“哥哥,你为什么不喊,喊一喊好舒服!”“啊?山下的人听见了,还以为咱神经病呢!”,其实,我内心已经有一团火在燃烧了,我那时是一个内心火热,表面含羞的男孩。我对弟弟这样说,是想让弟弟给我点“煽动”,因......

我的2016~进击的程序媛

前言:小时候我想,未来要成为一个很文艺的作家,或者一个很机智的主持人,或者一个很干练的律师……或者的或者最后都是后来的事。1、唯一不变的是改变,未来总在计划之外         回顾我的2016,大大小小做了许许多多的选择。最激动人心的在于迈入了IT圈,成为了一枚程序媛。这个职业在我前20年的人生规划里从未料想过的。事实上,人生很多重要的选择都是我在不经意间决定的。或许,我本该是个伤春悲秋的文科生,事实我也曾在填报高考志愿的时......

tensorflow1.1/构建卷积神经网络识别手写数字

环境:python 3 ,tensorflow 1.1 , matplotlib 2.02tensorflow1.1在构建卷积神经网络方面代码大大简化,方便很多,并且将keras作为tensorflow的高级api#coding:utf-8"""python 3 tensorflow 1.1matplotlib 2.02"""import tensorflow as tfimport input_dataimport numpy as npimport matplotlib.pyplot as ......

tensorflow1.1/构建卷积神经网络识别文本

环境:tensorflow 1.1,python3#coding:utf-8import numpy as npimport tensorflow as tfimport pickle#import matplotlib.pyplot as pltwith open('sentiment_set.pickle','rb') as f: [test_data,test_labels,train_data,train_labels] = pickle.load(f)#shuffle d......

tensorflow构建神经网络文本分类2

完成前面博客中配置好的环境:ubuntu14.04,tensorflow1.1 ,python3,matplotlib 2.02利用神经网络对文本进行分类#coding:utf-8from create_sentiment_featuresets import create_feature_sets_and_labelsimport numpy as npimport tensorflow as tfimport pickleimport matplotlib.pyplot as plt#从pi......

tensorflow1.1/构建卷积神经网络人脸识别

环境:tensorflow1.1,python3,matplotlin2.02olivettifaces是纽约大学的一个比较小的人脸库,由40个人的400张图片构成,即每个人的人脸图片为10张。每张图片的灰度级为8位,每个像素的灰度大小位于0-255之间,每张图片大小为64×64。图片大小是1190*942,一共有20*20张人脸,故每张人脸大小是(1190/20)*(942/20)即57*47=2679本文所用的训练数据就是这张图片,400个样本,40个类别。#coding:utf-8"""p......

Retrofit结合RxJava的一次实践

公司的一个项目中已经采用了Retrofit加RxJava的作为网络请求框架,强大的框架所以替换了那么久决定记录一下我的实践过程。第一步,观察服务器返回的结果定义返回结构实体类{ "errno": 0, "errmsg": "操作成功", "data": []}所以我们可以定义个NetResponse< T >来作为一次服务器返回结果实体类其中的T是对应返回json中的data字段,可以是一个对象或者是一个列表结果,所以定义一个实体类出来。public class N......

tensorflow构造神经网络拟合数据

#coding:utf-8"""构造神经网络拟合数据"""import tensorflow as tfimport numpy as npimport matplotlib.pyplot as plt#构造神经网络(正向构造)def add_layer(inputs,in_size,out_size,activation_function=None): Weights = tf.Variable(tf.random.normal([in_size,out_size],mean=0,std......

我的2011之—混迹于中等城市的.net程序员

       眼瞅着走过了2011年,过了这一年我就奔三了。      2011年完成了几件大事:生了儿子,买了房子。按说这生活的本质在逐步体现,小日子也算凑合吧。可是怎么确无法高兴起来。到底是为什么呢?说来话就长了。。。      08年进入了一家对日外包的公司,当时在学校自学的.net,进入公司后主要和团队完成一个物业管......

我的2011年总结--大明zeroson程序员一周年总结

          花絮:看到csdn举办“我的2011”年度征文活动,我恰好工作也一年多了,上个月写了篇博客,主要是我换工作方面的流水账,这篇我从主观、客观、多方位地谈谈我这一年的变化。        从大四实习到毕业这一年多,我被社会这个大染缸已经磨练成熟多了,不再害怕辞职找工作这个过程了,不再害怕加班了,不再害怕上级批评的......

我的2016——小程序员的碎碎念

2016,感觉这一年过的好快,还没多习惯手写2016这数字,2017年就要来了。回顾这年,有很多新鲜的体验:在课堂完成自己所以为会失败的作品;第一次出国感受到不同的异族文化;离开校外迈入社会;进入工作的慌张,彷徨直至现在的对自己的定位明朗。我想真是有太多可以说明的,看来这一年发生了很多事,因为新鲜,让这一年成为我目前生命里又一浓墨重彩的一年。挺好的。2016年上半年在思考自己的这一年有什么特别印象深刻的事情时,我一下子就想到自己大三下学期的大作业了。当时老师的肯定给了我很大的成就感,当时大家选题......

我的2016——程序员年到三十,工作第四年

    看到CSDN《“我的2016”主题征文活动》已经是1月6号,而截止时间是1月8号,对比去年的总结是在闲等活动开始,今年在时间上真的是天差地别。但是,一年到头,还是需要花些时间来回顾这一年,特别是在年到三十,在一家公司工作的第四年,结婚的第四个年头。工作    在网络上经常见到有个说法,在一家公司稳定工作三年后才多少有些积累,一般建议三年后才考虑跳槽。我从毕业到公司,一直稳定的工作到了第四年,开始慢慢理解其中的缘由,也见证着铁打的营盘,流水的兵;&n......