首页 新闻 会员 周边

求解答短信在线投票并发导致数据库反应慢,票数漏计的解决方案

0
悬赏园豆:50 [已解决问题] 解决于 2012-02-23 11:52

网站与掌上灵通的短信投票合作,在投票结束的那几天短信数量会爆涨,最后一小时进来一万一千多条短信,导致数据库反应不过来,有些票数无法统计,有什么办法优化吗?需要实时显示统计的短信票数。最后一小时之前每小时进来一千多条短信,还能处理加票。
目前的架构:
win2003server一台(放有多个网站),Sql 2005一台(放有多个网站的数据库)
两台服务器是组了局域网,前端是asp.net实现的投票网站

问题补充:

说明一下加票的相关问题:

活动的投票方式有四种:写博客,上传相片,网页点击,短信

网页点击加票和短信加票在投票网站完成,博客和相片是另一个网站

两个网站的关系是,域名不同,但文件都在同一服务器

两个网站的数据库在同一服务器上,所以用存储过程实现的博客和相片加票

现在是短信加票导致数据库反应缓慢,短信合作方的短信都能发过来,只是我们用的数据库加票加不过来,所以导致漏票

斌哥tobin的主页 斌哥tobin | 初学一级 | 园豆:155
提问于:2012-02-22 02:43
< >
分享
最佳答案
0

你这个不一定要直接放到数据库里,可以把所有的数据都放在缓存里,然后批量写回数据库就可以了,需要保证的是那一小时服务器不能死机

不过,一小时11K,对数据库来说压力还是很小的,所以问题应该不在这里,每秒20次的insert对数据来说应该是无压力的,是不是出在并发读上?如果是出在并发读上,可以在读的时候使用(nolock),避免影响写入,另外所谓实时,其实是可以靠定时更新的,比如每秒更新,然后统计数字不要每次去数数,而是数一次,然后把结果存起来,并且放到机器的缓存里。

收获园豆:35
丁学 | 专家六级 |园豆:18730 | 2012-02-22 07:47
其他回答(3)
0

这个数据量不大的

artwl | 园豆:16736 (专家六级) | 2012-02-22 09:07
0

着重查看下数据库是否死锁,跟踪下统计语句,查看是否有sql上的错误,再检查下程序,看看在编写的时候是否有什么问题,然后再监控下CPU的变化,这样一般能定位到问题的。

收获园豆:5
az235 | 园豆:8483 (大侠五级) | 2012-02-22 09:35
0

异步处理啊。不要直接用数据库处理,

短信进来放队列, 然后单开一个程序,从队列里访问,再写数据库。

收获园豆:10
寒风吹过 | 园豆:149 (初学一级) | 2012-02-22 11:46

我找过MS的消息队列处理,投票结束时间一到就不能再加票,这个不能保证实时显示票数给客户看到

支持(0) 反对(0) 斌哥tobin | 园豆:155 (初学一级) | 2012-02-22 11:59

@斌哥_: 投票结束时间一到就不能再加票,这句没明白?这个不是程序可以控制的吗?

另外,你要保证显示票数,可以用缓存来做,跟队列不冲突。

流程:接受短信》1写缓存 2写队列   用户查看直接查询缓存

支持(0) 反对(0) 寒风吹过 | 园豆:149 (初学一级) | 2012-02-22 12:43

@寒风吹过: “投票结束时间一到就不能再加票”,意思是投票时间结束了,票数就要停止变化,如果这时队列里面还有未提交到数据库的短信,那也是有漏票的。

“流程:接受短信》1写缓存 2写队列 用户查看直接查询缓存”

这个流程适合独立投票站点,我这个案例还涉及到不同域名的博客网站写一篇博客加一票,在数据库里加的,没法同步票数

支持(0) 反对(0) 斌哥tobin | 园豆:155 (初学一级) | 2012-02-22 15:35

@斌哥_: 那这是总体设计的问题吧。我觉得这样设计非常不利于扩展哦。

一般来说可以把投票功能提供一个服务出来,不管是博客还是主站什么的投票都是调用这个服务。

服务里可以用分布式的缓存什么的。

艾,好像扯远了,不好意思

支持(0) 反对(0) 寒风吹过 | 园豆:149 (初学一级) | 2012-02-22 19:33

@寒风吹过: 呵呵,设计是有不合理的,但目前只能这样,谢谢你的回复

支持(0) 反对(0) 斌哥tobin | 园豆:155 (初学一级) | 2012-02-23 11:51
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册