我想在网页上显示实时更新(基于由外部进程更改的数据库表中的状态字段)。根据我的研究,有几种方法可以做到这一点。
- 长轮询(彗星) - 这似乎实现起来很复杂
- 定期轮询 - 我可以让 AJAX 方法每 5 秒触发一次数据库命中以获取当前状态。但我担心这会有性能问题。
然后我读到了使用SqlCacheDependency
- 基本上缓存会根据表中的字段而失效。我假设我可以使用缓存失效时触发的事件向用户显示新更新?
什么是不会出现性能问题的简单解决方案?
我想在网页上显示实时更新(基于由外部进程更改的数据库表中的状态字段)。根据我的研究,有几种方法可以做到这一点。
然后我读到了使用SqlCacheDependency
- 基本上缓存会根据表中的字段而失效。我假设我可以使用缓存失效时触发的事件向用户显示新更新?
什么是不会出现性能问题的简单解决方案?
与轮询数据库不同,一种更具可扩展性和性能的方法是轮询 Web 服务器上是否存在文件,例如轻量级 js 文件。文件的内容并不重要,但为了让您了解,您可以拥有某种 JSON 对象,该对象更详细地描述了该过程的结果。
然后,作为最后一步进行处理的后台进程可以创建文件或调用 Web 层上的 Web 服务来执行此操作。
这是它的工作原理。
用户按下发布到服务器的按钮
服务器启动进程并返回一个标识符,例如 C3201620-E622-4fe2-9F3A-E02FFA613F59
Web UI 然后定期轮询 C3201620-E622-4fe2-9F3A-E02FFA613F59.js 的存在,javascript 将管理 404 错误并继续重试,直到收到 200
希望这能给你一些想法。
在 jQuery 中处理 404 的代码示例
$.ajax({
url: '/CheckForStatusChange/C3201620-E622-4fe2-9F3A-E02FFA613F59.json',
type: "GET",
success: function(result) {
},
error: function(request, status, error) {
//handle error here and setTimeOut
});
你有2个问题:
项目#1 很简单,假设您有一个相当有效的查询,并且您不是为每个用户查询它;只需查询、获取数据并推送。您可以使用 SqlDependency 选项,也可以只轮询它;这取决于您的数据量。
项目 #2 有点棘手,因为您需要不断地访问服务器,或者使用彗星服务器。我们在 Frozen Mountain 编写了一个高度可扩展的 .NET comet 服务器WebSync,它可能符合要求。本质上,您有一个单独的流程来驱动发布,而 WebSync 将处理将数据推送到您的客户端。