有个类似于在线抢购的一个函数,怎么设计可以保证,按正常的客户访问顺序创建购买流程,而且客户点完抢购后还有反馈信息回去。
这两天研究了ConcurrentQueue<T> 这东西,但是不知道怎么返回数据,如果就算是用双队列一个存一个取,中间处理又怎么弄,搞了好几天,思路还是很乱,请知道的朋友提供一个思路。
如果有ConcurrentQueue具体实现实现例子(比较真实的)就太好了,非常感谢!
首先需要明确一个需求,你所谓的抢购,是只要点了抢购,所有购买流程都在后台执行完毕,最终只反馈给用户是否买到,还是用户还需要手动填写一些流程信息,最终下单时再看是否还有余货?这两种需求上,设计可能稍有不同。
需求1:
沿着ConcurrentQueue来走,你要的抢购并发其实很简单,。客户点击抢购时,构造一个购买请求入队即可,在入队函数中判断一下已经入队过的数量是否达到允许数量,达到了,则后续请求概不入队,直接给用户返回个抢购失败信息。再开辟几个线程,循环从队中读取请求,执行后台购买流程,最终反馈用户抢购成功信息。
这个关键在入队函数判断已入队过数量这一节,方式很多,比如给一个int变量并加锁,或是直接等ConcurrentQueue队中达到抢购数量后封闭抢购入口,后台再从队中取数据处理。
需求2:用户点了抢购后,先跳入购买信息填写页面,填写完成点提交时,再进入需求1类型的过程。同时当购买数达到后,直接封闭抢购入口,屏蔽用户填写购买信息的页面。
至于返回数据,应该是很简单的事情吧....AJAX?WEBSOCKET?
需求1,和其他的朋友交流一下,大致方式也是这样,研究的方向也在这,不过可能是我比较笨吧,有些具体的地方还是不知道怎么写,例如,方法进来了,将请求加入队列,判断是否达到允许数量(判断我会研究下), 后台开了几个线程不停的扫描队列(死循环的方式,感觉可能不合适),把接到的队列消息进行流程处理,返回结果,这时这个结果通过什么方式返回去??执行一个线程带返回值的方法??还是怎么样?如果方便给写几行伪码做下参考吧,谢谢!
@醉低调: 线程扫描队列用死循环本身是没太大问题的,不过你要把线程属性设置为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: 现在的解决方案是 用ConcurrentQueue做发送队列,后台有个线程看着队列如果队列中有数据就启动,处理队列中数据然后放到,一个线程安全的字典里,返回值处理方式是一个循环不停的扫字典将对应结果返回,在效率上不是很高,不过起码达到了最初的目的,websocket方式我觉得是比较理想的,但不是很特别熟悉,有时间一定要研究一下,非常感谢兄弟提供的意见和想法,祝工作顺利。
使用 lock(object) 也可以吧?
这个不行啊。