??xml version="1.0" encoding="utf-8" standalone="yes"?>合区精品久久久中文字幕一区,人妻无码αv中文字幕久久琪琪布 人妻无码久久一区二区三区免费 人妻无码中文久久久久专区 ,精品一区二区久久http://www.shnenglu.com/yangsf5/keep thinking keep coding.zh-cnTue, 06 May 2025 20:34:29 GMTTue, 06 May 2025 20:34:29 GMT60误问我博客的新地址-blog.clawz.mehttp://www.shnenglu.com/yangsf5/archive/2014/07/09/207593.htmlSheppard YSheppard YWed, 09 Jul 2014 11:58:00 GMThttp://www.shnenglu.com/yangsf5/archive/2014/07/09/207593.htmlhttp://www.shnenglu.com/yangsf5/comments/207593.htmlhttp://www.shnenglu.com/yangsf5/archive/2014/07/09/207593.html#Feedback0http://www.shnenglu.com/yangsf5/comments/commentRss/207593.htmlhttp://www.shnenglu.com/yangsf5/services/trackbacks/207593.htmlhttp://blog.clawz.me/ 写博客了Q这里应该不?x)再更新?img src ="http://www.shnenglu.com/yangsf5/aggbug/207593.html" width = "1" height = "1" />

Sheppard Y 2014-07-09 19:58 发表评论
]]>
一ơ简单的hackhttp://www.shnenglu.com/yangsf5/archive/2014/05/15/206970.htmlSheppard YSheppard YThu, 15 May 2014 03:11:00 GMThttp://www.shnenglu.com/yangsf5/archive/2014/05/15/206970.htmlhttp://www.shnenglu.com/yangsf5/comments/206970.htmlhttp://www.shnenglu.com/yangsf5/archive/2014/05/15/206970.html#Feedback0http://www.shnenglu.com/yangsf5/comments/commentRss/206970.htmlhttp://www.shnenglu.com/yangsf5/services/trackbacks/206970.html
2016-07-12 日更?nbsp;
此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?br />
http://blog.clawz.me/2014/05/15/14-a-easy-hack/

一、背?/span>
     朋友公司有款老YӞq行在windows下,C/S架构。客L(fng)为很久前外包开发的。这个客L(fng)为GUI界面。朋友想定时自动让Y件做些事情。这个客L(fng)以前设计时没有提供这U定时功能,只有每次执行当次的操作。朋友自己对软g开发不熟,如是扑ֈ我?/div>
二、朋友给的解x?/div>
     他表C做个按键脚本之cȝQ定时的L拟在客户端上的单ơ操作?/div>
三、我的解x?/div>
Q一Q了解需?/div>
     q是C/S架构Q之前是每次鼠标点击后,客户端给服务器发送相应的|络包。现在要做的是破解这个协议,然后自己写程序定时发送对应协议的|络包即可?/div>
Q二Q解x?/div>
     朋友的解x案,对于擅长客户端的人是可以的。但是我不怎么擅长Q会(x)׃时间?/div>
     所以我选择我自己更擅长的网l编E。如上边说的Q先破解协议Q然后想q啥非常方便了?/div>
四、解册E?/div>
Q一Q破解协?/div>
     本想找个协议监听软gQ我来远E操作就行了Q但是他们用环境公|无法连入。如果我写文档让他来按步骤走Q对于非专业人士来说也挺费事的?/div>
     随后我想C们的行业不那么互联网Q他们联pȝ外包素质应该不是那么高。估计也是windows那套.net搞的Q顶多也java搞的。所以让他把客户端拷出外|,我来反编译试试。同时我ȝ上查?net的反~效果,有网游表C没有؜效果的C#代码反编出来跟源代码基本没啥区别Q另外以前反~译qjavaQ反~得的代码也跟原工程差不多。所以开始E定的祷反编利?/div>
     看了眼客L(fng)里的各文Ӟ感觉到是C#Q找了个dotPeekQ反~译出来相当清晰。(q玩意的反编译效果比以前反编译flash的代码还清晰Qflah反编译后的变量名基本~程local1之流了,q个C#反编出来变量名都是好的)
Q二Q分析协?/div>
     C#代码虽没写过Q但是语法跟Java/C++非常像。分析v来不是很费劲?/div>
     果然代码写的很windows?netQ客L(fng)直接q接的数据库Q然后在客户单发起select之类的查询语句。数据库表和字段名基本是中文拼音首字母?/div>
     后来具体逻辑也懒得看Q直接找到数据库的配|,让朋友在内网装个数据库客L(fng)Q连数据库看表里数据了。让他比对表里数据和客户端Y件上昄的数据对比,扑և׃要的哪几个字Dc?/div>
Q三Q实现需?/div>
     q个是整个过E里最单的了。用了自己最喜欢的golang写了个没有GUI的程序,定时l他L据库查想要的数据?/div>
五、后?/div>
     整个q程的顺利多亏给他们写外包的公司用的C#Q还没有做代码؜淆之cȝ?/div>


Sheppard Y 2014-05-15 11:11 发表评论
]]>诅RMysql性能调优与架构设计》笔?/title><link>http://www.shnenglu.com/yangsf5/archive/2014/05/04/206818.html</link><dc:creator>Sheppard Y</dc:creator><author>Sheppard Y</author><pubDate>Sun, 04 May 2014 10:38:00 GMT</pubDate><guid>http://www.shnenglu.com/yangsf5/archive/2014/05/04/206818.html</guid><wfw:comment>http://www.shnenglu.com/yangsf5/comments/206818.html</wfw:comment><comments>http://www.shnenglu.com/yangsf5/archive/2014/05/04/206818.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/yangsf5/comments/commentRss/206818.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/yangsf5/services/trackbacks/206818.html</trackback:ping><description><![CDATA[<div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><div><div style="orphans: 2; text-align: -webkit-auto; widows: 2;"><div></div><fieldset><legend><span style="color: #ff0000; line-height: normal;">2016-07-12 日更?nbsp;</span></legend><div><span style="line-height:normal;color:red;">此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?br /></span><div></div></div><a ><div><div><span style="color:red;">http://blog.clawz.me/2014/05/04/14-note-of-mysql-book/</span></div></div></a></fieldset><a ><div><div></div></div></a><br /><font face="微Y雅黑" size="3"><span style="line-height: normal;">一、背?/span></font></div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">     q几天在review公司目mysqlq块的架构,|上google出来的东西大多是皮毛Q特别一些中文站炚w的,英文的话阅读和消化都比较慢,除非不得ԌQ有些还明显有些错误?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">     之前看《Http权威指南》的甜头q在Q加上有些积累现在看技术书速度也快了)Q所以赶紧找些质量高的mysql斚w的书看,扑ֈ一本阿里h写的《Mysql性能调优与架构设计》,Fenng也有做序推荐?nbsp;    </div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">     正文部分为阅ȝ记?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><span style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">二、硬件关键指?/span><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">     下边列出是常见性能指标Q具体指标的取舍也要看具体应用场景。具体设计时再回头参考书里里讲的例子?br /><div>1.IO性能高的部g主要q盘和内存Q各U与IO相关的板卡相兟?/div><div>     IO性能分ؓ(f)和IOPSQ每U可提供的IO讉Kơ数Q和每秒的IOL量(IO吞吐量)?/div><div>2.CPUQSQL parse和优化)Qƈ发高的时候C(j)PU每秒需要处理的h高Q相应CPU处理能力需要比较强劌Ӏ?/div><div>3.|络讑֤</div></div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">二、性能优化</div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q一Q商业需求合理化</div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">     书里例子Q实时更C个论坛帖子总量的统计?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">     select count(*)语句单,但是Innodb引擎q是耗时间。而这个需求的强实时更新没多少用户真正兛_q个。定时更新可提高很大的性能?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">     q条自己已经知道了?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q二Q系l架构最优化</div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q?Q有几类数据不适合存到数据库中Q?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">     1.二进制多媒体数据Q图片、音频、视频等Q,q类数据Ҏ(gu)据库I间资源耗费非常严重Q且q些数据的数据存储很消耗数据库L的CPU资源?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">     2.水队列数据Q支持事务的存储引擎Z事务安全性和可恢复性,需要记录所有变更的日志信息Q而流水队列数据会(x)不断的被I(xin)NSERT\UPDATE\DELETEQ导致日志量很大。用成熟的W三斚w列Y件处理,性能会(x)成倍提升?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">     3.大文本数据Q从5.0.3开始,VARCHARQ实际数据小?55字节Ӟ实际存储I间和实际数据长度一P可一旦长度超q?55字节之后Q所占用存储I间是实际数据长度的两倍。不光性能低下Q还是浪费空间?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q?Q是否合理利用了应用层的cache?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q?Q数据层的存取实现都是最_的吗。在E序里不要过度依赖面向对象思想?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q?Q过度依赖数据库SQL语句的功能造成数据库操作效率低下?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">     量减少与mysql的交互次数和SQL复杂度。不要对可扩展性过度追求,Dpȝ设计时开分太李三Q导致需要大量Join语句?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q?Q重复执行相同的SQL造成资源费?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q三Q逻辑实现_?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q四Q硬件设施理性化</div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">三、合理利用锁机制来优化mysql</div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">四、Query优化</div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">     主要优化思\和原则:(x)</div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q?Q优化更需要优化的Query?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q?Q定位优化对象的性能瓉?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q?Q明的优化目标?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q?Q从explain入手?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q?Q多使用profile?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q?Q永q用结果集驱动大的l果集?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q?Q尽可能在烦引中完成排序?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q?Q只取出自己需要的columns?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q?Q仅仅用最有效的过滤条件?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q?0Q尽可能避免复杂的join和子查询?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">五、Schema设计的性能优化</div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q一Q高校的模型设计</div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q?Q不一定要q求范式</div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q?Q适度冗余——让query量减少join?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q?Q大字段垂直分拆</div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">     字段特别大,讉K频率又很低的字段拆出厅R因录存储是一条一条的存放Q查询某些数据时Q也?x)读取到q个讉K不高的大字段Q比较浪费IO资源?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q?Q大表水q_?#8212;—Zcd的分拆优?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">     把少量访问频率极高的记录水^拆分出去。例如论坛里的置帖子从普通讨(chung)里分拆出Mؓ(f)单独的表?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q?Q统计表——准实时优?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q二Q合适的数据cd</div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">     选择更小的数据类型,可以降低IO消耗。另外不同数据类型的CPU处理方式也不一栗例如通过整数cd代替点数或者字W类型?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q三Q规范的对象命名</div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">     q条Ҏ(gu)能没啥影响Q但是对数据库的l护影响非常大。库的字D越来越?#8230;…</div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">六、mysql server性能优化</div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">七、存储引擎优?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">八、架构设?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q一Q可扩展设计的基本原?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q二Qmysql replication</div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q三Q数据切?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">     水^切分和垂直切分,之前目里做架构时已基本了解?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q四Qcache和search的利?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">     cache是memcache之类的。search主要用来做全文检索?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q五Qmysql cluster</div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q六Q高可用设计之思\?qing)方?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q七Q高可用设计之mysql监控</div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"><hr />      看完上边后又在看《高性能mysql》第三版2013q初版的Q美国h写的Q这本是mysql的经怹作,比上辚w本更好吧。就是内容详l,啥都有。详l的基准试Ҏ(gu)、特性细节(原理Q、架构考虑Q这几年mysql升的特性(如分区等Q,讲述的mysql版本已经新到5.5~E许5.6前瞻。还有作者都是相关经验很多年的大ѝ内容写的也不枯燥,很向那些~程斚w的经怹的书写风根{?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">     旉宝贵Q推荐看《高性能mysql》这本就行了?/div></div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div></div><img src ="http://www.shnenglu.com/yangsf5/aggbug/206818.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> 2014-05-04 18:38 <a href="http://www.shnenglu.com/yangsf5/archive/2014/05/04/206818.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Docker应用调研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/

 一、背?
     目里编译打包客L(fng)E序时经常出现问题,有环境不一致问题或者代码冲H问题?/div>
     之前了解q?a >docker可以应用环境作ؓ(f)一个一体化的服务来使用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(fng)环境搭徏的话Qimage的事情还得自己搞下?/div>


