- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
spServerr的架构
从spserver看HS-HA模式 2009-05-17 18:17 序 在互联网企业里,*nux下的C/C++编程主要的焦点还是server开发,关于不同的server模型,在UNP第30章里有过简单的讨论,这里得出的结论就是多线程和多进程的server模型效率较高。但书中缺乏对多路复用机制的讨论,而当前主流的server模型则是epoll+multi-threads/multi-processes,lighttpd就属于这种模型。本文将探讨一个更加高效的server模型,half-synchorize/half-asynchorize模式。 half-sync/half-async模型 此模式最早是由著名的C++网络编程框架ACE的作者的一篇文章,其主要思想就是用异步的方式来处理IO事件,而用同步的方式来处理业务逻辑,同步和异步之间使用一个队列作为缓冲,如下图: 此模型详细介绍可参考原文。 spserver简介 引用作者对spserver的介绍:spserver 是一个实现了半同步/半异步(Half-Sync/Half-Async)和领导者/追随者(Leader/Follower) 模式的服务器框架,能够简化 TCP server 的开发工作。并且spserve使用了libevent作为底层的异步响应机制的实现。 我抱着一种学习的态度,阅读了其half-sync/half-async模式的实现代码,本文也可以看做是一篇spserver的源码分析。 代码结构 1) spserver:主文件,程序从start方法里启动。 2) speventcb:主要的回调函数实现逻辑。 3) spsession:代表一个会话。 4) sprequest:封装了客户端ip和messageDecoder,个人认为封装的不好。 5) spresponse:封装了响应的内容。 6) spiochannel:封装底层IO。 7) spmsgdecoder:消息解析器,判断消息是否完整。 8) spbuffer:对libevent里的buffer的简单封装。 9) spthread、spthreadpool、spexecutor:线程池的封装。 代码分析 spsession代表一个连接的会话,它属于half-sync/half-async模型的3层结构中的queue,业务逻辑和网络IO通过session中的input buffer和output list来通信。 先来看一下SP_Session类的成员: SP_Sid_t mSid; //session id,详见下一节 ???? struct event * mReadEvent; //和session关联的读写事件 ???? struct event * mWriteEvent; ???? SP_Handler * mHandler; //用户实现业务逻辑的handler ???? void * mArg; //event args ???? SP_Buffer * mInBuffer; //输入缓冲队列 ???? SP_Request * mRequest; //对请求的封装 ???? int mOutOffset; //输出偏移量,以字节为单位,表明out list中已输出的字节数 ???? SP_ArrayList * mOutList; // list of msg,输出的缓冲队列 ???? char mStatus; //当前session的状态,可为eNormal, eWouldExit, eExit ???? char mRunning; //是否在运行 ???? char mWriting; //是否在写 ???? char mReading; //是否在读 ???? unsigned int mTotalRead, mTotalWrite; //本session已读写的字节数 ???? SP_IOChannel * mIOChannel; //关联的IOChannel session是通过SP_SessionManager来进行管理的,它实际上是一个64*1024的二维数组,entry的类型定义如下: typedef struct tagSP_SessionEntry { ???? uint16_t mSeq; ???? uint16_t mNext; ???? SP_Session * mSession; } SP_SessionEntry; 其中每个entry都是通过一个key来标识其在matrix中的坐标,key=1024*row+col,而seq标识这个entry被使用过多少次,通过key和seq就可以形成一个ssion id了。entry中的mNext成员指向list中下
有哪些信誉好的足球投注网站
文档评论(0)