首页新闻找找看学习计划

求个高并发访问函数的处理思路

0
悬赏园豆:10 [已解决问题] 解决于 2014-04-08 18:09

有个类似于在线抢购的一个函数,怎么设计可以保证,按正常的客户访问顺序创建购买流程,而且客户点完抢购后还有反馈信息回去。

这两天研究了ConcurrentQueue<T> 这东西,但是不知道怎么返回数据,如果就算是用双队列一个存一个取,中间处理又怎么弄,搞了好几天,思路还是很乱,请知道的朋友提供一个思路。

如果有ConcurrentQueue具体实现实现例子(比较真实的)就太好了,非常感谢!

醉低调的主页 醉低调 | 初学一级 | 园豆:128
提问于:2014-04-04 14:00
< >
分享
最佳答案
0

首先需要明确一个需求,你所谓的抢购,是只要点了抢购,所有购买流程都在后台执行完毕,最终只反馈给用户是否买到,还是用户还需要手动填写一些流程信息,最终下单时再看是否还有余货?这两种需求上,设计可能稍有不同。

需求1:

    沿着ConcurrentQueue来走,你要的抢购并发其实很简单,。客户点击抢购时,构造一个购买请求入队即可,在入队函数中判断一下已经入队过的数量是否达到允许数量,达到了,则后续请求概不入队,直接给用户返回个抢购失败信息。再开辟几个线程,循环从队中读取请求,执行后台购买流程,最终反馈用户抢购成功信息。

    这个关键在入队函数判断已入队过数量这一节,方式很多,比如给一个int变量并加锁,或是直接等ConcurrentQueue队中达到抢购数量后封闭抢购入口,后台再从队中取数据处理。

需求2:用户点了抢购后,先跳入购买信息填写页面,填写完成点提交时,再进入需求1类型的过程。同时当购买数达到后,直接封闭抢购入口,屏蔽用户填写购买信息的页面。

收获园豆:10
hailants | 小虾三级 |园豆:750 | 2014-04-04 16:01

至于返回数据,应该是很简单的事情吧....AJAX?WEBSOCKET?

hailants | 园豆:750 (小虾三级) | 2014-04-04 16:03

需求1,和其他的朋友交流一下,大致方式也是这样,研究的方向也在这,不过可能是我比较笨吧,有些具体的地方还是不知道怎么写,例如,方法进来了,将请求加入队列,判断是否达到允许数量(判断我会研究下), 后台开了几个线程不停的扫描队列(死循环的方式,感觉可能不合适),把接到的队列消息进行流程处理,返回结果,这时这个结果通过什么方式返回去??执行一个线程带返回值的方法??还是怎么样?如果方便给写几行伪码做下参考吧,谢谢!

醉低调 | 园豆:128 (初学一级) | 2014-04-04 17:53

@醉低调: 线程扫描队列用死循环本身是没太大问题的,不过你要把线程属性设置为background,这样主程关闭时线程会跟随关闭,前提是不怕关闭时数据丢失,否则就需要加入一些状态判断,手动结束线程。

至于返回结果的问题,需要看你是C/S还是B/S,程序整体结构是什么样子的。

给出几种模式:

B/S:

1)web提交表单后服务端阻塞,判断标志对象,处理线程处理完成后置位标志对象,并写入处理结果,服务端再返回WEB信息,就是AJAX。

2)HTML5的话可以用websocket,服务端不需要阻塞,传递中带上websocket对象,处理线程直接通过websocket通知web处理信息,可以是JSON格式串。

 

C/S:

1)开上个SOCKET,client传表单信息,服务端处理后回复表单信息,和B/S用websocket是类似的。

2)webService异步、回调等方法,应该很多,都是C#的话还可以用更方便的WCF

hailants | 园豆:750 (小虾三级) | 2014-04-07 18:48

@hailants: 现在的解决方案是 用ConcurrentQueue做发送队列,后台有个线程看着队列如果队列中有数据就启动,处理队列中数据然后放到,一个线程安全的字典里,返回值处理方式是一个循环不停的扫字典将对应结果返回,在效率上不是很高,不过起码达到了最初的目的,websocket方式我觉得是比较理想的,但不是很特别熟悉,有时间一定要研究一下,非常感谢兄弟提供的意见和想法,祝工作顺利。

醉低调 | 园豆:128 (初学一级) | 2014-04-08 18:09
其他回答(1)
0

使用 lock(object) 也可以吧?

IP党 | 园豆:114 (初学一级) | 2014-04-04 15:36

这个不行啊。

支持(0) 反对(0) 醉低调 | 园豆:128 (初学一级) | 2014-04-04 17:42
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册