Sheppard Y 2014-04-26 16:05 发表评论
]]>控制反{http://www.shnenglu.com/yangsf5/archive/2014/04/14/206573.htmlSheppard YSheppard YMon, 14 Apr 2014 03:10:00 GMThttp://www.shnenglu.com/yangsf5/archive/2014/04/14/206573.htmlhttp://www.shnenglu.com/yangsf5/comments/206573.htmlhttp://www.shnenglu.com/yangsf5/archive/2014/04/14/206573.html#Feedback0http://www.shnenglu.com/yangsf5/comments/commentRss/206573.htmlhttp://www.shnenglu.com/yangsf5/services/trackbacks/206573.html
2016-07-12 日更?nbsp;
此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?/span>
http://blog.clawz.me/2014/04/14/14-ioc/

一、概?/span>
     从酷客看?/span>《需求变化与IoC?/a>Q里边讲的东西挺形象的?/span>
     用户需求是一直变的,如果一直根据用h做,E序员会(x)累死?/div>
     控制反{的比较Ş象的例子QPC机的架构都是设计好的Q用h要什么样的,再去l装配置。而不是用戯惌什么功能,每个用户去设计一套PC架构Q这样厂商就?x)篏死,而且成本非常高?/div>
二、拓?/div>
     不被多变的需求牵Ӟ做好自己的h生架构设计?/div>
     不因为某某小事而去花大_֊去钻研没用的东西Q要专注自己喜欢的技能?/div>
     q没仔细想玩?/div>


Sheppard Y 2014-04-14 11:10 发表评论
]]>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直接往Ҏ(gu)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做ؓ(f)harbor的中心控制器的。后l会(x)改进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护程为:(x)
Q一Q新session的创?/div>
Q?Q将option里配的sessionStore挂到req上;
Q?Q修改res.end函数Q在原函数基上加入req.session.save操作Q就是往sessionStore里存sessionQ;
Q?Q新session的接入,因ؓ(f)是新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会(x)修改Q所以我不想动session中间件的源码。于是只能在新session创徏后的我自q逻辑程中来处理。逻辑程中,当http包ؓ(f)登陆验证包时Q将session中间件给创徏的session的sid拿到sessionStore里去查下是否已被使用Q如果用就q掉当前sessionQƈ通知当前客户端重试?/div>
     q掉当前session有个技巧,是直接Qreq.session=null;Q这样即可,因ؓ(f)修改后的res.end里,判断如果req.session未定义,׃?x)再去调用req.session.save了。当前session是一定不能让他save的,否则拿当前用户的信息覆盖了之前用此sid的用P造成那个用户后箋逻辑混ؕ?/div>


Sheppard Y 2014-02-28 15:35 发表评论
]]>js变量不支持块U作用域http://www.shnenglu.com/yangsf5/archive/2014/02/19/205854.htmlSheppard YSheppard YWed, 19 Feb 2014 09:00:00 GMThttp://www.shnenglu.com/yangsf5/archive/2014/02/19/205854.htmlhttp://www.shnenglu.com/yangsf5/comments/205854.htmlhttp://www.shnenglu.com/yangsf5/archive/2014/02/19/205854.html#Feedback0http://www.shnenglu.com/yangsf5/comments/commentRss/205854.htmlhttp://www.shnenglu.com/yangsf5/services/trackbacks/205854.html 此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?
http://blog.clawz.me/2014/02/19/14-js-has-not-block-scope/


Sheppard Y 2014-02-19 17:00 发表评论
]]>
支持cookie的http客户端agenthttp://www.shnenglu.com/yangsf5/archive/2014/02/14/205757.htmlSheppard YSheppard YFri, 14 Feb 2014 03:45:00 GMThttp://www.shnenglu.com/yangsf5/archive/2014/02/14/205757.htmlhttp://www.shnenglu.com/yangsf5/comments/205757.htmlhttp://www.shnenglu.com/yangsf5/archive/2014/02/14/205757.html#Feedback0http://www.shnenglu.com/yangsf5/comments/commentRss/205757.htmlhttp://www.shnenglu.com/yangsf5/services/trackbacks/205757.html

Sheppard Y 2014-02-14 11:45 发表评论
]]>
cookie一步http://www.shnenglu.com/yangsf5/archive/2014/01/16/205415.htmlSheppard YSheppard YThu, 16 Jan 2014 03:54:00 GMThttp://www.shnenglu.com/yangsf5/archive/2014/01/16/205415.htmlhttp://www.shnenglu.com/yangsf5/comments/205415.htmlhttp://www.shnenglu.com/yangsf5/archive/2014/01/16/205415.html#Feedback0http://www.shnenglu.com/yangsf5/comments/commentRss/205415.htmlhttp://www.shnenglu.com/yangsf5/services/trackbacks/205415.html

2016-07-11 日更?nbsp;
此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?br />
http://blog.clawz.me/2014/01/16/14-a-step-to-cookie/

一、怎么U结上的
    q期在准备借鉴云风的skynet来完善我们的架构。这个cookie研究是个插曲?/div>
    我这有个http server只做与数据库的代理接口用Q同事那Ҏ(gu)个http的web serverQ他的server需要以http clientw䆾来访问我的server取数据?/div>
    我的server用的expressQ访问流Eؓ(f)先去一个path验证Q验证完Q这个http client可以访问其他path了。验证的时候会(x)标记client对应的session为已验证Q之后的每次讉K?x)检查这个标记?/div>
二、对cookie的认识加׃?/div>
    q里的cookie程是这L(fng)Q验证之后,server?x)在response的headers里设|上“set-cookie”的|接下来的request需要带上这个cookieQ否则server认ؓ(f)q个client没有被验证?/div>
    W二ơrequest的response里可能会(x)l设|新的cookieQ第三次request需要带上第二次respones讄的cookie……
    q样是每次讉K带上上次q回的cookieQserver才会(x)认ؓ(f)你这ơ的讉K启用的client已经被验证过?/div>
    nodejs里的http.request默认是不?x)捎上cookie的,所以得自己装下?/div>
三、ps
    cookie的wikipediaQ?a >http://en.wikipedia.org/wiki/HTTP_cookie#Implementation
    cookie以前做模拟登陆时有想研究q,那时对http完全不了解,加上其他的事情,l放弃了。这ơȝE微留个感性认识了?/div>
    q里写的׃八糟的,回头有空再完善这吧?/div>

     同一个站点的cookie不一定只是登陆够l的那个Q而且cookie也不局限于用于登陆标记。例如登陆后览好久Q开始启用某个功能需要做标记Qcookie字段动态增加了。ؓ(f)此在lnode.js的http.request装的维护cookie的agent后来修改了?/div>
     q些内容在《Http权威指南》里很清楚Q经怹才是道理?/div>



Sheppard Y 2014-01-16 11:54 发表评论
]]>了解云风的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程了,因ؓ(f)每个nodejsq程是单U程的?br />

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

    后来云风他们发现l(f)ua做ؓ(f)嵌入式脚本,写逻辑时很好用的,反正如何都要用luaQ而且lua提供了沙盒,q样多进E可以变为单q程多个沙盒Q这L(fng)合了多进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美好的生活。单游戏是ؓ(f)玩家服务的,某个环节出错都有可能造成玩家利益混ؕQ所以那里错了就整个程Q服务器Q挂掉吧。没有必要让出错模块被隔dQ而其他模块却l箋提供服务导出未预知行为?br />

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


Q?Qskynetq行旉辑?/p>

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

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

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


Q?Q消息调?/p>

TODO


Q?Qgate和connection

TODO


Q二Qskynet集群

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

Q?Q集间通信

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

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

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


Q?Q组?/p>

    TODO



Sheppard Y 2014-01-16 11:25 发表评论
]]>http与socket验证的区?/title><link>http://www.shnenglu.com/yangsf5/archive/2014/01/10/205271.html</link><dc:creator>Sheppard Y</dc:creator><author>Sheppard Y</author><pubDate>Fri, 10 Jan 2014 05:53:00 GMT</pubDate><guid>http://www.shnenglu.com/yangsf5/archive/2014/01/10/205271.html</guid><wfw:comment>http://www.shnenglu.com/yangsf5/comments/205271.html</wfw:comment><comments>http://www.shnenglu.com/yangsf5/archive/2014/01/10/205271.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/yangsf5/comments/commentRss/205271.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/yangsf5/services/trackbacks/205271.html</trackback:ping><description><![CDATA[<div style="orphans: 2; widows: 2;"><font face="微Y雅黑"></font></div><fieldset><legend><span style="color: #ff0000; font-family: 微Y雅黑; line-height: normal; orphans: 2; widows: 2;">2016-07-11 日更?nbsp;</span></legend><div style="orphans:2;widows:2;line-height:normal;"><span style="color:red;">此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?/span></div><div></div><a ><div><span style="color:red;">http://blog.clawz.me/2014/01/10/14-http-socket-auth-diff/</span></div></a></fieldset><a ><div></div><p style="margin-right: 0px; margin-left: 0px; font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;"></p></a><p style="margin-right: 0px; margin-left: 0px; font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;"><br /><br />    q是很基的概念,之前没怎么弄过http。对于自己,是做个W记吧?/p><p style="margin-right: 0px; margin-left: 0px; font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;"><br /></p><p style="margin-right: 0px; margin-left: 0px; font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;">一、socket安全验证</p><p style="margin-right: 0px; margin-left: 0px; font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;">    socket链接是握手之后就一直连着Q所以这条链接在W一包验证之后,之后q条链接不需要再验证?#8220;W一个包”可能描述不准,因ؓ(f)有时候第一包不一定就验证Q可能是做\׃cR这里就不管q种情况了,只管W一个包直接验证的情c?br /></p><p style="margin-right: 0px; margin-left: 0px; font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;">    可以理解为server接受到client的链接,q且验证通过Q如用户?qing)密码对了)q个client链接后。以后这个client发过来的包,server都直接做逻辑处理而不再需要做验证链接合法性。这个信L直到链接断开的?br /></p><p style="margin-right: 0px; margin-left: 0px; font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;">    如果非法客户端来模拟登陆Q至需要得到有效的id?qing)密码,q已l是密码自n安全的事情,不涉?qing)这里谈的链接安全性?br /></p><p style="margin-right: 0px; margin-left: 0px; font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;">    如果非法客户端用正确的id?qing)密码登陆后Q发些非法包Q这里的包验证应该是服务器上包处理时的包查及(qing)逻辑查的事,是通常的游戏说的防P包频率、包里数据的合法范围{)?/p><p style="margin-right: 0px; margin-left: 0px; font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;"><br /></p><p style="margin-right: 0px; margin-left: 0px; font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;">二、http的安全验?/p><p style="margin-right: 0px; margin-left: 0px; font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;">    q里只关心http的短q接?br /></p><p style="margin-right: 0px; margin-left: 0px; font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;">    短连接就是每ơ徏立链?发包-断开。同一client的前后两ơ发到server的包Q也相当于独立的两次Q同一client的验证就需要每个httph都要验证下。于是有了session和cookie。cookie是将client的标识放在client端,常用于server没有账户密码验证的方式。这里不讨论cookie?br /></p><p style="margin-right: 0px; margin-left: 0px; font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;">    server在第一个httph验证client后,l他分配一个session。这个session单的可以理解为server和clientU定的一个client凭证Q有有效期)。之后client在每个请求里加上q个session里规定的|例如一个合适长度的随机字符丌Ӏ?br /></p><p style="margin-right: 0px; margin-left: 0px; font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2;">    q里的session不能有让恶意用户很容易破解的规律Q例如用L(fng)id之类的。所以上Ҏ(gu)到随机字W串之类的?nbsp;   </p><img src ="http://www.shnenglu.com/yangsf5/aggbug/205271.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> 2014-01-10 13:53 <a href="http://www.shnenglu.com/yangsf5/archive/2014/01/10/205271.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>集群实现l节Q?Q?登陆程修改http://www.shnenglu.com/yangsf5/archive/2013/12/16/204821.htmlSheppard YSheppard YMon, 16 Dec 2013 02:44:00 GMThttp://www.shnenglu.com/yangsf5/archive/2013/12/16/204821.htmlhttp://www.shnenglu.com/yangsf5/comments/204821.htmlhttp://www.shnenglu.com/yangsf5/archive/2013/12/16/204821.html#Feedback0http://www.shnenglu.com/yangsf5/comments/commentRss/204821.htmlhttp://www.shnenglu.com/yangsf5/services/trackbacks/204821.html
2016-07-11 日更?nbsp;
此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?/span>
http://blog.clawz.me/2013/12/16/13-game-cluster-design-detail-5/

 



一、回?/p>

    之前的登陆流E在q篇?/a>。之前的登陆程qͼ(x)

Q?Q先查是否同服已登陆Q是则两个链接都t掉Q否则进入下步;

Q?Q判断是否异服已登陆Q是则告诉异服踢老链接,随后t自p的新链接。否则进入下步;

