最近去了深圳的“企鹅”公司,你懂的,其中有一道面试题是这样的:
用户提交表单后,需要在60秒内给出响应,比如给出“提交成功!”的提示,但是在用户提交表单的后台处理中,要经过几个不同的步骤,比如第一步将数据存储到sql server数据库,第2步再将数据存储到oracle数据库,第3步进行业务处理。。。。,这其中每一步都是相互独立的,每一步都可能出错,错了之后就不能进行下一步,这些步骤总耗时也可能超过60s,但是在前台还是要在60秒内提示用户“提交成功!”,后台还是要尽可能完成每一步骤,如果某一步错了需要重新做这一步,直到成功,同时又不能让用户等太久,因为用户可能随后查看他所提交的内容。
该怎么实现?
当有100个用户同时并发提交表单,每个用户都需要在60秒内给出响应,给出“提交成功!”的提示,后台也要做上面所述的操作,该怎么实现?
把用户请求CACHE起来(使用消息队列,如WINDOWS下的MSMQ——偶木有用过,也可以把用户请求数据先原封不动的插入到数据库中做CACHE),然后把业务流程处理交给事务处理系统(一个进程或服务)处理。
我曾经写的一个服务,用户请求注册,要求快速响应,但注册过程中有耗时操作(发送邮件和短信),于是便是把用户请求的数据进行预处理后把预处理结果插入一个数据库队列,然后快速的相应给用户。同时另外写了一个任务,时刻监控/轮询这个任务表,有任务就处理。
以前做过一个是把结果放到消息队列里去依次执行下一个操作的~~每个操作都是做的事务处理只要异常就回滚从来~但是是msmq是windows下的的企鹅的不一定是windows吧~不是windows估计要自己写队列或者别的平台也有类似的东西(这个我就不太了解了)~让后每个操作当成事务处理。反正关键点就是2个一个要保证一系列的操作的顺序执行(类似队列这种感念)二一个就是保证每个操作异常就要回滚重做~
并不一定非要给出"提交成功"的提示
而且要客户等60秒这么久很不好吧
每次提交后直接返回"提交完成"
然后并在他的查询界面显示出来
不过给显示成类似于"审核中"状态
服务器继续操作如果失败什么的在改变那个查询信息
应该就是设定队列,然后批量提交事务 出错就回滚从新来 前台的话, 应该好做些。定时器而已。