我是新手,但我真的很喜欢长轮询的想法。
阅读后,我会像这样实现它:
- 客户端请求服务器 (AJAX)
- 服务器正在轮询数据库以进行更改
- 识别更改时或超时服务器响应后
我的问题是,对于每个请求,服务器上都会启动一个线程,并且每个线程都会轮询数据库。
在接受所有传入请求的服务器上运行一个线程不是更有效吗? 像这样:
- 客户端请求服务器 (AJAX)
- 服务器将请求添加到队列(无响应)
- 工作线程轮询数据库以获取与队列中所有请求相关的更改
- 当识别更改时,服务器返回相应请求的结果
这样做的优点是,数据库的轮询要少得多,所有请求都在一个线程中处理(更少的内存消耗)
我的问题:
这可能吗/是否有实现或框架?
(我们的项目还没有开始喷气式飞机,所以我们使用 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
并相应地响应长轮询。
我希望你能找到一个更有效的解决方案,但至少这会限制你与数据库有一个开放的连接,而不是谁知道多少。