Q?Q当前服务器登陆相关程走完后,向玩家在U列表汇报(写入q个玩家登陆的服务器id为我Q。这时的汇报写入为redis的CAS操作Qؓ(f)了检查是否发生了那篇里介l的同̎L(fng)间多L(fng)陆事件。CAS操作成功Q本服链接登陆完成,做后l操作。否则C(j)AS操作p|Q表C瞬时登陆的异服同̎L(fng)另一个链接的登陆程走的快,已经完成整个程Q包括汇报进在线列表。这时的处理只用慢拍的本服链接关闭p了?/p>

 

二、存储架构变为redis+mysql后的问题

    现在玩家上线旉要从mysql加蝲玩家ȝ数据到redisQ需要考虑q个数据加蝲攑ֈ上边登陆程哪一步里?/p>

    首先数据加蝲有可能会(x)p|Q如果数据加载出问题Q就不能让该玩家登陆?/p>

    如果攑ֈQ?Q(3Q之_(d)是redis的CAS之前Q这L(fng)间同一账号多v登陆都有可能开始进行加载数据步骤,而处理的快的那个客户端就有可能汇报登陆完成之后立即玩游戏q更C自己在redis里的数据Q处理的慢的客户端还q时q在mysql的数据往redis的加载,?x)覆盖快的客L(fng)更新的数据?/p>

    如果攑ֈQ?Q里redis的CAS之后Q数据加载失败,需要回退CAS的操作?/p>

    可见W二U至可以保证数据正性。这U情冉|象下Q就是第一U里没有提供事务操作的回滚(慢客L(fng)覆盖数据后发现干了坏事却不方便回滚自q破坏Q?/p>

    Q?Q这个操作当时是Z区分异服登陆q玩游戏很久了和瞬间多v登陆q两U情늚。现在想惌两种情况的处理统一为直接踢掉新旧两个链接也没什么,毕竟瞬时登陆的情况不多?/p>

 

三、新程

    Ҏ(gu)上边的结论,新的程为:(x)

Q?Q先查是否同服已登陆Q是则两个链接都t掉Q否则进入下步;

Q?Q向玩家在线列表CAS报告自己登陆。如果失败告诉异服踢掉该账号老链接,自己q边t掉该̎h链接卛_。成功则q入下步Q?/p>

Q?Q加载数据,成功p入正常游戏流E。加载失败,去在线列表里清掉自己?/p>

Sheppard Y 2013-12-16 10:44 发表评论
]]>集群实现l节Q?Q?L(fng)数据划分?qing)同?/title><link>http://www.shnenglu.com/yangsf5/archive/2013/12/13/204771.html</link><dc:creator>Sheppard Y</dc:creator><author>Sheppard Y</author><pubDate>Fri, 13 Dec 2013 07:58:00 GMT</pubDate><guid>http://www.shnenglu.com/yangsf5/archive/2013/12/13/204771.html</guid><wfw:comment>http://www.shnenglu.com/yangsf5/comments/204771.html</wfw:comment><comments>http://www.shnenglu.com/yangsf5/archive/2013/12/13/204771.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/yangsf5/comments/commentRss/204771.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/yangsf5/services/trackbacks/204771.html</trackback:ping><description><![CDATA[<div></div><fieldset><legend><span style="color: #ff0000;">2016-07-11 日更?nbsp;</span></legend><div><span style="color:red;">此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?/span></div><div></div><a ><div><span style="color:red;">http://blog.clawz.me/2013/12/13/13-game-cluster-design-detail-4/</span></div></a></fieldset><a ><div></div><p> </p></a><p><br /> </p><div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">一、玩家数据在redis与mysql之间的同?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">    ׃redis操作可以保证多个q程d同一个玩家数据时的原子性。所以之前多个逻辑服务器读写同一玩家数据时没有什么问题,但是现在redis和mysql之间需要同步玩家的数据Q例如定时将redis里的在线玩家数据刯mysql里做持久化)。这个同步的逻辑代码攑֓呢?</div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">    观察需求特性,玩家上线加蝲到redis做cache、定时更新持久层、玩家离U时清掉cacheq更新到持久层,都是redis和mysql之间的数据交互。这些可以放C个服务里Q单q程实现Q或者集成到现在的逻辑服务器里?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">    方便实现Q做下限制。玩家登陆的逻辑服务器记Z的owner服务器,每个玩家数据的redis/mysql同步只由他owner来做?nbsp;q样问题q化了?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">    q里有些做法是突然想到的Q就像《暗旉》里提到的联惛_的,而不是归Uxl的。最q在看《暗旉》,好书Q里边就提到边写Ҏ(gu)考,思考时“大脑内存”有上限的Q边写就能把部分思考分支换出笔记这U?#8220;盘”上,然后大脑专心思考其中一两个分支Q想的差不多Q再回过头将“W记盘”上的数据换入“大脑内存”……正在思考的东西写博客的?fn)惯已经形成一D|间了Q看了书后,更深切体?x)到q种好处?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">    如果逻辑服务器宕机,它上边的玩家掉U了Q而这台逻辑服务器是不能对这些玩家做ȝ数据持久化的。这U情况需要进一步思考TODO。另外之前这U玩家怎么标记为离U,需要再想一遍,也TODO了?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">二、从本质出发review我们的存储架?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">    不要走的太远而忘了ؓ(f)什么出发,从本质上思考,弃掉那些不必要的思考分支,化问题?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">    本质我们的架构是为实现游戏的玩法目标来做的,另一斚w我们考虑开发成本、维护成本、机器成本。好的架构是权衡目标实现E度和这些成本的耗费?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">    目标是实现同一国家的玩家不分区分服。之前缓存和持久化都是用redis来做Q开发成本和l护成本都挺低的。但是需要很多机器。现在控制机器成本,所以需要分析我们数据的特点Q将h据放到mysqlq种机器需求量的数据库。具体到表的分析q里׃方便贴了。说下大概分c:(x)</div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q?Q离U玩家的h据,ȝ玩家的私人数据,不需也不能与别h交互的;</div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q?Q离U玩家的热数据,例如名字Q好友是想看到离U好友的名字的;</div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q?Q在U玩家的一直更新的数据Q例如经验|游戏货币{;</div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q?Q在U玩家的到强实时玩法时才更新的数据?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">    Q?Q里的数据无疑问攑֜mysql里。(2Q里的数据还得根据情늜是否一致放在redis里,即离U的玩家q部分数据也攑֜redis里。(3Q里的数据无疑问在线是放到redis里。(4Q里的数据可以根据情况考虑下gq加载什么的Q即玩家上线时这部分数据不马上加载到redisQ而是{玩家开始这个玩法时才从mysql里加载到redis里。这个需要考虑q个玩法的数据量以及(qing)是否玩家参与度高?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">三、扩?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">    先了解mysql单表数据上限、然后mysql单库上限。这里的上限指不影响效率的上限,而不是物理上限。拿C限数据后Q做预分库分表。分库分表也要好好想惟?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">     查了下,mysql 5.1里InnoDB引擎表空间最大容量ؓ(f)64TB。在查我们公司服务器配置表里盘Q最低有100G的,最?00多G的?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">     初步定mysql的sharding和partitionP(x)不同物理Z间的sharding为分个大的idD,单个物理Z卛_库内的如果表q是很大做自己的partition。最l看上线怎么定,再定q个跨机sharding的idD长度,至于单机的partitionQ对代码来说是不需要管的,q维Ҏ(gu)性能搞就行了?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">     先简单算下,每h100kQ?00wZ个shardingQ需要大U?00GI间?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">四、其他架构展?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">    有单机内容;需要联|时才联|;p|时p|,强实时时做强实时联网。一直纠l这个会(x)不会(x)影响现在的存储架构,但是想了下,不大影响Q变的只是链接Ş式,玩家数据处理q是一L(fng)?/div></div><p> </p><img src ="http://www.shnenglu.com/yangsf5/aggbug/204771.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-12-13 15:58 <a href="http://www.shnenglu.com/yangsf5/archive/2013/12/13/204771.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>集群实现l节Q?Q?DB集群http://www.shnenglu.com/yangsf5/archive/2013/12/06/204628.htmlSheppard YSheppard YFri, 06 Dec 2013 08:53:00 GMThttp://www.shnenglu.com/yangsf5/archive/2013/12/06/204628.htmlhttp://www.shnenglu.com/yangsf5/comments/204628.htmlhttp://www.shnenglu.com/yangsf5/archive/2013/12/06/204628.html#Feedback0http://www.shnenglu.com/yangsf5/comments/commentRss/204628.htmlhttp://www.shnenglu.com/yangsf5/services/trackbacks/204628.html
2016-07-11 日更?nbsp;
此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?/span>
http://blog.clawz.me/2013/12/06/13-game-cluster-design-detail-3/

 

 

一、纯redis集群

    如果redis不止做cacheQ也做持久化Q那得好好算我们的业务规模需要多台机器来支撑?000w注册玩家Q每台机?6G内存Qؓ(f)了保证效率取3/4为可用,?2GQ?/p>

    如果每个玩家1M数据Qȝ9765GQ不热备,需?14台机器。每台机器存?.2w人?/p>

    如果每个玩家16k数据Qȝ153GQ不热备,需?3台机器。每台机器存?7w人?/p>

    如果每个玩家1k数据ȝ9.5GQ不热备,需?台机器。每台机器存?000w人?/p>

    注册玩家?x)越来越多?#8230;…

 

二、mysql做持久化Qredis做cache

    只说存储Q一个mysql支持几T数据没什么问题。例如上?000w注册玩家Q每个玩?M数据QL据近9.5TQ存一个mysql_。但是如果高峰在U玩家ƈ发到100wQ需要将大部分操作规划到redisq个cache上。否则mysql仍然因磁盘I(y)O太多吃不消?/p>

 

Q一Q与Uredis集群相比的劣?/p>

Q?Q好友需要看ȝ玩家的信息,而离U玩家在mysql里,如果频繁Q?/p>

    把离U玩家可能被别h查看的信息不存mysql了,改用redis做持久化?/p>

Q?QGM工具改玩家消息,需要改mysql和redis的cache里。会(x)不会(x)Ҏ(gu)出问题?

 

Q二Q优?/p>

Q?Qredis只做cache集群了,用twemproxy理p了。如果redis做持久化Q还是需要自己来分片Q且早期p规划好?/p>

Q?Q单个玩家的数据涨到1M的时候,ȝh?000w~3000wQ再加两个mysql?/p>

 

三、redis做cache+热数据持久化Qmysql做冷数据持久?/p>

    q里其实是二里边的每个玩家的部分很热的数据从mysqlUdredis里做持久化。但是玩家在U时Q他的数据基本都是热的。所以这个方案不是很好设计?/p>

 

 

最后、参?/p>

1. redis官方关于分片的文章:(x)http://redis.io/topics/partitioning

2. twemproxy文章Q?a _>http://antirez.com/news/44

 

 



