??xml version="1.0" encoding="utf-8" standalone="yes"?>久久国产色AV免费看,色综合久久夜色精品国产,久久国产亚洲精品http://www.shnenglu.com/yangsf5/archive/2014/04/26/206724.htmlSheppard YSheppard YSat, 26 Apr 2014 08:05:00 GMThttp://www.shnenglu.com/yangsf5/archive/2014/04/26/206724.htmlhttp://www.shnenglu.com/yangsf5/comments/206724.htmlhttp://www.shnenglu.com/yangsf5/archive/2014/04/26/206724.html#Feedback0http://www.shnenglu.com/yangsf5/comments/commentRss/206724.htmlhttp://www.shnenglu.com/yangsf5/services/trackbacks/206724.html
2016-07-12 日更?nbsp;
此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?/span>
http://blog.clawz.me/2014/04/26/14-docker-usage-research/

 一、背?
     目里编译打包客LE序时经常出现问题,有环境不一致问题或者代码冲H问题?/div>
     之前了解q?a >docker可以应用环境作ؓ一个一体化的服务来使用Q所以想看看docker是否能给我们客户端同学提供些方便?/div>
二、主要关注点
Q一Qdocker能运行在哪些操作pȝQmac、linux、windowsQ?/div>
     都可以,docker现在release?.10.0版了Q还没到1.0的正式版。官方不推荐当前的dockerq用在生产环境中?/div>
     docker内部开发是在ubuntu上进行了Q所以ubuntu上支持最好。mac和windowsq些的dockerq行方式Q现在是在操作系l上装虚拟机Q如VirtualBoxQ,再在虚拟机里q行使用docker?/div>
Q二Qdocker容器里能q行什么环境,mac、linux、windowsQ?/div>
     docker里能q行的系l称为imageQ目前image大多是linux。这也挺正常的,mac os x和windows都是商业收费的,怎么可能随便让搭建image?/div>
     所以我想用docker来服务我们客L环境搭徏的话Qimage的事情还得自己搞下?/div>


Sheppard Y 2014-04-26 16:05 发表评论
]]>claw设计草稿http://www.shnenglu.com/yangsf5/archive/2014/03/31/206404.htmlSheppard YSheppard YMon, 31 Mar 2014 03:09:00 GMThttp://www.shnenglu.com/yangsf5/archive/2014/03/31/206404.htmlhttp://www.shnenglu.com/yangsf5/comments/206404.htmlhttp://www.shnenglu.com/yangsf5/archive/2014/03/31/206404.html#Feedback0http://www.shnenglu.com/yangsf5/comments/commentRss/206404.htmlhttp://www.shnenglu.com/yangsf5/services/trackbacks/206404.html
2016-07-12 日更?nbsp;
此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?br />
http://blog.clawz.me/2014/03/31/14-claw-design/

一、目?/span>
     参考云风skynetQ实现go版本的开源服务器引擎?/div>
二、细?/div>
Q一Q服?/div>
     按服务来拆模块的好处不说了。只说go来的实现方式。go里有channel和goroutine。消息队列和轻量U线E都天然解决了?/div>
Q二Q服务间的通信
     同进E内的服务之间通信Q直接往Ҏchannel发消息即可。不同进E里靠各q程自己的harbor服务来{发。harbor服务来负责集间的通信?/div>
     集群里设|一个master服务来做全局的名字服务,主要用于登记和同步集里各个q程开启的各个服务。所有harbor启动后向master注册自己Qmaster向所有harborq播同步新加入的q个机器?/div>
Q三Q组?/div>
     l常需要向某几个服务广播一个消息,l播问题。multicast服务来管理组播?/div>
Q四Q日?/div>
     使用glog?/div>
三、已实现的服?/div>
Q一Qmaster和harbor
     暂时master做ؓharbor的中心控制器的。后l会改进Q做成harbor之间两两通信Q减对master的单点依赖?/div>
Q二Qgate
     gate用来做通常的网l监听用。目前的很简单,用户需要向q个服务器注册自q包解析和处理器?/div>
Q三Qweb
     web负责http的监听,template的加载cacheQ几个通用函数的提取?/div>
四、ps
     目地址Q?a >https://github.com/yangsf5/claw


Sheppard Y 2014-03-31 11:09 发表评论
]]>express的session中间件sessionID问题http://www.shnenglu.com/yangsf5/archive/2014/02/28/205993.htmlSheppard YSheppard YFri, 28 Feb 2014 07:35:00 GMThttp://www.shnenglu.com/yangsf5/archive/2014/02/28/205993.htmlhttp://www.shnenglu.com/yangsf5/comments/205993.htmlhttp://www.shnenglu.com/yangsf5/archive/2014/02/28/205993.html#Feedback0http://www.shnenglu.com/yangsf5/comments/commentRss/205993.htmlhttp://www.shnenglu.com/yangsf5/services/trackbacks/205993.html
2016-07-12 日更?nbsp;
此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?/span>
http://blog.clawz.me/2014/02/28/14-express-session-id-problem/

     session中间仉的sessionIDQ以下简UsidQ的法?4byte的全随机。sid重复的可能性比较小Q但理论上还是有重复的可能?/span>
     session中间件的sessionl护程为:
Q一Q新session的创?/div>
Q?Q将option里配的sessionStore挂到req上;
Q?Q修改res.end函数Q在原函数基上加入req.session.save操作Q就是往sessionStore里存sessionQ;
Q?Q新session的接入,因ؓ是新sessionQ所以cookie里没有sid信息。随Z个sidQ以此sid来创建sessionQ然后将sessionl到req上;然后req和res交给下个中间件或程处理?/div>
Q二Q旧session接入
Q?Q同上边的第Q?Q步Q?/div>
Q?Q同上边的第Q?Q步Q?/div>
Q?Qcookie里有sidQ根据这个sid去sessionStore里取回session信息Q如果sessionq期取不到session了,像上边的(3Q里那样重新创徏一个session?/div>
     Z完全消除sid的重复性带来的影响Q就要检查新创徏的sid是否已经存在与sessionStore里了?/div>
     session中间件的l构在express的以后版本中q会修改Q所以我不想动session中间件的源码。于是只能在新session创徏后的我自q逻辑程中来处理。逻辑程中,当http包ؓ登陆验证包时Q将session中间件给创徏的session的sid拿到sessionStore里去查下是否已被使用Q如果用就q掉当前sessionQƈ通知当前客户端重试?/div>
     q掉当前session有个技巧,是直接Qreq.session=null;Q这样即可,因ؓ修改后的res.end里,判断如果req.session未定义,׃会再去调用req.session.save了。当前session是一定不能让他save的,否则拿当前用户的信息覆盖了之前用此sid的用P造成那个用户后箋逻辑混ؕ?/div>


Sheppard Y 2014-02-28 15:35 发表评论
]]>了解云风的skynethttp://www.shnenglu.com/yangsf5/archive/2014/01/16/205413.htmlSheppard YSheppard YThu, 16 Jan 2014 03:25:00 GMThttp://www.shnenglu.com/yangsf5/archive/2014/01/16/205413.htmlhttp://www.shnenglu.com/yangsf5/comments/205413.htmlhttp://www.shnenglu.com/yangsf5/archive/2014/01/16/205413.html#Feedback0http://www.shnenglu.com/yangsf5/comments/commentRss/205413.htmlhttp://www.shnenglu.com/yangsf5/services/trackbacks/205413.html
2016-07-11 日更?nbsp;
此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?/span>
http://blog.clawz.me/2014/01/16/14-cloudwu-skynet-research/



QPS开始应用《暗旉》里提到的理论,skynet用自q话来ȝq写下来Q这栯充分思考ƈ转述q记忆U烦Q?/p>


一、skynet设计的理?/p>

Q一Q单个skynet节点

Q?Q愿?/p>

    充分利用多核。最初想法是多进E。像׃nodejs里多核就只能是多q程了,因ؓ每个nodejsq程是单U程的?br />

    多进E是遵@unix设计哲学Q工具链形式Q分拆进E的形式来分拆模块,减少复杂度和耦合性,方便~程及维护?br />

    后来云风他们发现lua做ؓ嵌入式脚本,写逻辑时很好用的,反正如何都要用luaQ而且lua提供了沙盒,q样多进E可以变为单q程多个沙盒Q这L合了多进E和单进E多U程的优ѝ多U程里共享资源,在同一q程地址I间Q访问更高效?br />


