服务器错题集
来源:互联网 发布:域名的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
不定期更新。。。