Sheppard Y 2013-12-06 16:53 发表评论
]]>了解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数据ؓ(f)了扩展,例如不同的记录的data可能包含很多字段Q且字段不一定相同,以后也会(x)有不类型的字段。这时我把这些不定的字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现在还不敢他作ؓ(f)持久化的DB。上边的例子是mysql里有份数据ؓ(f)生环境的依赖数据,备䆾到MongoDB的数据只是ؓ(f)了查询。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/

 


    现在分析的版本ؓ(f)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(fng)序调用,立即全部内存数据持久化。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 发表评论
]]>软硬件工兯异事仉?/title><link>http://www.shnenglu.com/yangsf5/archive/2013/11/26/204447.html</link><dc:creator>Sheppard Y</dc:creator><author>Sheppard Y</author><pubDate>Tue, 26 Nov 2013 01:58:00 GMT</pubDate><guid>http://www.shnenglu.com/yangsf5/archive/2013/11/26/204447.html</guid><wfw:comment>http://www.shnenglu.com/yangsf5/comments/204447.html</wfw:comment><comments>http://www.shnenglu.com/yangsf5/archive/2013/11/26/204447.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/yangsf5/comments/commentRss/204447.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/yangsf5/services/trackbacks/204447.html</trackback:ping><description><![CDATA[<div></div><fieldset><legend><span style="color: #ff0000;">2016-07-11 日更?nbsp;</span></legend><div><span style="color:red;">此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?/span></div><p><a ><span style="color:red;">http://blog.clawz.me/2013/11/26/13-few-tool-debug/</span></a></p></fieldset><p><a ><br /></a><br /></p><div><p style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; margin-right: 0px; margin-left: 0px;"></p><div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">一、操作系l相?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q?Qwin7的Q务栏的自动隐藏偶?dng)?x)失效</div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">    工作机器上,不想被I(xin)M、邮件等随时q扰Q将win7上的d栏设|了自动隐藏Q集中工作结束才集中处理IM和邮件等消息?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">    早上发生了Q务栏不再自动隐藏。没搜烦C么可靠的解决办法?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">    自己惛_双的托盘图标有消息的时候会(x)临时弹出d栏。想惌试来个托盘消息,刚好我的AKGx插入的音频孔的时候会(x)弹喇叭,拔插下xQ点掉那个喇叭图标,d栏再ơ隐藏了。搞定?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;"></div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">二、Y?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q?Qtmux的pane切来切去?x)吃掉一列字W?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">    解决Q将tmux?.6升?.8׃?x)了?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">Q?Qchrome里登录github.com一直不成功</div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">     问题描述Q工作机chrome里从github.com logout后,再次d时一直重定向到首,开启隐w模式是可以的。家里机器上普通模式的chrome都logout/login没问题?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">     解决Q最开始以为是github官网挂了Q隐w模式能d否定了这个猜。之后以为是pȝ装了什么东西,{重新启动后q是不行。如是ctrl+shift+j打开控制台看了下http的返回,response里表Csession not found。应该是cookie错ؕQ清了github的cookieQ再一dO(jin)K了?/div><div style="font-family: 微Y雅黑; line-height: normal; orphans: 2; text-align: -webkit-auto; widows: 2; font-size: medium;">     感想QNNDQ作Z一个程序员好不专业Q早应该开控制台来debug了。debugq没深入骨髓?/div></div></div><p> </p><img src ="http://www.shnenglu.com/yangsf5/aggbug/204447.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-26 09:58 <a href="http://www.shnenglu.com/yangsf5/archive/2013/11/26/204447.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>天龙商店玫瑰与经稳?/title><link>http://www.shnenglu.com/yangsf5/archive/2013/11/22/204382.html</link><dc:creator>Sheppard Y</dc:creator><author>Sheppard Y</author><pubDate>Fri, 22 Nov 2013 07:08:00 GMT</pubDate><guid>http://www.shnenglu.com/yangsf5/archive/2013/11/22/204382.html</guid><wfw:comment>http://www.shnenglu.com/yangsf5/comments/204382.html</wfw:comment><comments>http://www.shnenglu.com/yangsf5/archive/2013/11/22/204382.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/yangsf5/comments/commentRss/204382.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/yangsf5/services/trackbacks/204382.html</trackback:ping><description><![CDATA[<div></div><fieldset><legend><span style="color: #ff0000;">2016-07-11 日更?nbsp;</span></legend><div><span style="color:red;">此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?/span></div><div></div><a ><div><span style="color:red;">http://blog.clawz.me/2013/11/22/13-tian-long-ba-bu-mei-gui/</span></div></a></fieldset><a ><div></div><p> </p></a><p><br /><br />    几年前在天龙Ӟ让我很感叹的{划案是Q商城的玫瑰道具Q玩家可以花元宝乎ͼ然后再把玫瑰扔商店得金币Q这L(fng)护游戏内的经稳定。今天又跟现在公司的同事提到q个Qؓ(f)了思\清晰点,再以博客的Ş式来边仔l想惟?/p> <p>    如果游戏内没有元宝兑换金币的官方途径Q玩家最便捷的获取金币的方式Q是充D得元宝,然后拿元宝去扑ֈ的玩家交易换取金币。金币的供应量会(x)影响元宝与金币兑换比例。假讑օ宝与金币兑换比例的正常^均gؓ(f)100:50Q当服务器内金币动量很时Q例如新服时Q兑换比例ؓ(f)100:30Q而突然涌入很多刷金工作室Q金币供应量变很大,兑换比例变ؓ(f)100:100Q这旉币贬倹{?/p> <p>    玩家单分ZU,RMB玩家和非RMB玩家。RMB玩家的需求是Q自qRMB换的元宝买的金币能实现自q一些装备之cȝ大提升,是购买力要强。非RMB玩家Q这里指不用外挂Q不利用游戏漏洞Q正常打金币的玩Ӟ的需求是Q自p苦赚的金币能多换些元宝?/p> <p>    当刷金工作室q入游戏后,金币的生变大了。如果工作室的金币都供应动hQ金币就贬g。非RMB玩家利益严重受损Q生挫败感。如果工作室垄断金币市场Q金币甚臛_|RMB玩家利益受损?/p> <p>    q里讨论在打d挂和打击工作室之外的手段来稳定经系l。金币流动量H然变大Q系l方面可能考虑的是金币的掉落和d奖励的调低等。反之变时Q提高掉落和d奖励。或者另一个途径调整道具的h(hun)根{这都挺ȝ的?/p> <p>    现在可以通过玫瑰道具的买卖,来间接进行元宝与金币互兑的后。游戏内玩家间交易的金币升|要兑换金币的玩家选择d宝商店兑换金币。交易的汇率比商店的稍低。这保证了金币的h不会(x)高过讑֮|从而保证了RMB玩家的利益?/p> <p>    如果交易的金币贬g呢?也可以说元宝升g呢?非RMB玩家需要花更多的钱买同L(fng)元宝。貌似玫瑰花q个道具对这U情冉|有什么抑制作用。那到这里的l论是,玫瑰道具只是抑制了金币升?元宝贬D个单斚w的经失衡问题?/p> <p>    Q暂时只惌么多Q以后有I再补充Q?/p><img src ="http://www.shnenglu.com/yangsf5/aggbug/204382.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-22 15:08 <a href="http://www.shnenglu.com/yangsf5/archive/2013/11/22/204382.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>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="ooqriwk" 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="wsyosjw" id="LC2" style="padding-left: 10px;">        E序很简单,基本都在top.c里?/div><div class="piegwon" id="LC3" style="padding-left: 10px;">        load里的cpu详细信息代码如下Q?/div><div class="qgigedy" id="LC4" style="padding-left: 10px;"></div><div class="hywjsrm" 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="arivqpw" id="LC21" style="padding-left: 10px;">        </div><div class="rpctjbl" id="LC22" style="padding-left: 10px;">        Cpu_tot为cpu数量?/div><div class="kikkldy" id="LC23" style="padding-left: 10px;">        cpus_refresh函数里从/proc/stat文g里读入cpu信息Q然后装入smpcpu里。smpcpu为大ؓ(f)Cpu_tot+1个CPU_t成员的数l?/div><div class="qoxzfeh" id="LC24" style="padding-left: 10px;">        /proc/stat文g的头几行为:(x)</div><div class="viojwkf" 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="cpvpvft" id="LC29" style="padding-left: 10px;">        W一行的cpu信息装入smpcpu[Cpu_tot]Q之后的cpu0\cpu1\...装入smpcpu[0]\smpcpu[1\...?/div><div class="imvizni" 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="gqwyesc" id="LC31" style="padding-left: 10px;">        /proc/stat里都是数字,下边看看top里显C的癑ֈ比怎么的?/div><div class="yacekfe" id="LC32" style="padding-left: 10px;"></div><div class="wysfdrv" id="LC33" style="padding-left: 10px;">        CPU_t的定义:(x)</div><div class="twnerbd" 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="gmsmdgb" id="LC48" style="padding-left: 10px;">        每次?proc/stat取的数据UCؓ(f)一帧的数据Q会(x)从到CPU_tl构体的W一行成员里Q上ơ的数据即上一帧的数据拷到CPU_t的第二排带_sav后缀的成员里Q一一对应?/div><div class="zqkxrjx" id="LC49" style="padding-left: 10px;">        summaryhlp函数里计我们想看的cpu各详l指标的癑ֈ比。只取部分代码或伪码做演C:(x)</div><div class="xsklcbs" 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="zbhusrf" id="LC67" style="padding-left: 10px;"></div><div class="ljwjazc" id="LC68" style="padding-left: 10px;">        每个q程占cpu癑ֈ比计:(x)</div><div class="oxdulnx" 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="qsfoqed" 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>重拾博客一q多http://www.shnenglu.com/yangsf5/archive/2013/11/05/204104.htmlSheppard YSheppard YTue, 05 Nov 2013 14:12:00 GMThttp://www.shnenglu.com/yangsf5/archive/2013/11/05/204104.htmlhttp://www.shnenglu.com/yangsf5/comments/204104.htmlhttp://www.shnenglu.com/yangsf5/archive/2013/11/05/204104.html#Feedback0http://www.shnenglu.com/yangsf5/comments/commentRss/204104.htmlhttp://www.shnenglu.com/yangsf5/services/trackbacks/204104.html
2016-07-11 日更?nbsp;
此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?/span>
http://blog.clawz.me/2013/11/05/13-blog-reborn/

 



    博客断断l箋写了好几q_(d)重拾博客的第一是2012q??9日写?a title="" href="http://www.shnenglu.com/yangsf5/archive/2013/04/08/199222.html" target="_self" _href="http://www.shnenglu.com/yangsf5/archive/2013/04/08/199222.html" data_ue_src="http://www.shnenglu.com/yangsf5/archive/2013/04/08/199222.html">吐槽as3的接?/a>。这一q多每月都坚持写??,U念下?/p>

    q些q在多个地方写过Q?a title="" href="http://www.shnenglu.com/yangsf5/archive/2013/04/08/199225.html" target="_self" _href="http://www.shnenglu.com/yangsf5/archive/2013/04/08/199225.html" data_ue_src="http://www.shnenglu.com/yangsf5/archive/2013/04/08/199225.html">我的技术博客初?/a>Q, 1q前的决定定在c++博客园了。最q又看到些用github pages写博客的文章Q有股搞一搞的暗劲?/p>

    在github写博客的优势是我一直想要的一个功能,写的文章有版本管理,当自׃Ҏ(gu)些文章的时候,看下历史记录q道修改的原因了。另外隐U感觉github应该比博客园zȝ久?/p>

    但是放github之后Q会(x)有h看吗Q搜索引擎能很快收录吗?不得不再ơ思考自己博客的初衷……

    慢慢L吧,无论攑ֈ哪,一定要坚持更新……

    q一q多也有不少心得和经验没有写到博客里Q有的可能是忙完后忘了ȝQ有时根本都没意识到那个东西挺值得ȝ的。另外这一q的博客也有些有充数嫌疑Q汗Q这Ҏ(gu)慢改正?/p>

    特别讨厌很多博客转蝲别h的文章,所以我的博客里肯定是坚持原创,臛_也是一番搜索了解某Ҏ(gu)术后的ȝQƈl出原出处的链接且不赘述人家写完的)?/p>

    一直在考虑要不要写Ҏ(gu)术外的东西,例如g相关的。想了下Q硬件也是程序员的工P工欲善其事必先利其器Q啊Q工具又不一定是软g写成的toolQ所以以后碰C可以写点ѝ?/p>

Sheppard Y 2013-11-05 22:12 发表评论
]]>休闲游戏q_架构http://www.shnenglu.com/yangsf5/archive/2013/10/31/204033.htmlSheppard YSheppard YThu, 31 Oct 2013 15:15:00 GMThttp://www.shnenglu.com/yangsf5/archive/2013/10/31/204033.htmlhttp://www.shnenglu.com/yangsf5/comments/204033.htmlhttp://www.shnenglu.com/yangsf5/archive/2013/10/31/204033.html#Feedback0http://www.shnenglu.com/yangsf5/comments/commentRss/204033.htmlhttp://www.shnenglu.com/yangsf5/services/trackbacks/204033.html
2016-07-11 日更?nbsp;
此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?/span>
http://blog.clawz.me/2013/10/31/13-game-platform/

 


一、背景和目标

    当年大三的时候写了个五子世界,是qq game那种大厅-戉K-桌子Q我只有单逻辑的五子棋Q。毕业后一直想找个旉来重构它Q后来有ơ下军_看了下代码,有点儿不知所措,你懂的,QDQ还不如重写?/p>

    现在对go很感兴趣Q准备用go来实C前的开源梦。就先已以前的五子棋世界那种休闲游戏q_来开始练手吧?/p>

    目标暂时不定的太大,基本实现大厅-戉K-桌子-游戏p了,慢慢重构慢慢完善?/p>

 

二、服务器架构

    基本架构参照之前l公叔R目做?a title="" href="http://www.shnenglu.com/yangsf5/archive/2013/09/30/203500.html" target="_self" _href="http://www.shnenglu.com/yangsf5/archive/2013/09/30/203500.html" data_ue_src="http://www.shnenglu.com/yangsf5/archive/2013/09/30/203500.html">架构。当架构有改变时Q及(qing)时修改这博客,或者新博客与这相互引用和注解?/p>

    不同的部分,加个大厅Q大厅里昄戉K状态,q样玩家p己选择闲的戉KȝQ这样就不需要做负蝲均衡的算法了?/p>

 

Q一Q̎L(fng)l?/p>

    游戏自n不做账号密码q种用户pȝQ只用第三方的̎P如微博̎L(fng)来连接到我们游戏。或者更单点Q这块儿只模拟下微博{第三方用户pȝ的登陆了?/p>

    W三方̎戯接到我们游戏Q我们本地只p增长的uid生成器来生成一个int的uid卛_Q将W三方的platformUid和我们的localUid做个兌映射?/p>

 

Q二Q大?/p>

    大厅可以做成短连接,玩家选择游戏?qing)房间的时候才d厅刷C当前的各戉K负蝲情况?/p>

 