Q?Q核心功能(门房Q)

    很精Q仅解决一个问题?/p>

    skynet里不实现具体游戏逻辑Q后者些攑ֈ一个一个动态库里(so文gQ。skynet这些so注册到自己里边,每个so一个永不重复的idQ类g数据库的autoincreament。看描述q个id是skynet自己q行时当ơ维护的Q而不是模块配|好ln的id。模块的怹有效唯一标示为名字,skynet提供了名字服务,可以l每个模块取一个易ȝ名字?br />


Q?Q核心不解决什么问?/p>

    skynetd所有服务在同一OSq程协作完成。核心里没跨机通讯Q单个服务的崩溃和重启也没管Q云风表C些应该由上层处理Q他有责L露错误,而不是隐藏?br />

    q个设计的原因,游戏和操作系l不一P操作pȝ默认不信MQ何进E,各进E崩溃什么的不应影响其他q程Q所以某个进E挂了,他就安葬它,而其他进E美好的生活。单游戏是ؓ玩家服务的,某个环节出错都有可能造成玩家利益混ؕQ所以那里错了就整个程Q服务器Q挂掉吧。没有必要让出错模块被隔dQ而其他模块却l箋提供服务导出未预知行为?br />

    上边说的东西应该上层考虑Q用lua的沙盒就能做{略隔离?br />


Q?Qskynetq行旉辑?/p>

    skynet负责且只负责一个数据包从一个服务发送到同一q程的另一个服务里。发送服务直接调发送APIQskynet收到数据包后Q调用接受者服务的注册的callbackQ即发给了接受者服务?br />

    skynet保证在各模块初始化时、每个独立的callback调用Ӟ都是怺U程安全的。这L写服务的人就不需要考虑多线E的M问题了,只需专心处理l他的一个个数据包?/p>

    PSQ天龙的场景lua有点像这里的单个服务。不知天龙的跨线E切场景情况在这里也可以l简化ؓ单线E?Q回头看源码再研I这个问题)


Q?Q消息调?/p>

TODO


Q?Qgate和connection

TODO


Q二Qskynet集群

    集群里最多支?55个skynet节点Q每个skynet节点有一个idQ成为harbor id。这个id是集层面指定,可以Zؓ分配Q也可以׃个中央服务器协调分配?/p>

Q?Q集间通信

    skynet核心层纸负责在往外发消息时在source字段上加上自qharbor id。而集间的通信Q是由单独的harbor服务来做的。skynet是往集群其他节点发的消息Q就转发到harbor内。harbor会跟集群内跟自己l识的skynet的harbor历tcp链接。harbor把消息发l目标harbor?br />

    harbor间的通信为单向的tcp道?br />

    master服务来同步全局的名字服务。每个skynet都会知道其他节点上装配了哪些服务Q好路由q去?br />


Q?Q组?/p>

    TODO



Sheppard Y 2014-01-16 11:25 发表评论
]]>了解MongoDBhttp://www.shnenglu.com/yangsf5/archive/2013/12/05/204608.htmlSheppard YSheppard YThu, 05 Dec 2013 11:07:00 GMThttp://www.shnenglu.com/yangsf5/archive/2013/12/05/204608.htmlhttp://www.shnenglu.com/yangsf5/comments/204608.htmlhttp://www.shnenglu.com/yangsf5/archive/2013/12/05/204608.html#Feedback0http://www.shnenglu.com/yangsf5/comments/commentRss/204608.htmlhttp://www.shnenglu.com/yangsf5/services/trackbacks/204608.html
2016-07-11 日更?nbsp;
此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?/span>
http://blog.clawz.me/2013/12/05/13-mongodb-research/

 


    ​MongoDB为k-v数据库,他们存储方式为BSONQ操作接口基本都是JSONQ查询,搜烦都很方便?/p>

    ​例如mysql里一个表Qid和dataQdata条记录的数据Q数据ؓ了扩展,例如不同的记录的data可能包含很多字段Q且字段不一定相同,以后也会有不类型的字段。这时我把这些不定的字Dencode成一个xml或者json或者protobuf之类的数据流存到data里?/p>

    ​q么做记录的具体数据兌的详l数据扩展很灉|了。但是想搜烦data里的各字D|Q在mysql数据库里׃那么方便了,基本要遍历?/p>

    ​q个时候将q个data备䆾一份到MongoDB里,很方便了。MongoDB里的每条记录Z个key-valueQvalue卛_储我们上边的data。这时我们取data里的字段做条件查询是MongoDB直接支持的?/p>

    ​另外MongoDB支持自动切热备,自动分片{高U功?#8230;…

    ​但是另一斚wQ这个东西出来的不久Q现在还不敢他作ؓ持久化的DB。上边的例子是mysql里有份数据ؓ生环境的依赖数据,备䆾到MongoDB的数据只是ؓ了查询。MongoDB里数据出问题是没关系的?/p>

Sheppard Y 2013-12-05 19:07 发表评论
]]>pomelo源码分析Q?Q?pomelo-synchttp://www.shnenglu.com/yangsf5/archive/2013/12/04/204582.htmlSheppard YSheppard YWed, 04 Dec 2013 06:28:00 GMThttp://www.shnenglu.com/yangsf5/archive/2013/12/04/204582.htmlhttp://www.shnenglu.com/yangsf5/comments/204582.htmlhttp://www.shnenglu.com/yangsf5/archive/2013/12/04/204582.html#Feedback0http://www.shnenglu.com/yangsf5/comments/commentRss/204582.htmlhttp://www.shnenglu.com/yangsf5/services/trackbacks/204582.html
2016-07-11 日更?nbsp;
此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?/span>
http://blog.clawz.me/2013/12/04/13-pomelo-read-source-3/

 


    现在分析的版本ؓ0.7版。pomelo-syncQpomelo里用于解x戏进E中需要持久化的数据在内存与存储系l之间的同步问题?/p>

 

