网站与掌上灵通的短信投票合作,在投票结束的那几天短信数量会爆涨,最后一小时进来一万一千多条短信,导致数据库反应不过来,有些票数无法统计,有什么办法优化吗?需要实时显示统计的短信票数。最后一小时之前每小时进来一千多条短信,还能处理加票。
目前的架构:
win2003server一台(放有多个网站),Sql 2005一台(放有多个网站的数据库)
两台服务器是组了局域网,前端是asp.net实现的投票网站
说明一下加票的相关问题:
活动的投票方式有四种:写博客,上传相片,网页点击,短信
网页点击加票和短信加票在投票网站完成,博客和相片是另一个网站
两个网站的关系是,域名不同,但文件都在同一服务器
两个网站的数据库在同一服务器上,所以用存储过程实现的博客和相片加票
现在是短信加票导致数据库反应缓慢,短信合作方的短信都能发过来,只是我们用的数据库加票加不过来,所以导致漏票
你这个不一定要直接放到数据库里,可以把所有的数据都放在缓存里,然后批量写回数据库就可以了,需要保证的是那一小时服务器不能死机
不过,一小时11K,对数据库来说压力还是很小的,所以问题应该不在这里,每秒20次的insert对数据来说应该是无压力的,是不是出在并发读上?如果是出在并发读上,可以在读的时候使用(nolock),避免影响写入,另外所谓实时,其实是可以靠定时更新的,比如每秒更新,然后统计数字不要每次去数数,而是数一次,然后把结果存起来,并且放到机器的缓存里。
这个数据量不大的
着重查看下数据库是否死锁,跟踪下统计语句,查看是否有sql上的错误,再检查下程序,看看在编写的时候是否有什么问题,然后再监控下CPU的变化,这样一般能定位到问题的。
异步处理啊。不要直接用数据库处理,
短信进来放队列, 然后单开一个程序,从队列里访问,再写数据库。
我找过MS的消息队列处理,投票结束时间一到就不能再加票,这个不能保证实时显示票数给客户看到
@斌哥_: 投票结束时间一到就不能再加票,这句没明白?这个不是程序可以控制的吗?
另外,你要保证显示票数,可以用缓存来做,跟队列不冲突。
流程:接受短信》1写缓存 2写队列 用户查看直接查询缓存
@寒风吹过: “投票结束时间一到就不能再加票”,意思是投票时间结束了,票数就要停止变化,如果这时队列里面还有未提交到数据库的短信,那也是有漏票的。
“流程:接受短信》1写缓存 2写队列 用户查看直接查询缓存”
这个流程适合独立投票站点,我这个案例还涉及到不同域名的博客网站写一篇博客加一票,在数据库里加的,没法同步票数
@斌哥_: 那这是总体设计的问题吧。我觉得这样设计非常不利于扩展哦。
一般来说可以把投票功能提供一个服务出来,不管是博客还是主站什么的投票都是调用这个服务。
服务里可以用分布式的缓存什么的。
艾,好像扯远了,不好意思
@寒风吹过: 呵呵,设计是有不合理的,但目前只能这样,谢谢你的回复