二、客L(fng)

    用walk。(待详l规划)



Sheppard Y 2013-10-31 23:15 发表评论
]]>集群实现l节Q?Q?玩家在线状态箋http://www.shnenglu.com/yangsf5/archive/2013/10/19/203811.htmlSheppard YSheppard YSat, 19 Oct 2013 01:41:00 GMThttp://www.shnenglu.com/yangsf5/archive/2013/10/19/203811.htmlhttp://www.shnenglu.com/yangsf5/comments/203811.htmlhttp://www.shnenglu.com/yangsf5/archive/2013/10/19/203811.html#Feedback0http://www.shnenglu.com/yangsf5/comments/commentRss/203811.htmlhttp://www.shnenglu.com/yangsf5/services/trackbacks/203811.html
2016-07-11 日更?nbsp;
此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?/span>
http://blog.clawz.me/2013/10/19/13-game-cluster-design-detail-2/

 


 

一、玩家离U?/p>

    ׃ȝ的状况多Q常见的玩家自己拿自q账号的离U,也有自己的̎号在多个讑֤来挤掉线Q还有就是被非法的h使用时的挤掉Uѝ这里应该将玩家理解Z个̎P下边量用̎h表述?/p>

Q一Q网l断开或者主动离开游戏

    q时玩家所在的服务器在玩家net.close时加入向通信redis汇报的逻辑Q即通信redis里删除这个玩家的在线U录?/p>

 

Q二Q同服重复登陆时的kick

    首先肯定要踢掉之前登陆的链接。因为同服时新旧链接都在q个服务器上Q逻辑上简单,允许新链接的登陆比较好处理,但是后边有其他考虑?/p>

 

Q三Q异服登陆时的kick

    首先也是t掉之前的登陆。需要在之前登陆到的服务器将该̎L(fng)链接断开q整理数据存储之后,才能允许在新的服务器登陆?/p>

    旧服务器清理完该玩家后,向通信redis报告删除该̎L(fng)在线状态。新服务器需要知道玩家已l在旧服被kick完了才可以让玩家登陆。刚才同服时提到的允许新链接立刻登陆的问题,q里变的比较不可控了。美好的q程是,新链接接入后挂v在新服,{异服踢完后Ql做新链接的登陆操作。但是这需要新旧服之间的同步逻辑Q需要将新服玩家做个状态机为维护这U挂hl箋登陆状态。另外还要考虑q个期间玩家又在另一个服登陆。要考虑的东西很?#8230;…

    q有一U有问题的处理方式,x服只是向老服发送踢人指令,新服自己却马上进入新链接的登陆操作。这L(fng)问题是,即业务逻辑单到不会(x)发生数据不同步问题,但登陆操作不?x)一定成功。新服登陆完向通信redis报告玩家在线Q旧服踢完要向通信redis报告玩家ȝ。这两个操作异步Ӟ如果旧服的离U报告在后,通信redis上就?x)错误的记录账号当前不在U?#8230;…

 

Q四Qȝ

    最l重复登陆问题简单处理方法:(x)账号登陆Ӟ只要到该̎号同服或异服已登陆,先将旧链接踢掉,再将新链接断开。就l玩家一个提C?#8220;账号已登录,L(fng)后重?#8221;Q让玩家自己来多操作几次Q直到旧链接被踢完?/p>

    

二、同一账号的同瞬间多v登陆事g

    ​上边重复登陆的检查还有一U情况不能防止,是瞬间的多个客L(fng)用同一账号登陆。同服时׃nodejs的异步,异服时由于天然异步,查该账号是否已登陆与当前链接成功登陆ƈ向通信redis报告q些操作不具原子性?/p>

    ​所以在最后向通信redis写入上线状态时再次判断是否已登陆(卛_断是否被瞬时q发的另一个客L(fng)的登陆给标记为已上线了)。redis里用hsetnx代替hsetQ前者在数据已经被设|时操作p|?/p>

PSQ?/p>

    刚接触不久或者本w逻辑复杂的东西Q例如分布式Q很多思考的l果不及(qing)时记录的话,后边Ҏ(gu)忘记当初的理由,D需要冗余的重复思考。所以现在博客写琐碎些,记蝲些细节的思考?/p>

 

 



Sheppard Y 2013-10-19 09:41 发表评论
]]>集群实现l节Q?Q?异服通信和压?/title><link>http://www.shnenglu.com/yangsf5/archive/2013/10/17/203784.html</link><dc:creator>Sheppard Y</dc:creator><author>Sheppard Y</author><pubDate>Thu, 17 Oct 2013 06:45:00 GMT</pubDate><guid>http://www.shnenglu.com/yangsf5/archive/2013/10/17/203784.html</guid><wfw:comment>http://www.shnenglu.com/yangsf5/comments/203784.html</wfw:comment><comments>http://www.shnenglu.com/yangsf5/archive/2013/10/17/203784.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/yangsf5/comments/commentRss/203784.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/yangsf5/services/trackbacks/203784.html</trackback:ping><description><![CDATA[<p> </p><fieldset><legend><span style="color: #ff0000;"> 2016-07-11 日更?nbsp;</span></legend><div><span style="color:red;">此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?/span></div><div></div><a ><div><span style="color:red;">http://blog.clawz.me/2013/10/17/13-game-cluster-design-detail-1/</span></div></a></fieldset><a ><div></div><p> </p></a><p><br /></p><p>一、背?/p> <p>    目开始后Q先敲定了大体可横向扩展的集架构(q是个美好的期望Q,然后开始编写单q程的服务器底层和逻辑Q让前边几个q代周期的逻辑内容配合客户端跑h了?/p> <p>    接着是单q程的架构扩展v来,设计上细化下架构的扩展。已写在前篇《休闲手游服务器集群扩展思考》里。最q的两周在将之前单进E的服务器架构里部分模块扩展为支持这随W里提到的集架构?/p> <p>    实现的过E中到的一些需要仔l设计的l节Q原则上q是K.I.S.S?/p> <p> </p> <p>二、全服玩家在U状?/p> <p>    逻辑服务器集的负蝲均衡法q没实现。先只扩展玩安的同服通信为异服通信Q通过redis的pub/subQ以下将q个用于通信转发的redisUCؓ(f)通信redisQ?/p> <p>    问题链:(x)Q?#8220;-->>”引出的下个问题被当前问题所依赖Q?/p> <p>        通信发v斚w要知道目标方在逻辑集群里的哪个服务器上 -->></p> <p>        玩家登陆和退出时往通信redis报告 -->></p> <p>        登陆时检查̎h否注册到我们的游戏,否就注册 -->></p> <p>        </p> <p>Q一Q登陆和注册</p> <p>    玩家拿到用户pȝ的̎h登陆我们游戏服务器。游戏服务器拿clientl的q个code再去用户pȝ服务器做验证Q通过后l?/p> <p>    查̎h否在我们游戏注册Q如果没有则注册上,映射出游戏服务器上的一个local uid。这里需要检查玩家是否在游戏注册了,所以需要一个platform uid与local uid的映表。这个映之前单q程服务器时与其他角色数据放在相同redis上的Q现在移到全局cȝredis上(以下U全局redisQ暂时是通信redis和全局redis放一L(fng)Q等以后看压和U上反馈再做演变Q。另外用来本地注册生成local uid的自增长id也移C全局redis上?/p> <p>    ​查完注册Q得到l(f)ocal uidQ先看是否在本服务器登陆了,否则再向通信redis查看是否登陆在其他服务器。如果已登陆Q则t掉之前的登陆。之前单q程只有同服重复登陆thQ现在多个异服重复登陆的th操作?/p> <p>    登陆成功向通信redis报告local uid和所在的q个logic服务器的server id。另外退出时也向通信redis报告Q注销掉这条记录?/p> <p> </p> <p>Q二Q异服通信</p> <p>    每个逻辑服务器都与通信redis建立用于pub/sub的链接,各逻辑服务器有自己的频道?/p> <p>    异服上的玩家通信Ӟ从通信redis拿到目标玩家所在server idQ让后向目标server所对应的专有频道pub数据卛_?/p> <p>    </p> <p>三、压工?/p> <p>    加了q个集群扩展后,底层试只是单元试是不够的。反正要压力试工具q早要写Q就先写了简单版的压工P来做异服通信的自动化试?/p> <p>    压测工具开始的x挺多的,后来抛弃了一些短期不好实现的x。现在就单的Q一个client一个Client structQ这个处理client的通信发送接收。做相同动作的clientZ个Group struct。每个动作ؓ(f)一个Rule structQ里边组合好收到什么包后做什么事情,或者直接发些什么包?/p> <p>    c++端游压测的每个Rule动作一般用lua来写的,比较方便Q我们这个压工L(fng)go写,rule暂时也用go写,也不ȝ?/p> <p>    感慨下,q种q行的应用场景,go的编E思维与具体写法比node.js更适合c/c++n的程序员?/p><p> </p><img src ="http://www.shnenglu.com/yangsf5/aggbug/203784.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-10-17 14:45 <a href="http://www.shnenglu.com/yangsf5/archive/2013/10/17/203784.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>休闲手游服务器集扩展思?/title><link>http://www.shnenglu.com/yangsf5/archive/2013/09/30/203500.html</link><dc:creator>Sheppard Y</dc:creator><author>Sheppard Y</author><pubDate>Mon, 30 Sep 2013 02:46:00 GMT</pubDate><guid>http://www.shnenglu.com/yangsf5/archive/2013/09/30/203500.html</guid><wfw:comment>http://www.shnenglu.com/yangsf5/comments/203500.html</wfw:comment><comments>http://www.shnenglu.com/yangsf5/archive/2013/09/30/203500.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/yangsf5/comments/commentRss/203500.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/yangsf5/services/trackbacks/203500.html</trackback:ping><description><![CDATA[<div></div><fieldset><legend><span style="color: #ff0000;">2016-07-11 日更?nbsp;</span></legend><div><span style="color:red;">此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?/span></div><div></div><a ><div><span style="color:red;">http://blog.clawz.me/2013/09/30/13-mobile-game-cluster-design/</span></div></a></fieldset><a ><div></div><p> </p></a><p><br />一、目?/p> <p>    能横向扩展,架构要简单,能做到负载均衡,避免单节点负载太ȝ资源费?/p> <p> </p> <p>二、数据存储的DB集群</p> <p>    ​数据存储cd有多U?/p> <p>Q一Q非交互性的个h数据</p> <p>    ​可通过单的id分段。id?~10000的玩家个人数据存储在db1Qid?0001~20000的玩家个人数据存储在db2Q以此类推?/p> <p> </p> <p>Q二Q交互性数?/p> <p>    ​如好友关pȝ?/p> <p>Q?Q如果好友关pd以ؓ(f)单向Q那么可以将关系存到个h数据里?/p> <p>Q?Q如果好友关pM能ؓ(f)单向Q那么需要保证每条关pM持在要么没有Q要么两人都认同Q记数据上一_(d)互相有关pR那么需要保证相关的关系操作的一致性。这样可能只保存一份每两个Z间的关系Qk-v存储旉要方向查找,不知是否能实现?/p> <p> </p> <p>Q三Q全局数据</p> <p>    ​如全局排行榜之cȝ。这U放在单独的库里里,专门做全局数据的存储。当C定规模时Q按全局数据的类型再分库?/p> <p>    ​家族、帮?x)等Q也攑֍独的库里。如果需要扩展,再按家族id、帮?x)id来分库?/p> <p> </p> <p>三、逻辑服务器集对DB集群的访?/p> <p>    ​DB集群的\p则配|到逻辑服务器的config里。当需要热扩展DBӞ启动新DB后,l各logic服务器发送GM指定Qreload路由规则的config?/p> <p>    ​DB集群路由规则的configQ可以放在一个公共地方,各logic服务器接到GM指o(h)后,d共地Ҏ(gu)取新的config然会(x)reload?/p> <p> </p> <p>四、逻辑服务器集?/p> <p>    ​Z架构的简单,可以每个逻辑服务器进E上都有所有逻辑Q扩展时Q以扩展逻辑服务器进E数量来辑ֈ?/p> <p>Q一Q各逻辑服务器上玩家分配</p> <p>    ​逻辑服务器集之间的交互。如果逻辑服务器的使用Q也像个人数据存储的DB那样id分段——只让1~10000的玩家登陆logic1Q?0001~20000的玩家登陆logic2Ӟq很单,但各id断的玩家z跃度不定的Q做不到负蝲均衡啊?/p> <p>    ​所以是Ҏ(gu)当时的负载情况,来推荐玩家登陆闲的逻辑服务器的。这样需要有个全局映射Q知道哪个玩家登陆在哪个服务器上。可以将玩家当前所在的服务器id记录在该玩家的个人数据所在的db里?/p> <p>Q二Q逻辑服务器间的通信</p> <p>    ​目前目持久化用redisQ最快出东西Q就先考虑redis的优ѝ?/p> <p>    ​逻辑服务器间的通信Q通过全局数据存储的redis来做pub/sub转发吧?/p> <p>    ​redis的pub和sub的实时性不够时Q?#8203;有实时性需求的玩家都{C个专门做强实时性的Ҏ(gu)逻辑服务器?/p> <p> </p> <p>五、PS</p> <p>    ​公司的项目是Node.js+RedisQ业余时间打用Go写个服务器引擎?/p> <p>    ​q篇考虑发到_֍区,可以得到很多的批评徏议?/p><img src ="http://www.shnenglu.com/yangsf5/aggbug/203500.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-09-30 10:46 <a href="http://www.shnenglu.com/yangsf5/archive/2013/09/30/203500.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开始学?fn)Common Lisphttp://www.shnenglu.com/yangsf5/archive/2013/09/15/203239.htmlSheppard YSheppard YSun, 15 Sep 2013 03:25:00 GMThttp://www.shnenglu.com/yangsf5/archive/2013/09/15/203239.htmlhttp://www.shnenglu.com/yangsf5/comments/203239.htmlhttp://www.shnenglu.com/yangsf5/archive/2013/09/15/203239.html#Feedback0http://www.shnenglu.com/yangsf5/comments/commentRss/203239.htmlhttp://www.shnenglu.com/yangsf5/services/trackbacks/203239.html
2016-07-11 日更?nbsp;
此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?/span>