一、pomeloE序如何使用pomelo-sync

    新版本的pomelo里增Z支持用户自行扩展的能力。用户只用在app.use(plugin, opts)可以了Q具体请看pomelo的application.js里的use函数。需要这个plugin里有components成员。use函数里,pomeloplugin的componets所指的lgloadhQƈopts传给q个plugin的components?/p>

    pomelo-sync自n只负责实现db数据与内存数据间的定时同步,所以另一个项目pomelo-sync-plugin将pomelo-sync装成了一个componet。app.use(require('pomelo-sync-plugin', opts)完成了数据同步插g的装载?/p>

 

二、pomelo-sync

    pomelo-sync在构造的时候,参数里的clientQ与持久化层的链接)、mappingQ如各种操作的sql语句的映表Q等赋值给自己的相应成员。最后开启定时刷内存数据到持久化层的计时器SyncTimer?/p>

    对外接口不只在dbsync.js里,q分布在lib/commands下的几个文g里。其中exec/flush/sync{在commands/server.js里?/p>

    

Q一Qpomelo-sync.exec

    pomelo-sync.exec函数Q被用户E序调用。将用户的数据放入pomelo-sync.flushQueue或者pomelo-sync.mergerMap?/p>

 

Q二Qpomelo-sync.flush

    pomelo-sync.flush函数Q将单挑数据立即持久化?/p>

 

Q二Qpomelo-sync.sync

    pomelo-sync.sync函数Q被SyncTimer调用Q也可以被用L序调用,立即全部内存数据持久化。sync函数里调用的是rewriter.js里的sync。rewriter.sync里将pomelo-sync.flushQueue和pomelo-sync.mergerMap里的数据通过rewrite.tick刯持久层。rewriter.tick里是通过pomelo-sync.mapping里的映射调对应的sql语句来实现的?/p>

Sheppard Y 2013-12-04 14:28 发表评论
]]>top里显C的cpu癑ֈ比计方?/title><link>http://www.shnenglu.com/yangsf5/archive/2013/11/07/204148.html</link><dc:creator>Sheppard Y</dc:creator><author>Sheppard Y</author><pubDate>Thu, 07 Nov 2013 11:20:00 GMT</pubDate><guid>http://www.shnenglu.com/yangsf5/archive/2013/11/07/204148.html</guid><wfw:comment>http://www.shnenglu.com/yangsf5/comments/204148.html</wfw:comment><comments>http://www.shnenglu.com/yangsf5/archive/2013/11/07/204148.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/yangsf5/comments/commentRss/204148.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/yangsf5/services/trackbacks/204148.html</trackback:ping><description><![CDATA[<pre style="font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12px; margin-top: 0px; margin-bottom: 0px; color: #333333; line-height: 17.99715805053711px;"><div class="c2oaac4" id="LC1" style="padding-left: 10px;"><div></div><fieldset><legend><span style="color: #ff0000; line-height: 17.9972px;">2016-07-11 日更?/span></legend><div><span style="color:red;">此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?/span><br /><div></div></div><a ><div><div><span style="color:red;">http://blog.clawz.me/2013/11/07/13-top-source/</span></div></div></a></fieldset><a ><div><div></div></div></a><br /><br /> top看到的cpu信息解释的不是很清晰Q就看下源码怎么写的吧?/div><div class="mg4g0es" id="LC2" style="padding-left: 10px;">        E序很简单,基本都在top.c里?/div><div class="mgc4iiu" id="LC3" style="padding-left: 10px;">        load里的cpu详细信息代码如下Q?/div><div class="g8w4ue4" id="LC4" style="padding-left: 10px;"></div><div class="aaawwqi" id="LC5" style="padding-left: 10px;"><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; "> 1</span> <span style="color: #000000; ">smpcpu </span><span style="color: #000000; ">=</span><span style="color: #000000; "> cpus_refresh(smpcpu);<br /></span><span style="color: #008080; "> 2</span> <span style="color: #000000; "><br /></span><span style="color: #008080; "> 3</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (CHKw(Curwin, View_CPUSUM)) {<br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; ">        </span><span style="color: #008000; ">//</span><span style="color: #008000; "> display just the 1st /proc/stat line</span><span style="color: #008000; "><br /></span><span style="color: #008080; "> 5</span> <span style="color: #008000; "></span><span style="color: #000000; ">        summaryhlp(</span><span style="color: #000000; ">&</span><span style="color: #000000; ">smpcpu[Cpu_tot], </span><span style="color: #000000; ">"</span><span style="color: #000000; ">Cpu(s):</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; ">} </span><span style="color: #0000FF; ">else</span><span style="color: #000000; "> {<br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> i;<br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">char</span><span style="color: #000000; "> tmp[SMLBUFSIZ];<br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">        </span><span style="color: #008000; ">//</span><span style="color: #008000; "> display each cpu's states separately</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">10</span> <span style="color: #008000; "></span><span style="color: #000000; ">        </span><span style="color: #0000FF; ">for</span><span style="color: #000000; "> (i </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">; i </span><span style="color: #000000; "><</span><span style="color: #000000; "> Cpu_tot; i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">) {<br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; ">                snprintf(tmp, </span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(tmp), </span><span style="color: #000000; ">"</span><span style="color: #000000; ">Cpu%-3d:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">, smpcpu[i].id);<br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; ">                summaryhlp(</span><span style="color: #000000; ">&</span><span style="color: #000000; ">smpcpu[i], tmp);<br /></span><span style="color: #008080; ">13</span> <span style="color: #000000; ">        }<br /></span><span style="color: #008080; ">14</span> <span style="color: #000000; ">}</span></div></div><div class="s4ysqqc" id="LC21" style="padding-left: 10px;">        </div><div class="ksi6s6a" id="LC22" style="padding-left: 10px;">        Cpu_tot为cpu数量?/div><div class="wc64wgk" id="LC23" style="padding-left: 10px;">        cpus_refresh函数里从/proc/stat文g里读入cpu信息Q然后装入smpcpu里。smpcpu为大ؓCpu_tot+1个CPU_t成员的数l?/div><div class="ssyaguq" id="LC24" style="padding-left: 10px;">        /proc/stat文g的头几行为:</div><div class="c4yqosa" id="LC25" style="padding-left: 10px;"><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">cpu </span><span style="color: #000000; ">%</span><span style="color: #000000; ">d </span><span style="color: #000000; ">%</span><span style="color: #000000; ">d <img src="http://www.shnenglu.com/Images/dot.gif" alt="" /><br />cpu0 </span><span style="color: #000000; ">%</span><span style="color: #000000; ">d </span><span style="color: #000000; ">%</span><span style="color: #000000; ">d <img src="http://www.shnenglu.com/Images/dot.gif" alt="" /><br />cpu1 </span><span style="color: #000000; ">%</span><span style="color: #000000; ">d </span><span style="color: #000000; ">%</span><span style="color: #000000; ">d <img src="http://www.shnenglu.com/Images/dot.gif" alt="" /><br /><img src="http://www.shnenglu.com/Images/dot.gif" alt="" /></span></div></div><div class="a4yui4q" id="LC29" style="padding-left: 10px;">        W一行的cpu信息装入smpcpu[Cpu_tot]Q之后的cpu0\cpu1\...装入smpcpu[0]\smpcpu[1\...?/div><div class="y4s666u" id="LC30" style="padding-left: 10px;">        View_CPUSUMq个?键来控制的那个开养I开兛_闭时只显Csmpcpu的Cpu_totQ开兛_启时昄的是smpcpu的下?~Cpu_tot-1的成员。即Qtop的默认在开头显C的cpu详细信息昄的是/proc/stat的第一行处理后Q按?键,昄的时/proc/stat后箋各cpu数据?/div><div class="46saiou" id="LC31" style="padding-left: 10px;">        /proc/stat里都是数字,下边看看top里显C的癑ֈ比怎么的?/div><div class="246ie4g" id="LC32" style="padding-left: 10px;"></div><div class="cmemue6" id="LC33" style="padding-left: 10px;">        CPU_t的定义:</div><div class="swuskya" id="LC34" style="padding-left: 10px;"><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; "> 1</span> <span style="color: #008000; ">//</span><span style="color: #008000; "> These typedefs attempt to ensure consistent 'ticks' handling</span><span style="color: #008000; "><br /></span><span style="color: #008080; "> 2</span> <span style="color: #008000; "></span><span style="color: #000000; ">typedef unsigned </span><span style="color: #0000FF; ">long</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">long</span><span style="color: #000000; "> TIC_t;<br /></span><span style="color: #008080; "> 3</span> <span style="color: #000000; ">typedef          </span><span style="color: #0000FF; ">long</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">long</span><span style="color: #000000; "> SIC_t;<br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; "><br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; "> This structure stores a frame's cpu tics used in history<br /></span><span style="color: #008080; "> 6</span> <span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; "> calculations.  It exists primarily for SMP support but serves<br /></span><span style="color: #008080; "> 7</span> <span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; "> all environments.</span><span style="color: #008000; "><br /></span><span style="color: #008080; "> 8</span> <span style="color: #008000; "></span><span style="color: #000000; ">typedef </span><span style="color: #0000FF; ">struct</span><span style="color: #000000; "> CPU_t {<br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">        TIC_t u, n, s, i, w, x, y, z; </span><span style="color: #008000; ">//</span><span style="color: #008000; "> as represented in /proc/stat</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">10</span> <span style="color: #008000; "></span><span style="color: #000000; ">        TIC_t u_sav, s_sav, n_sav, i_sav, w_sav, x_sav, y_sav, z_sav; </span><span style="color: #008000; ">//</span><span style="color: #008000; "> in the order of our display</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">11</span> <span style="color: #008000; "></span><span style="color: #000000; ">        unsigned id;  </span><span style="color: #008000; ">//</span><span style="color: #008000; "> the CPU ID number</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">12</span> <span style="color: #008000; "></span><span style="color: #000000; ">} CPU_t;</span></div></div><div class="iew42oc" id="LC48" style="padding-left: 10px;">        每次?proc/stat取的数据UCؓ一帧的数据Q会从到CPU_tl构体的W一行成员里Q上ơ的数据即上一帧的数据拷到CPU_t的第二排带_sav后缀的成员里Q一一对应?/div><div class="wwmic6s" id="LC49" style="padding-left: 10px;">        summaryhlp函数里计我们想看的cpu各详l指标的癑ֈ比。只取部分代码或伪码做演C:</div><div class="s4egg6c" id="LC50" style="padding-left: 10px;"><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; "> 1</span> <span style="color: #000000; ">SIC_t u_frme, s_frme, n_frme, i_frme, w_frme, x_frme, y_frme, z_frme, tot_frme, tz;<br /></span><span style="color: #008080; "> 2</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">float</span><span style="color: #000000; "> scale;<br /></span><span style="color: #008080; "> 3</span> <span style="color: #000000; ">u_frme </span><span style="color: #000000; ">=</span><span style="color: #000000; "> cpu</span><span style="color: #000000; ">-></span><span style="color: #000000; ">u </span><span style="color: #000000; ">-</span><span style="color: #000000; "> cpu</span><span style="color: #000000; ">-></span><span style="color: #000000; ">u_sav;<br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; ">s_frme </span><span style="color: #000000; ">=</span><span style="color: #000000; "> cpu</span><span style="color: #000000; ">-></span><span style="color: #000000; ">s </span><span style="color: #000000; ">-</span><span style="color: #000000; "> cpu</span><span style="color: #000000; ">-></span><span style="color: #000000; ">s_sav;<br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; "><img src="http://www.shnenglu.com/Images/dot.gif" alt="" /><br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; ">tot_frme </span><span style="color: #000000; ">=</span><span style="color: #000000; "> u_frme </span><span style="color: #000000; ">+</span><span style="color: #000000; "> s_frme </span><span style="color: #000000; ">+</span><span style="color: #000000; "> n_frme </span><span style="color: #000000; ">+</span><span style="color: #000000; "> i_frme </span><span style="color: #000000; ">+</span><span style="color: #000000; "> w_frme </span><span style="color: #000000; ">+</span><span style="color: #000000; "> x_frme </span><span style="color: #000000; ">+</span><span style="color: #000000; "> y_frme </span><span style="color: #000000; ">+</span><span style="color: #000000; "> z_frme;<br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (tot_frme </span><span style="color: #000000; "><</span><span style="color: #000000; "> </span><span style="color: #000000; ">1</span><span style="color: #000000; ">) tot_frme </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; ">scale </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">100.0</span><span style="color: #000000; "> </span><span style="color: #000000; ">/</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">)tot_frme;<br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; ">us</span><span style="color: #000000; ">%</span><span style="color: #000000; "> </span><span style="color: #000000; ">=</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">)u_frme </span><span style="color: #000000; ">*</span><span style="color: #000000; "> scale;<br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; ">sy</span><span style="color: #000000; ">%</span><span style="color: #000000; "> </span><span style="color: #000000; ">=</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">)s_frme </span><span style="color: #000000; ">*</span><span style="color: #000000; "> scale;<br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; "><img src="http://www.shnenglu.com/Images/dot.gif" alt="" /><br /></span><span style="color: #008080; ">13</span> <span style="color: #000000; ">cpu</span><span style="color: #000000; ">-></span><span style="color: #000000; ">u_sav </span><span style="color: #000000; ">=</span><span style="color: #000000; "> cpu</span><span style="color: #000000; ">-></span><span style="color: #000000; ">u;<br /></span><span style="color: #008080; ">14</span> <span style="color: #000000; ">cpu</span><span style="color: #000000; ">-></span><span style="color: #000000; ">s_sav </span><span style="color: #000000; ">=</span><span style="color: #000000; "> cpu</span><span style="color: #000000; ">-></span><span style="color: #000000; ">s;<br /></span><span style="color: #008080; ">15</span> <span style="color: #000000; "><img src="http://www.shnenglu.com/Images/dot.gif" alt="" /></span></div></div><div class="kace6y4" id="LC67" style="padding-left: 10px;"></div><div class="ia6yac6" id="LC68" style="padding-left: 10px;">        每个q程占cpu癑ֈ比计:</div><div class="4i2aw22" id="LC69" style="padding-left: 10px;"><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span> <span style="color: #000000; ">Frame_tscale </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">100.0f</span><span style="color: #000000; "> </span><span style="color: #000000; ">/</span><span style="color: #000000; "> ((</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">)Hertz </span><span style="color: #000000; ">*</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">)et </span><span style="color: #000000; ">*</span><span style="color: #000000; "> (Rc.mode_irixps </span><span style="color: #000000; ">?</span><span style="color: #000000; "> </span><span style="color: #000000; ">1</span><span style="color: #000000; "> : Cpu_tot));<br /></span><span style="color: #008080; ">2</span> <span style="color: #000000; "></span><span style="color: #0000FF; ">float</span><span style="color: #000000; "> u </span><span style="color: #000000; ">=</span><span style="color: #000000; "> (</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">)p</span><span style="color: #000000; ">-></span><span style="color: #000000; ">pcpu </span><span style="color: #000000; ">*</span><span style="color: #000000; "> Frame_tscale;</span></div></div><div class="iy6ys6q" id="LC73" style="padding-left: 10px;">        的是两帧之间L间片数量Q各q程占的旉片数量百分比?/div></pre><img src ="http://www.shnenglu.com/yangsf5/aggbug/204148.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/yangsf5/" target="_blank">Sheppard Y</a> 2013-11-07 19:20 <a href="http://www.shnenglu.com/yangsf5/archive/2013/11/07/204148.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>pomelo0.5.5源码分析Q?Q?通信http://www.shnenglu.com/yangsf5/archive/2013/09/05/203041.htmlSheppard YSheppard YThu, 05 Sep 2013 15:09:00 GMThttp://www.shnenglu.com/yangsf5/archive/2013/09/05/203041.htmlhttp://www.shnenglu.com/yangsf5/comments/203041.htmlhttp://www.shnenglu.com/yangsf5/archive/2013/09/05/203041.html#Feedback0http://www.shnenglu.com/yangsf5/comments/commentRss/203041.htmlhttp://www.shnenglu.com/yangsf5/services/trackbacks/203041.html
2016-07-11 日更?nbsp;
此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?/span>
http://blog.clawz.me/2013/09/05/13-pomelo-read-source-2/

 


