队列请求到MVC控制器

时间:2012-09-05 20:55:47

标签: multithreading asp.net-mvc-3 jquery

我有一个有趣的问题,我需要解决,我不知道哪里开始。我正在编写一个MVC Web应用程序,它通过一个表单获取记录列表,并为每个应用程序进行ajax调用。 ajax调用命中的控制器使用的资源一次只能处理一个请求。简单的解决方案是将ajax调用更改为同步,然而,它会挂起浏览器并提供糟糕的体验。

此外,多个用户可能会同时使用此应用,因此无法在客户端进行排队。

有人有任何建议吗?

麦克

1 个答案:

答案 0 :(得分:0)

首先,我的要求与你的要求并不完全相同。我的问题是我的后端数据库往往有点慢,用户响应非常重要。

因此,我不得不从等式中删除数据库交互。

我的解决方案有两个主要部分:

  1. 维护数据的服务器端缓存

  2. 创建一个单独的进程以包含可与服务器交互的所有数据库工作

  3. 单独的进程是作为由Windows服务托管的命名管道WCF服务实现的。

    基本流程概述是:

    1. 用户点击“保存”,Ajax将表单发布到Mvc控制器
    2. 控制器更新缓存数据,然后调用WCF管道
    3. 服务将数据推送到并发队列(连同会话ID),并返回一个guid令牌
    4. 控制器将令牌作为JSON响应返回。
    5. jQuery Ajax处理程序拦截响应并将令牌保存到表示“已保存”表单的UI元素中。
    6. 服务本身就是这样的:

      1. 开始时创建一个计时器。
      2. On Timer tick:
      3. 停止计时器。
      4. 从并发队列中删除所有排队的工作项
      5. 发送要由工作处理器处理的每个项目
      6. 将项目添加到“已完成”或“有错误”并发词典,由早期会话ID键入(以及一些时间保留内容以消除陈旧数据)。这包括原始工作令牌。
      7. 再次启动计时器。
      8. 回到用户区,有一个javascript setInterval循环运行:

        1. 对服务器的Ajax请求(Heartbeat控制器)
        2. 控制器连接到服务,并传递当前会话ID
        3. 该服务返回“已完成”和“错误”词典中的所有项目
        4. 控制器将列表作为JSON对象数组返回
        5. javascript遍历返回的列表并使用令牌进行适当的UI更新
        6. 尽管后端持久性服务器速度很慢,但最终结果却是响应迅速的用户界面。

          如果您想要任何特定部分的实施代码,请告诉我。