一、ؓ(f)何想学lisp

    ​最初了解lisp是从《黑客与d》里Q里边的黑客强烈推荐E序员用lispQƈ有部分讲《ؓ(f)什么lisp语言如此先进Q》,书是阮一峰翻译的Q这节在他的博客也有节选:(x)

    ​http://www.ruanyifeng.com/blog/2010/10/why_lisp_is_superior.html

    ​ȝ一下:(x)

a. 近代的语言像lispQ而当前最新潮的语a也只是实Clisp作者在1958q的设想Q因为lisp设计目的是数学理论演而不是语aq种本质上的一U技术。技术会(x)q时而数学不。今天最高的主语aQ也只是刚刚接近lisp的水q뀂虽然已l接q,但还是没有lisp那么强大?/p>

b. {等Q其他不一一摘抄?/p>

    ​其中一Ҏ(gu)刎ͼ“一行lisp代码相当?0行C代码”。lisp?x)羃短开发周期,而且q是c能做lisp所有事情的前提下。文中D例说Q如果你用其他语a跟别人lisp语言的公司竞争,同样的功能你比别h慢很久才能开发完Q竞争就Z劣势?/p>

    ​其他在网l上看到的lisp相关a论:(x)

    ​起名?#8220;格林斯潘W十定律”QGreenspun's Tenth RuleQ:(x)“MC或FortranE序复杂C定程度之后,都会(x)包含一个(f)时开发的、只有一半功能的、不完全W合规格的、到处都是bug的、运行速度很慢的Common Lisp实现?#8221;

 

二、学?fn)过E中

    ​另外q有个原因,最q想了解函数式编E,想了解下支持分布式原语的erlangQ先学哪个还是纠l了下的? 后来考虑到新到的目中想设计成分布式扩展方便的服务器架构Q就优先学下erlang。先花几天把《ErlangE序设计》给看完了,看的很激动,但是考虑到项目h员现状及(qing)来的维护,目没用erlangQ用了node.js?/p>

    之后又花几天把许式伟他们写的《Go语言~程》看完了。go语言实不错Q以后可以考虑用这个写个游戏服务器引擎什么的。本想立卛_开动,但是目属于开始搭架子阶段Q需要思考的旉挺多Q回家可以利用的旉不多Q专心写开源项目不现实?/p>

    ​于是回家的时间先学Common LispQ以下简UclQ,现在正在看田春翻译的《实用Common Lisp~程》,看到12.6映射?/p>

    ​cl很多东西跟类c的语a差别比较大了,看的q度q是挺慢的。看着看着Q一Ҏ(gu)叹他强大的表现力Q一Ҏ(gu)点害怕太庞大Q以后实用v来不利?/p>

    ​如果找䆾cl的工作,国内大小公司估计都不大好找。除非能在一个高手云集的团队里,大家又都喜欢clQ而且我们有话语权……

    ​所以将来cl在ؓ(f)了更好的思考编E之外,很可能只是用来写些脚本或者自q玩具什么的。近期的应用可能是生成javascript代码?/p>

    ​{cl学的不错了,可以做些个h目的快速开?#8230;…

    ​

三、我了解Common Lisp一些资?/p>

    ​一下书c,按阅读顺序(在知乎看到的Q别的地Ҏ(gu)荐也大同异Q:(x)
《Structure and Interpretation of Computer Programs》(SICPQ可以启发思想Q尤其是函数式编E入门;
《Practical Common Lisp》和《Land of Lisp》也适合初学者;
《On Lisp》主要讨论macro的用;
《Let over Lambda》在《On Lisp》基上更深入讨论宏?/p>

     ​《On Lisp》和《Practical Common Lisp》(中译为《实用Common Lisp~程》) q春翻译完成。我个h先买了SICPQ但是里Ҏ(gu)讲SchemeQ看了几节怕到时学lisp?x)؜乱,p{先实用lispq本了?/p>

    ​另外我用的实现是Steel Bank Common Lisp?/p>

 

 四、附上这D|间了解的函数式语a个h?/p>

    ​q条自己的理解,Ua(b)Z自己做个W记?/p>

    haskell貌似比较斎ͼ应用不多Q别说是分布式,是普通应用也不多。haskell是纯函数式。而lisp不是U的Q还可以以别的方式来~程?/p>

    ​erlang倒是L分布式。erlang内置了多台机器之间的通讯原语Q程序员只用兛_业务逻辑可以了?/p>

    ​lisp主要是一U全新的看待软g开发的视角?/p>

    ​​go也支持闭包?/p>

 



Sheppard Y 2013-09-15 11:25 发表评论
]]>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(fng)与服务器的通信

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

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

Q一QconnectorlgQcomponents/connector.jsQ?/p>

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

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

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

        'connection'事g处理为:(x)

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

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

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

 

Q二Qhybridconnector的实?/p>

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

    hybridconnector.start里会(x)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_(d)如果有,则调用wsprocessor.addQ这个add?x)向外emit 'connection'Q事件参Cؓ(f)原生socketQ,q向socket emit 'data'事gQ否则非httpQ则调用tcpprocessor.addQ这个add?x)以刚才的原生socket为参数创Z个tcpsocketQ同时向tcpprocessor emit 'connection'Q事件参Cؓ(f)原生tcpsocketQ、向q个原生socket emit 'data'事g?/p>

    switcher也监听了this.wsprocessor和this.tcpprocessor?connection'事gQ处理ؓ(f)向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Ҏ(gu)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细节和设计Ҏ(gu)都得熟?zhn)下。结合chatofpomelo-websocketQ先从pomelo的用入口开始看?/p>

 

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

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

    createApp时会(x)调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里会(x)遍历componets目录里的各个js文gQ然后require到Pomelo里和Pomelo.components里?/p>

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

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

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

 

三、ps

    ​q篇发表后,在google里搜了下Q我的一Ҏ(gu)味Q经常发表随W后?x)看看搜索引擎收录了没?#8220;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 发表评论
]]>
node.js手游服务器调?/title><link>http://www.shnenglu.com/yangsf5/archive/2013/08/12/202497.html</link><dc:creator>Sheppard Y</dc:creator><author>Sheppard Y</author><pubDate>Mon, 12 Aug 2013 09:21:00 GMT</pubDate><guid>http://www.shnenglu.com/yangsf5/archive/2013/08/12/202497.html</guid><wfw:comment>http://www.shnenglu.com/yangsf5/comments/202497.html</wfw:comment><comments>http://www.shnenglu.com/yangsf5/archive/2013/08/12/202497.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/yangsf5/comments/commentRss/202497.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/yangsf5/services/trackbacks/202497.html</trackback:ping><description><![CDATA[<div></div><fieldset><legend><span style="color: #ff0000;">2016-07-08 日更?nbsp;</span></legend><div><span style="color:red;">此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?/span></div><div></div><a ><div><span style="color:red;">http://blog.clawz.me/2013/08/12/13-nodejs-mobile-game-server-research/</span></div></a></fieldset><a ><div></div><p> </p></a><p><br />一、node.js能做?/p> <p>    <a _>http://www.infoq.com/cn/articles/what-is-nodejs</a></p> <p> </p> <p>二、杂w?/p> <p>1. http的长q接是不是也是只能req/rep模式Q能实现服务器端push吗?</p> <p>    http的长q接即HTTP keep-aliveQHTTP1.1里加入)Q这个原生的只是Z更少的徏立和关闭tcp链接Q可以减网l流量;因ؓ(f)已徏立的tcp握手Q减后l请求的延时{。这个http长连接不支持全双工通信?/p> <p>    http实现“服务器推”的技术,一是借助客户端Flash XMLSocket或者Java Applet套接口来实现Q另一U是comet技术。(q有一U遭|的客户端以一定间隔向服务器发求的轮询׃提了Q?/p> <p>    comet有两U:(x)</p> <p>        Q?Q基于AJAX的长轮询Qlong-polling技术)</p> <p>        Q?Q基?Iframe ?htmlfile 的流QstreamingQ方?/p> <p>    q两U方式看描述已经L游服务器差远了,׃L惹它们了吧?/p> <p> </p> <p>2. 大规模网站的架构Q怎么做到水^扩展的?</p> <p>    |站的需求跟游戏不一P|站都是http够了,req/rep卛_Q没有交互等q播同步之类的复杂状态?/p> <p>    Qpomelo里表C游戏的业务模型很难做到传统|站那种无限水^扩展Q?/p> <p> </p> <p>3. websocekt是什么?</p> <p>    html5开始提供的Qؓ(f)了ɋ览器和服务器间q行全双工通讯的长链接协议。websocket协议本质上是一个基于TCP的长q接协议。与传统C/S长连接的区别在于Qwebsocket链接开始时的握手协议,客户端首先要向服务器发v一个HTTP骑牛Q这个请求和通常的HTTPh不同Q包含了一个附加信?Upgrade:WebSocket"表明甌协议升Q服务器回应后,x手完成,websocket链接建立hQ双方自由通信Q直C方关闭链接?/p> <p>    websocket相对于http的优点,除了全双工通讯Q还有服务器与客L(fng)交换的header信息很小?/p> <p>    websocket与传lsocket的区别,前者有帧协议,不需要上层做拼包了?/p> <p> </p> <p>4. redis可以直接搞集吗Q?/p> <p>    数据量太大时Qredis的持久化?x)媄响性能Q解x案时用个slave专职做持久化。另外redis容灾和传lweb应用的减压,开多个slaveQ用于分担读的压力?/p> <p>    当库C定数量时Q可以用分库分表来水qx展?nbsp;</p> <p> </p> <p>5. node.js能用c++扩展吗?</p> <p>    v8和node都是c++写的?/p> <p> </p> <p>三、网易pomelo能干些啥</p> <p>    分布式服务器Q方便扩展。另外实C很多游戏常用模块Q如aoi{?/p> <p> </p> <p>四、公司的node.js框架有哪些不能做?/p> <p>1. websocket实现了吗Q?/p> <p>    实现中?/p> <p>2. 方便分布式扩展吗Q?/p> <p>    貌似没有pomelo那么方便?nbsp;</p> <p> </p> <p>五、ȝ</p> <p>    ​node.js做手游服务器的开发还是挺方便的,pomelo已经做很多事?#8230;…</p> <p> </p> <p>N、参?/p> <p>1. CometQ基?HTTP 长连接的“服务器推”技术:(x)<a _>http://www.ibm.com/developerworks/cn/web/wa-lo-comet/</a></p> <p>2. WebSocketQ?a _>http://zh.wikipedia.org/wiki/WebSocket</a></p> <p>3. 使用 HTML5 WebSocket 构徏实时 Web 应用Q?a _>http://www.ibm.com/developerworks/cn/web/1112_huangxa_websocket/</a></p> <p>4. pomeloQ?a _>https://github.com/NetEase/pomelo</a></p> <p>5. HTTP长连接:(x)<a _>http://www.blogjava.net/xjacker/articles/334709.html</a></p> <p>6. Redis复制与可扩展集群搭徏Q?a _>http://www.infoq.com/cn/articles/tq-redis-copy-build-scalable-cluster</a></p><img src ="http://www.shnenglu.com/yangsf5/aggbug/202497.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-08-12 17:21 <a href="http://www.shnenglu.com/yangsf5/archive/2013/08/12/202497.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>facebook接入http://www.shnenglu.com/yangsf5/archive/2013/08/08/202411.htmlSheppard YSheppard YThu, 08 Aug 2013 04:53:00 GMThttp://www.shnenglu.com/yangsf5/archive/2013/08/08/202411.htmlhttp://www.shnenglu.com/yangsf5/comments/202411.htmlhttp://www.shnenglu.com/yangsf5/archive/2013/08/08/202411.html#Feedback0http://www.shnenglu.com/yangsf5/comments/commentRss/202411.htmlhttp://www.shnenglu.com/yangsf5/services/trackbacks/202411.html
2016-07-08 日更?nbsp;
此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?/span>

