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


Queue up Requests in one thread for long polling

我是新手,但我真的很喜欢长轮询的想法。
阅读后,我会像这样实现它:

  1. 客户端请求服务器 (AJAX)
  2. 服务器正在轮询数据库以进行更改
  3. 识别更改时或超时服务器响应后

我的问题是,对于每个请求,服务器上都会启动一个线程,并且每个线程都会轮询数据库。

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

  1. 客户端请求服务器 (AJAX)
  2. 服务器将请求添加到队列(无响应)
  3. 工作线程轮询数据库以获取与队列中所有请求相关的更改
  4. 当识别更改时,服务器返回相应请求的结果

这样做的优点是,数据库的轮询要少得多,所有请求都在一个线程中处理(更少的内存消耗)

我的问题:
这可能吗/是否有实现或框架?
(我们的项目还没有开始喷气式飞机,所以我们使用 PHP 还是 ASP.NET 都没有关系)

TIA为您的建议=)

检查节点.js和非阻塞IO

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

你可以让一个线程负责数据库轮询 - 我强烈建议这样做,因为没有必要让多个线程同时查询完全相同的数据。

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

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

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

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