在一个线程中排队请求以进行长轮询

时间:2013-10-16 21:30:22

标签: php asp.net ajax long-polling

我是新手,但我非常喜欢长轮询的想法 阅读完之后我会像这样实现它:

  1. 客户端请求服务器(AJAX)
  2. 服务器正在轮询数据库以进行更改
  3. 识别出更改时或超时服务器响应后
  4. 我的问题是,对于每个请求,在服务器上启动一个线程,每个线程轮询数据库。

    在接受所有传入请求的服务器上运行单个线程会不会更有效?像这样:

    1. 客户端请求服务器(AJAX)
    2. 服务器将请求添加到队列(无响应)
    3. Worker-Thread轮询DB以查找与队列中所有请求相关的更改
    4. 当识别出更改时,服务器返回相应请求的结果
    5. 这样做的好处是,DB轮询更少,所有请求都在一个线程中处理(内存消耗更少)

      我的问题:
      这可能/是否有实施或框架?
      (我们的项目还没有启动jet,所以我们是否使用PHP或ASP.NET无关紧要)

      TIA的建议=)

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:0)

我无法帮助你开始一个新线程的每个请求 - 我不知道是否有办法让一个线程处理所有请求,或者这是否是一个实际的解决方案。

可以有一个线程负责数据库轮询 - 我强烈推荐这个,因为不需要让多个线程同时查询完全相同的数据。

使用Application对象。 IE Application["ThreadActive"] = true;

if (!Application["ThreadActive"])
ThreadPool.QueueUserWorkItem(new WaitCallback (DBWatcher), objectdata);

让DBWatcher方法在内部循环X小时,将Application["ThreadActive"]变为false,然后结束线程。在此线程运行时,让它将它检索的数据存储在Cache对象中。线程(或单线程,如果你可以管理它)将观察Cache并相应地响应长轮询。

我希望你能找到一个更有效的解决方案,但至少这会限制你与你的数据库建立一个开放的连接而不是谁知道多少。