一、需?/p>

    我方游戏服务器ؓ(f)一套nodejs框架下开发的Q手机App前端为javascript。现在需要将游戏接入facebookQ要求能用facebook登陆我方游戏Qƈ可以取到玩家的facebook好友{信息、可以向好友送礼Q还可以向玩家facebook增加游戏状态?/p>

    如果为前端接入,需要封装出js的接口?/p>

 

二、接入方?/p>

    需求里涉及(qing)C玩家间的利益交互Q如q里的可以向好友送礼。需要确认游戏里q些利益交互Q现在的利益可能较弱Q但需要考虑来的利益交互规划)被外挂刷后是否对游戏有媄响?/p>

    如果影响较大Q例如刷了很多物品,让游戏失d^?#8212;—RPG里可能是装备特牛Q休闲游戏可能是道具很多Q更有利于冲?yn)L行榜{。就需要将facebook的接入方式定为server-side接入。如果媄响较?yu),无所谓,可以像单机游戏那样在前端做接入,facebook的好友信息等由前端传到我们服务器?/p>

 

Q一Qserver-side接入

    官方?a _>https://developers.facebook.com/docs/sdks/ 里收录的W三方nodejs的sdk?a _>https://github.com/amachang/facebook-node-sdk?/p>

    q种是nodejs开的本地网站,然后本地|站可以开个网址做facebook的接入验证,之后取玩家的facebook信息Q可以调?yu)装好的facebook API。效果可以开代理看下http://claw-fb-off.herokuapp.com?/p>

    但是不知我们服务器的nodejs和前端App的js之间是否支持q种|页式的交互。咨询了nodejs框架l的同学Q表CZ行,我自己没做过q方面的东西Q所以还是要h戏组同学看看?/p>

    另外咨询了众多项目组Q做q接入的都是前端接入Q还没有做过server-side接入的?/p>

 

Q二Qclient-side接入

  1. 官方提供native IOS和Android API的SDK?/p>

  2. 另外也提供javascript SDKQ?a _>https://developers.facebook.com/docs/reference/javascript/Q,貌似也是|页形式Q不知我们前端是否支持?

  3. EziSocial-Plugin为C++~写Q但是这个是收费的,游戏l确认要用吗Q?/p>



Sheppard Y 2013-08-08 12:53 发表评论
]]>懒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:(x)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可以靠多练?fn)来增加熟练度,各个步骤也慢慢根据经验来优化Q来做好旉l筹?/div>



Sheppard Y 2013-07-17 21:13 发表评论
]]>TopN动态排行榜实现http://www.shnenglu.com/yangsf5/archive/2013/07/12/201725.htmlSheppard YSheppard YFri, 12 Jul 2013 05:05:00 GMThttp://www.shnenglu.com/yangsf5/archive/2013/07/12/201725.htmlhttp://www.shnenglu.com/yangsf5/comments/201725.htmlhttp://www.shnenglu.com/yangsf5/archive/2013/07/12/201725.html#Feedback0http://www.shnenglu.com/yangsf5/comments/commentRss/201725.htmlhttp://www.shnenglu.com/yangsf5/services/trackbacks/201725.html    ​目前只是单的装了stl的heap相关法Q?/p>

    ​https://github.com/yangsf5/claw-gse/blob/master/src/claw/gse/top_n.h

    ​​



Sheppard Y 2013-07-12 13:05 发表评论
]]>
protobuf与shared memoryhttp://www.shnenglu.com/yangsf5/archive/2013/06/26/201309.htmlSheppard YSheppard YTue, 25 Jun 2013 16:03:00 GMThttp://www.shnenglu.com/yangsf5/archive/2013/06/26/201309.htmlhttp://www.shnenglu.com/yangsf5/comments/201309.htmlhttp://www.shnenglu.com/yangsf5/archive/2013/06/26/201309.html#Feedback0http://www.shnenglu.com/yangsf5/comments/commentRss/201309.htmlhttp://www.shnenglu.com/yangsf5/services/trackbacks/201309.html
2016-07-08 日更?nbsp;
此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?/span>
http://blog.clawz.me/2013/06/26/13-protobuf-shared-memory/

 


    ​目里shared memory存放的数据结构,现在需要将其同时用于server与client之间的相应数据交互。server与client之前的协议格式ؓ(f)protobuf?/p>

    ​Z只维护一份代码,准备之前用于shared memory的结构{化ؓ(f)protobufQ然后两处都用这个protobuf?/p>

    ​搞了一?x)儿Q才惌vshared memory里只适合存定长的非指针结构?/p>

    ​汗,q个几年前就l历q,那个时候是学生时代做五子棋世界的时候,貌似是想往shared memory里存放std::map?/p>

    ​当时水^太低Q报错了放弃了stl的容器,写些了中规中矩的l构体?/p>

    ​q次顺便搜下当q那个问题的解决Ҏ(gu)。找C说的挺好的:(x)http://www.cnblogs.com/fullsail/archive/2013/01/20/2868898.html?/p>

    ​大意是Qstl里容器会(x)动态分配内存,而且new的东西在自己的进E空间里Q别的进E访问时必然是个不对的指针。需要将stl的分配器定制Z׃n内存里分配空_(d)或者其他几个链接里提到的方法?/p>

    ​回到我现在遇到的protobufq个问题Qprotobuf里有些如repeated或者string{会(x)动态newQ这个如果做内存分配的定Ӟq得重改protobuf的代码,复杂度比较高?/p>

    ​加上目里的q单个协议格式制定的需求只是(f)时的Q就更没必要了。最l放弃protobufl构直接映射到共享内存的企图?/p>

    ​



Sheppard Y 2013-06-26 00:03 发表评论
]]>IncrediBuild~译问题http://www.shnenglu.com/yangsf5/archive/2013/06/25/201288.htmlSheppard YSheppard YTue, 25 Jun 2013 04:53:00 GMThttp://www.shnenglu.com/yangsf5/archive/2013/06/25/201288.htmlhttp://www.shnenglu.com/yangsf5/comments/201288.htmlhttp://www.shnenglu.com/yangsf5/archive/2013/06/25/201288.html#Feedback2http://www.shnenglu.com/yangsf5/comments/commentRss/201288.htmlhttp://www.shnenglu.com/yangsf5/services/trackbacks/201288.html
2016-07-08 日更?nbsp;
此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?/span>
http://blog.clawz.me/2013/06/25/13-incredibuild-problem/

 


    自己工作机在vc点incredibuild~译时L昄fail to create processQ周围同事却都没问题。这里记下解决的q程?/p>

 

一、fail to create process

    ​q个错误提示Q第一反应是用户没权限,查看了用户之后,提示q个用户是理员。后来各U倒腾都无果?/p>

    ​权限的问题一时没解决Q想别的办法……

    试出一个办法:(x)点开d栏右下角的IncrediBuild AgentQ右键选择Build->open后打开的Batch Build里编译是完全没有问题的,没有那个创徏q程p|的问题?/p>

     ​所以想Q是不是因ؓ(f)vc的插件运行时的编译配|有问题Q而在Agent独立q程里的Batch Build里的~译配置比较U净Q例如不用搞那个cmake之类的检查)?/p>

    于是扑ֈAgent开启Batch Build时的q程为BatchFile.exeQ但是在自己写的bat里单独启动BatchFileQ启动后弹出Batch BuildQ选择~译后却也还是创Z了进E错误?/p>

    偶然在vc的工h的IncrediBuild选项里也发现了Batch Build选项Q弹出的Batch Build也是不能创徏U程。再ơ扫兴?/p>

    ​所以想Q是不是因ؓ(f)做ؓ(f)vc的插件和bat里启动运行时没有创徏q程的权限。而在Agent独立q程里运行时能拿到权限?

 

    ​最后某此搜什么东西,憋见一个说法,“右键菜单win7理员n份运?#8221;。如果就特么搞定了?nbsp;

    解决办法大概是:(x)win7启动vc时以理员n份运行,E序鼠标右键有那个选项。另外也可以看看快捷方式里设|。之后从vc里load你的目?/span>更方便的是将你的vcE序Q打开属性的兼容性标{,Ҏ(gu){里勾上以理员n份运行此E序?span style="color: #000000">Q设|之后我在TC里不能直接双d?*.slnQ只好右键选择vc来启动)

 

    ​随后x不是TotalCommand里v的进E没理员权限,后来试了试不是这L(fng)……

 

    ​ȝQ我的win7用户不是真宗的管理员Q虽然控刉杉K提示了是Q?/p>

 

二、其他问?/p>

    ​有时~译完后不能自动stop buildQ还得手动点?/p>

    ​q个看看q程理器里好多僉|的build相关q程Q全q掉?/p>

Sheppard Y 2013-06-25 12:53 发表评论
]]>【msvc调试】客L(fng)某个程后server卡住http://www.shnenglu.com/yangsf5/archive/2013/06/21/201196.htmlSheppard YSheppard YFri, 21 Jun 2013 04:40:00 GMThttp://www.shnenglu.com/yangsf5/archive/2013/06/21/201196.htmlhttp://www.shnenglu.com/yangsf5/comments/201196.htmlhttp://www.shnenglu.com/yangsf5/archive/2013/06/21/201196.html#Feedback0http://www.shnenglu.com/yangsf5/comments/commentRss/201196.htmlhttp://www.shnenglu.com/yangsf5/services/trackbacks/201196.html
2016-07-08 日更?nbsp;
此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?/span>
http://blog.clawz.me/2013/06/21/13-debug-server-hang/

 



   单步到崩溃地点,有数l取数据和拷贝操作,猜测数组界D的栈溢出。就开始找界查工兗?/p>

    vs自n带的/GS只是在栈溢出时蹦个异常,不会(x)l你定位崩在哪。所以找了会(x)儿别的工Pboundscheckerq没扑ֈ下的地方QIBM的purify跨^C是收费,另外免费好用的就是linux下的valgrind了。这几种内存?gu)查工具都可以查内存泄露和界之类的。只是项目现在赶q度Qlinuxq_的编译还没时间解冻I内存l一查就作Ş?/p>

    开始看看能不能查dump。dump不是原生的dmp而是历史代码里重存ؓ(f)别的了。vc调试不很熟练Q就索性把重存dump那块儿的catchl干掉了。直接让~译器崩C码块儿再看看能不能看Z么问题?/p>

    崩停到具体代码行了,很惊喜,赶紧看看各变量内存状况,问题数组是一个指针数l,q次惊喜的发C前单步的那个下标对应在数l元素指针跟别的不一P?xcdcdcdcdQ确认了下ؓ(f)vc下ؓ(f)未初始化的指针?/p>

    q样好查了Q问题定位到了,后边的就不啰嗦了?/p>

    最l问题是Q同事给一个类新加了几个指针成员,但是q几个没有new出来初始化之。唉……只能感叹下敏捷开发那本书里说的,架构师要参加~码Q我觉得要加点儿Q就是架构师要参与编码还要参与测试调试自q代码?/p>

