服务器错题集

来源:互联网 发布:域名的a记录 编辑:程序博客网 时间:2024/05/24 06:37

========数值溢出问题========

对于客户端上传的敏感参数,比如金钱,经验等,服务器通常会验证正负值,防止扣负值的情况发生。

在此基础上,要注意另外两种高级的溢出情况:

案例1:  玩家有n点属性可分配点,可以随机分配给各个基础属性。客户端上传每种基础属性分配情况,服务器判断每个分配点为非负数,判断总分配点总和小于等于可分配点数

                问题数值 :分配属性1的值 = 二十亿,分配属性2的值 = 二十亿。

服务器判断:二十亿>=0 ; 两个二十亿相加,得到一个溢出的负数,负数<= 可分配点数10 ; 判断条件都成立

结果:属性被刷爆

案例2:  玩家购买物品,带物品个数参数

物品个数没有限制时,产生乘数溢出

服务器计算消耗金币 = 物品单价 * 物品个数  结果溢出

应对方案:

方案1:  多加判断,对于和值和乘积,都判断正负

方案2:  c#使用关键字checked,溢出时抛出OverflowException异常


========腾讯TSpider问题========

项目与腾讯合作,采用腾讯的TSpider分布式MySQL集群

项目原来使用MySQL,启动服务器时,导入数据逻辑为:

每次读取一万条数据到内存:select * from tablename where id > @startid limit 10000

取到最后一个id赋值给@startid,继续读取下面的数据。

出错原因:

MySQL是顺序读取,不会产生问题

Spider由于是分布式系统,几个子节点并行且无序上传读取的数据,满足10000条时停止。此时取出的数据不保证连续,导致有部分数据加载失败(希望取出1 2 3 4,实际取出 1 3 4 6,下一轮从>6取数据,丢失 2 5)

应对方案:修改查询语句 select * from tablename where id > @startid order by id asc limit 10000


不定期更新。。。



0 0