一、客L与服务器的通信

    客户端的通信在pomelo-client里封装了?/p>

    服务器与客户端的通信在connector里。底层提供websocket、tcp和socket.io三种方式的通信?/p>

Q一QconnectorlgQcomponents/connector.jsQ?/p>

    lg构造函数里会this.connector从opts里取connectorQ或者默认ؓconnectors/sioconnector.js。(connector的实现sioconnector和hybridconnectorQ?/p>

    lg的start里会this.server\this.session\this.connection分别映射到app的对应的lg上?/p>

    lg的afterStart里this.connector.startQƈ监听this.connector?connection'事g?/p>

        'connection'事g处理为:

        connection兌一个sessionQ监听socket的message事gQ接受到message时decode messageQ再message交给serverlg的handleQ处理完回调里再返回信息在connectorlg的send里处理?/p>

        另外监听session?bind'事gQ处理函CؓQ调用connection.addLoginedUser?/p>

    lg里的sendQencode reponse的messageQ然后交lschedulelg的schedule?/p>

 

Q二Qhybridconnector的实?/p>

    connectors/hybridconnector.js以及connectors/hybird。hyrbird实现了原生socket和websocket两种?/p>

    hybridconnector.start里会this.tcpServer=net.createServerQ然后把以这个tcpServer为参数创Z个switcher。之后在switcher?connection'事g里将tcpsocket装进hybridsocket?/p>

Q?Qhybrid/switcher.js

    switcher构造函数接受一个server参数Qƈ创徏this.wsprocessor和this.tcpprocessor?/p>

    switcher监听参数server?connection'事gQ事件处理函数里监听原生socket?data'事gQ判断data是否有http_如果有,则调用wsprocessor.addQ这个add会向外emit 'connection'Q事件参Cؓ原生socketQ,q向socket emit 'data'事gQ否则非httpQ则调用tcpprocessor.addQ这个add会以刚才的原生socket为参数创Z个tcpsocketQ同时向tcpprocessor emit 'connection'Q事件参Cؓ原生tcpsocketQ、向q个原生socket emit 'data'事g?/p>

    switcher也监听了this.wsprocessor和this.tcpprocessor?connection'事gQ处理ؓ向switcher自己emit 'connection'。ȝQswitcher的职责,socket的字节流data拼成包,?message'事g向外emit一个个的完成包msg?/p>

    刚才提到的tcpsocket.jsq里处理原生socket的操作。监听了原生socket?data'?end'?error'?close'事g。例如在'data'处理Ӟ当读入的长度够一个包的body后就向tcpsocket emit 'message'?/p>

Q?Qhybridsocket.js

    socket和websocket装为统一接口。构造函数里接受一个id和socket参数?/p>

    hybridsocket监听tcpsocket?message'事gQ将msg decodeQ之后处理。例如Package.TYPE_DATAcd的msgQ就这个msg再向hybridsocket自己emit一?message'事gQ其他可能是'handshake'?heartbeat'事g?/p>

 

Q三Qserverlg

    官方描述如下“模块使服务器具备处理客户端请求的能力。该模块主要实现了filter服务Q根据当前服务器cdQ加载对应handler/目录下的代码Qƈ军_一个请求应该是在当前服务器处理q是应该路由l其他服务器处理?#8221;Q下面看看代码流E?/p>

    lg的start里初始化filter和handler?/p>

 

二、服务器之间的通信

 

 

三、框架调?/p>

 

四、session

Q一QsessionlgQcomponents/session.jsQ?/p>

    sessionlg直接用的common/service/sessionService?/p>

Q二QsessionService

Q?QSessionQobjectQ?/p>

    Session里维护的socket和user信息的之间的对应关系。每个socket有个对应的SessionQ验证用戯n份后将他们l定?/p>

    Session构造函数接受参数socket id\frontendId\socket\service?/p>

    Session通过bind\unbind函数uidl到this.uid里,qemit 'bind'\'unbind'事g?/p>

    Session的set\get函数来给Session讑֏|由this.settingsl护?/p>

    Session的send\sendBatch都是直接通过构造时传入的那个socket来操作?/p>

Q?QMockLocalSessionQobjectQ?/p>

Q?QSessionServiceQobjectQ?/p>

    负责对Session的管理。构造函数里this.sessions和this.uidMap初始为空表?/p>

    SessionService的create负责new SessionQƈ攑ֈthis.sessions里?/p>

    bind\unbind函数负责传入的sid\uid对应l定到this.sessions\this.uidMap里。uidMap里每个元素是个数l,所以每个uid可以对应多个sessionQ(q个以后再具体了解下Q?/p>

    sendMessage\sendMessageByUidҎsid\uid往对应的session或sessions发消息?/p>

    其他函数不一一列D了?/p>

 

Q三Qsession的?/p>

    看了下chatofpomelo里,是在connector/handler/entryHandler.js里的enter函数Q直接用了session.bind。简单用法就是在自己目的验证uid后自q定?/p>

 

五、pomelo-rpc

Q一Qrpc-client

    client.create\mailstation.create\mailstation.mailboxFactory挂蝲mailbox\

    client.start(callback)\mailstation.start&callback

    client.addProxies(remote-calls)\proxy.create\

Q二Qrpc-server

    lib/rpc-server/server远E调用处理下Q加到opts.services里,然后通过gateway来listen端口和处理message?/p>

Sheppard Y 2013-09-05 23:09 发表评论
]]>pomelo0.5.5源码分析Q?Q?lghttp://www.shnenglu.com/yangsf5/archive/2013/08/15/202563.htmlSheppard YSheppard YThu, 15 Aug 2013 12:31:00 GMThttp://www.shnenglu.com/yangsf5/archive/2013/08/15/202563.htmlhttp://www.shnenglu.com/yangsf5/comments/202563.htmlhttp://www.shnenglu.com/yangsf5/archive/2013/08/15/202563.html#Feedback0http://www.shnenglu.com/yangsf5/comments/commentRss/202563.htmlhttp://www.shnenglu.com/yangsf5/services/trackbacks/202563.html
2016-07-11 日更?nbsp;
此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?/span>

 

    ׃才接触nodejs几天Q看源码时各U细节和设计Ҏ都得熟悉下。结合chatofpomelo-websocketQ先从pomelo的用入口开始看?/p>

 