Sheppard Y 2013-06-21 12:40 发表评论
]]>【msvc调试】server初始化时卡在某个?/title><link>http://www.shnenglu.com/yangsf5/archive/2013/06/21/201195.html</link><dc:creator>Sheppard Y</dc:creator><author>Sheppard Y</author><pubDate>Fri, 21 Jun 2013 04:38:00 GMT</pubDate><guid>http://www.shnenglu.com/yangsf5/archive/2013/06/21/201195.html</guid><wfw:comment>http://www.shnenglu.com/yangsf5/comments/201195.html</wfw:comment><comments>http://www.shnenglu.com/yangsf5/archive/2013/06/21/201195.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/yangsf5/comments/commentRss/201195.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/yangsf5/services/trackbacks/201195.html</trackback:ping><description><![CDATA[<div></div><fieldset><legend><span style="color: #ff0000;">2016-07-08 日更?nbsp;</span></legend><div><span style="color:red;">此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?/span></div><div></div><a ><div><span style="color:red;">http://blog.clawz.me/2013/06/21/13-vc-debug-while/</span></div></a></fieldset><a ><div></div><p> </p></a><p><br />    初步调试Q发现某个类的构造函数进了,但是在左花括L(fng)地方卡住了Q没有往后走?/p> <p>    一开始挺惊奇Q过?x)儿想刎ͼcȝ构造函数里?x)被~译器插入一些没有显C初始化的成员的初始化语句。所以讲F10改ؓ(f)F11调试?/p> <p>    慢慢g扑ֈ问题函数了,正准备再重开调试l箋跟时Q朋友表C按下vc的暂停键Q照做,“我擦——”之后是崇拜的口水?/p> <p>    问题原因Qwhile的退出变量没有自增,Dd@环了?br /><br /></p> <p>    ȝQ?/p> <p>        E序卡在哪儿Q基本就是死循环或者死锁。死循环的发玎ͼ可以看cpu占用来佐证。问题定位,暂停调试?/p> <p>        死锁的定位,可以看stackQ里边应该有wait之类的?/p><img src ="http://www.shnenglu.com/yangsf5/aggbug/201195.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-06-21 12:38 <a href="http://www.shnenglu.com/yangsf5/archive/2013/06/21/201195.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>调试W记集锦http://www.shnenglu.com/yangsf5/archive/2013/05/31/200714.htmlSheppard YSheppard YFri, 31 May 2013 03:48:00 GMThttp://www.shnenglu.com/yangsf5/archive/2013/05/31/200714.htmlhttp://www.shnenglu.com/yangsf5/comments/200714.htmlhttp://www.shnenglu.com/yangsf5/archive/2013/05/31/200714.html#Feedback0http://www.shnenglu.com/yangsf5/comments/commentRss/200714.htmlhttp://www.shnenglu.com/yangsf5/services/trackbacks/200714.html一、gcc

 

二、msvc
1.【msvc调试】server初始化时卡在某个点:(x)http://www.shnenglu.com/yangsf5/archive/2013/06/21/201195.html

2.【msvc调试】客L(fng)某个程后server卡住Q?a href="http://www.shnenglu.com/yangsf5/archive/2013/06/21/201196.html">http://www.shnenglu.com/yangsf5/archive/2013/06/21/201196.html
 

 

三、golang

 

1. json文g映射到内存失?/p>

    json文g里的字符串必ȝ双引受?a title="" target="_self" data_ue_src="http://www.json.org/json-zh.html">官方标准json的字W串只能双引号Q只是jsq种允许单引P所以之前js的程序里可以解析单引L(fng)json配置文g?/p>

 

 



Sheppard Y 2013-05-31 11:48 发表评论
]]>
msvc~译问题集锦http://www.shnenglu.com/yangsf5/archive/2013/05/10/200165.htmlSheppard YSheppard YFri, 10 May 2013 09:12:00 GMThttp://www.shnenglu.com/yangsf5/archive/2013/05/10/200165.htmlhttp://www.shnenglu.com/yangsf5/comments/200165.htmlhttp://www.shnenglu.com/yangsf5/archive/2013/05/10/200165.html#Feedback0http://www.shnenglu.com/yangsf5/comments/commentRss/200165.htmlhttp://www.shnenglu.com/yangsf5/services/trackbacks/200165.html 

1. 链接libprotobuf.libӞ报与pȝ某库冲突Qvc忽略pȝ库。这个有可能?x)出现别的问题。解军_法就是将protobuf的编?#8220;q行?#8221;讄和自己工E的讄成同一个,例如均ؓ(f)/MDd时就ok了?/p>

   q个q是linux下gcc舒服?/p>

2. IncrediBuild~译问题Q?a href="http://www.shnenglu.com/yangsf5/archive/2013/06/25/201288.html">http://www.shnenglu.com/yangsf5/archive/2013/06/25/201288.html

3. Debugging information for *.exe cannot be found or does not matchQ?/p>

    ​​http://www.cnblogs.com/ustcwhc/archive/2012/04/05/2432829.html




Sheppard Y 2013-05-10 17:12 发表评论
]]>
X目C++服务器(1Q? M构想http://www.shnenglu.com/yangsf5/archive/2013/04/25/199704.htmlSheppard YSheppard YThu, 25 Apr 2013 06:52:00 GMThttp://www.shnenglu.com/yangsf5/archive/2013/04/25/199704.htmlhttp://www.shnenglu.com/yangsf5/comments/199704.htmlhttp://www.shnenglu.com/yangsf5/archive/2013/04/25/199704.html#Feedback0http://www.shnenglu.com/yangsf5/comments/commentRss/199704.htmlhttp://www.shnenglu.com/yangsf5/services/trackbacks/199704.html
2016-07-08 日更?nbsp;
此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?/span>

 

http://blog.clawz.me/2013/04/25/13-x-cpp-server/ 

 

 

一、简?/p>

    q个目刚v步,来有可能会(x)演变为公司的服务器框架。博客里暂且U呼为X目?/p>

    语言为c++Q之后将此服务器的设计演变尽量记录下来,Z个系列,?#8220;X目C++服务?#8221;为统一标题开头?/p>

 

二、架构设?/p>

Q一Q多q程通信Ҏ(gu)

    zeromq

Q二Q协议方?/p>

    protobuf 

Q三Q存?/p>

    redis

Q四Q脚?/p>

    luaplus

Q五Q日?/p>

    glog

 

三、自动构建部|?/p>

    自动构徏{ؓ(f)敏捷开发提供保障?/p>

    之前l历的那些项目(其中包括业内比较有名?个大型项目)在自动构建部|方面基本ؓ(f)0Q开发效率不高,q次新项目准备从一开始就做这斚w的准备?/p>

Q一Q单?/p>

    单测框架考虑google的gtest?/p>

 



Sheppard Y 2013-04-25 14:52 发表评论
]]>cmake用cotire讄gcc的预~译?/title><link>http://www.shnenglu.com/yangsf5/archive/2013/04/23/199658.html</link><dc:creator>Sheppard Y</dc:creator><author>Sheppard Y</author><pubDate>Tue, 23 Apr 2013 06:10:00 GMT</pubDate><guid>http://www.shnenglu.com/yangsf5/archive/2013/04/23/199658.html</guid><wfw:comment>http://www.shnenglu.com/yangsf5/comments/199658.html</wfw:comment><comments>http://www.shnenglu.com/yangsf5/archive/2013/04/23/199658.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/yangsf5/comments/commentRss/199658.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/yangsf5/services/trackbacks/199658.html</trackback:ping><description><![CDATA[<div></div><fieldset><legend><span style="color: #ff0000;">2016-07-08 日更?nbsp;</span></legend><div><span style="color:red;">此篇博客已经q移到新博客Qƈ做行文检查和优化排版Q?/span></div><div></div><a ><div><span style="color:red;">http://blog.clawz.me/2013/04/23/13-cmake-gcc-precompile/</span></div></a></fieldset><a ><div></div><p> </p></a><p><br /><br />一、预~译?/p> <p>    当工E大了,单机~译速度?x)很慢。预~译头会(x)提高很大的速度。相兛_理这里不赘述Q网上很多。(或者老夫有空的时候再补充Q?/p> <p>​</p> <p>二、cmake讄gcc的预~译?/p> <p>    一开始googleC个国内同行写的cmake宏,用了下,貌似不是很好用。另外作者也表示q是有bug?/p> <p>    后来扑ֈcotire。目前用良好?/p> <p>    </p> <p>三、cotireQcompile time reducerQ?/p> <p>    目地址<a data_ue_src="https://github.com/sakra/cotire">https://github.com/sakra/cotire</a>。具体用方式github里对应项目主已l写的很清楚了(主页man看不明白的可以去看他的src里那个例子)Q这里只做下快捷备忘?/p> <p>    步骤Q?/p> <p>1. cloneq个git?/p> <p>2. cotire里的CMake/cotire.cmake拷到׃自己工程的顶层CMakeLists.txt同目录下?/p> <p>3. 往q个层CMakeLists.txt里设|一个变量ƈincludeQ?/p> <p>    set (CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMake")</p> <p>    include(cotire)</p> <p>4. 在具体的CMakeLists.txt的add_executable后边再cotire下,如:(x)</p> <p>    ​add_executable(MyExecutable ${MyExecutableSources})<br />    ​target_link_libraries(MyExecutable ${MyExecutableLibraries})<br />    ​cotire(MyExecutable)</p> <p>5. 上边是自动寻N~译_(d)也可以自p|,例如我们从vc跨^台过来的目Q显C|stdafx.hQ只用在cotire前边讄下即可:(x)</p> <p>    ​set_target_properties(MyExecutable PROPERTIES COTIRE_CXX_PREFIX_HEADER_INIT "stdafx.h")<br />    ​​cotire(MyExecutable)</p><img src ="http://www.shnenglu.com/yangsf5/aggbug/199658.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-04-23 14:10 <a href="http://www.shnenglu.com/yangsf5/archive/2013/04/23/199658.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.hbhshj.cn" target="_blank">þˬˬˬ</a>| <a href="http://www.jrtz112.cn" target="_blank">ݺɫۺþö</a>| <a href="http://www.cfgcurn.cn" target="_blank">26uuuþ</a>| <a href="http://www.qkmp4.cn" target="_blank">þþþ޾Ʒһ</a>| <a href="http://www.egpk.cn" target="_blank">޺ݺۺϾþѿ</a>| <a href="http://www.xqt007.cn" target="_blank">һþۺ³³</a>| <a href="http://www.njw2008.cn" target="_blank">þþžžþƷ</a>| <a href="http://www.h8uq0.cn" target="_blank">һۺϾþ</a>| <a href="http://www.8xbu.cn" target="_blank">ԭۺϾþô˾Ʒ</a>| <a href="http://www.gwuq.cn" target="_blank">ھƷþþþþҰ</a>| <a href="http://www.ofuax.cn" target="_blank">þþþþAvӰԺ</a>| <a href="http://www.y447.cn" target="_blank">þѵľƷV</a>| <a href="http://www.yjpute.cn" target="_blank">ҹþƷþþþ</a>| <a href="http://www.city24.com.cn" target="_blank">˾þĻ</a>| <a href="http://www.qymlw.cn" target="_blank">99Ʒþþþþþ</a>| <a href="http://www.klikmisbah.cn" target="_blank">þҹҹݺ</a>| <a href="http://www.paysearch.cn" target="_blank">þþ</a>| <a href="http://www.mdeditor.cn" target="_blank">޾Ʒþþþþ</a>| <a href="http://www.fjart.cn" target="_blank">99ȳ˾ƷȾþ</a>| <a href="http://www.licaidazhong.com.cn" target="_blank">Ʒþþþù3d</a>| <a href="http://www.16pk8.cn" target="_blank">þþþþþþþþþþþ</a>| <a href="http://www.ldzv.cn" target="_blank">޳ɫwwwþվҹ</a>| <a href="http://www.123yo.cn" target="_blank">þþƷAvӰƬ</a>| <a href="http://www.fzmnls.cn" target="_blank">þþƷѿ޹AV</a>| <a href="http://www.clwc.net.cn" target="_blank">999þþƷ</a>| <a href="http://www.wzcl818.cn" target="_blank">þþþĻ</a>| <a href="http://www.xbvz.cn" target="_blank">þó˾Ʒ</a>| <a href="http://www.bjhswt.com.cn" target="_blank">þþ뾫Ʒպ˳</a>| <a href="http://www.thesmarterwaytofaster.cn" target="_blank">ձvaҹĻþ</a>| <a href="http://www.dnf-video.cn" target="_blank">޾þˬ˾Ʒ</a>| <a href="http://www.cbhz.com.cn" target="_blank">þۺɫHEZYO </a>| <a href="http://www.slchurch.cn" target="_blank">69þҹɫƷ69</a>| <a href="http://www.ubzr.cn" target="_blank">þùƷþþƷ</a>| <a href="http://www.njisb.cn" target="_blank">þþƷA㽶 </a>| <a href="http://www.hit5.cn" target="_blank">99ξþþŷƷվ</a>| <a href="http://www.huizhiming.cn" target="_blank">avþþƷ</a>| <a href="http://www.tthzk.cn" target="_blank">Ʒ99þþƷ</a>| <a href="http://www.hunan168.cn" target="_blank">99þù޸ۿ2024</a>| <a href="http://www.musicweb.cn" target="_blank">ҹþþþС˵</a>| <a href="http://www.damingxing.cn" target="_blank">뾫ƷþþӰ</a>| <a href="http://www.ahzyjlr.cn" target="_blank">þùһ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>