一、chatofpomelo的开启流E?/p>

    Pomelo.createApp出来ApplicationQ然后Application.start开启了?/p>

    createApp时会调Application.init来做初始化?/p>

    init里调AppUtil.defaultConfiguration来读入默认配|。例如从master.json里读入master配置QApplication.masterQ,从servers.json里读入服务器集群各进E的type、host和port配置Q可以通过Application.get("__serverMap__")获取Q?/p>

 

二、组件的挂蝲

    lg攑֜components目录下。各lg可以通过Pomelo.components或者直接通过Pomelo来按名取。也可以通过Application.components来按名取Q每个组件的名字在自qname属性里Q通常为js文g名加前后双下划线Q例如connector.js的组件名?#8220;__connector__”Q?/p>

    下面看下lg的挂载和q行?/p>

    Pomelo里会遍历componets目录里的各个js文gQ然后require到Pomelo里和Pomelo.components里?/p>

    Application.start里先调用AppUtil.loadDefaultComponentsQloadDefaultComponents里会ҎApplication.serverType来Application.load需要的components?/p>

    Application.load里会Pomelo里的components攑ֈ自己的components里?/p>

    Application.start/stop/afterStart{方法会l一执行各components里的对应start/stop/afterStart{方法?/p>

 

三、ps

    ​q篇发表后,在google里搜了下Q我的一Ҏ味Q经常发表随W后会看看搜索引擎收录了没)“pomelo 源码分析 lg”Q发Cpomelo官方wiki里关于组件的说明Q奇怪之前准备看lg时没搜到。分析源码之前也览了下官方wikiQ应该是偏向于了解大概了Q各l节没了太大印象?/p>

    ​不过官方已经有了也没关系Q随W给人参考的价值变后Q就当自qW记吧?/p>

    ​另外|上也有些pomelo的源码分析了Q但是看了眼Q跟我想要的不太一栗?/p>

 

附官方组件wikiQ?/p>

  1. Pomelo-Framework里的lg部分Q?a >https://github.com/NetEase/pomelo/wiki/Pomelo-Framework

  2. Pomelo-lgQ?a >https://github.com/NetEase/pomelo/wiki/Pomelo-%E7%BB%84%E4%BB%B6

 



Sheppard Y 2013-08-15 20:31 发表评论
]]>懒h厨房http://www.shnenglu.com/yangsf5/archive/2013/07/17/201910.htmlSheppard YSheppard YWed, 17 Jul 2013 13:13:00 GMThttp://www.shnenglu.com/yangsf5/archive/2013/07/17/201910.htmlhttp://www.shnenglu.com/yangsf5/comments/201910.htmlhttp://www.shnenglu.com/yangsf5/archive/2013/07/17/201910.html#Feedback0http://www.shnenglu.com/yangsf5/comments/commentRss/201910.htmlhttp://www.shnenglu.com/yangsf5/services/trackbacks/201910.html
2016-07-08 日更?nbsp;
此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?/span>
http://blog.clawz.me/2013/07/17/13-lazy-cook/

 

 

    有时候忙了一天下班后Q和x友都不想做饭Q女朋友受懒h天气appQ里边突出显C重要信息,其他都没有,q样一眼就能看到想要的Q的影响Q考虑写个懒h厨房的app?/div>
    其实x友想的懒人厨房跟那个懒h天气的关联就?#8220;懒h”Q:Q?/div>
    x友在看android斚w的资料,暂时又得快速写好appQ我先在github开个项目,先把惛_的菜名给C来吧Q以后再慢慢看怎么L变这个项?#8212;—是只做开放文档Ş式,q是演变成个app之类的?/div>
    目|址Q?a >https://github.com/yangsf5/lazycook

     q个后来没搞hQ老婆那也不想做了Q哈哈哈?/div>
     单谈下这个事情吧Q感觉做菜复杂的话太耗费旉Q可以靠多练习来增加熟练度,各个步骤也慢慢根据经验来优化Q来做好旉l筹?/div>



Sheppard Y 2013-07-17 21:13 发表评论
]]> һaƬþëƬ| Ʒһþþþþþվ| ݺɫþþۺ| ޾þþһ| þþƷAV| 9191ƷѾþ| þþƷӰԺ| ɫۺɫþû| ƷþùƷ99| ȫþվ| ˾þü91| ɫۺϾþĻ| 99þþƷѹۿ| þþƷƵ91| þһۺ| þþƷ99Ʒ| ¶ۺϼ¾þ| ˾ƷѾþþþ| þ99Ʒһ| ŷۺҹҹþ| ƷŷƬþùŷ| þþƷר| һAëƬѹۿþþƷ| þֹۺ޾Ʒ| ɫav˾þô߽ӰԺ | þþþavר| þҹ³Ƭ| ձþþþƷĻ| þþþùAV鶹| ij뾫Ʒþþò| ɫþþþþۺ| 99reֻоƷȾþ| ƷۺרƬþþ | պݺݾþ͵͵ɫۺ96| պþþþĻ| ޾ƷþþþþҲ| Ʒþþþþ| ƬҹƬþ| ƷŮþþþ| һaƬþëƬ| žžƷ99þþ㽶|