当前位置: 首页 > 面试题库 >

如何在ASP.NET中实施实时更新

酆翔宇
2023-03-14
问题内容

我看过几个网站,这些网站向您显示数据库中正在发生的事情的实时更新。一个例子可能是

  • 股票行情实时显示股票价格的网站
  • 显示诸如“其他用户当前正在搜索的内容”之类的数据。

我认为这将涉及某种轮询机制,该机制每隔几秒钟会查询一次数据库并将其呈现在网页上。但是,从性能角度考虑时,这种想法使我感到恐惧。

在我正在处理的应用程序中,我需要显示用户提交的操作的实时状态。用户等待该过程完成。当操作完成时,状态将由另一个进程(可能是Windows服务)更新。我应该每秒查询数据库以获得更新的状态吗?


问题答案:

不一定在数据库中完成。正如您所建议的那样,这很昂贵。尽管db可能是后备存储,但除了最终存储在db之外,还可能使用一种更有效的机制来配合轮询操作,例如将实时状态存储在内存中。
每秒 从Table进行SELECT状态 相比,您可以更有效地轮询内存。

就像我在评论中提到的那样,在某些情况下,通过动画来伪造状态更新的外观可以使您受益匪浅,例如采用估算,较少地检查数据源。

编辑

(一种优化方案,可实时使用较少的数据库资源)

与其稍微每隔X秒轮询一次数据库来检查作业状态,不如稍微改变这种情况的行为。每次将作业添加到数据库时,都要读取数据库一次,以将有关 所有
作业的元数据放入缓存中。因此,例如,内存缓存将反映[user49 … user3,user2,user1,userCurrent]
50个用户的作业(如果每个作业1个)。(也许我应该将其写为[job49 … job2,job1,job_current],但思路相同)

然后,各个用户的网页将轮询始终保持最新状态的缓存。在此示例中,数据库仅被读取到高速缓存50次(每次提交作业一次)。如果这50个用户平均等待1分钟进行作业处理并每秒轮询一次状态,则用户群将轮询缓存总共50个用户x
60秒= 3000次。

在50分钟的时间内,读取的是50个数据库,而不是3000个。
(平均每分钟1个。)缓存始终是最新的,但仍可以处理负载。与考虑为每个用户每秒访问数据库相比,它要可怕得多。您可以在缓存中存储其他统计信息和信息,以帮助进行估算等。只要新的高速缓存提供更高的效率,它就可以替代大量的数据库命中。

注意:缓存是指像应用程序或第三方解决方案这样的全局存储,而不是ASP.NET页面缓存,它很快就会超出范围。使用ASP.NET的机制进行缓存可能不适合您的情况。

另一个注意事项:无论从何处,数据库都会知道何时添加了另一个作业记录,因此触发器可以初始化缓存更新。

尽管有一个好的数据库解决方案,但如此多的频繁轮询的用户可能会导致Web服务器连接出现问题,并且您可能需要根据流量在该级别使用其他解决方案。



 类似资料:
  • 在Perl中,使用Moo,可以围绕sub实现sub,它将围绕类中的其他方法。 如何在Raku中实现这种行为,最好使用角色?

  • 我正在尝试在我的Web应用程序(Flutter)中实现Stripe Payments,但我在https://pub.dev/中找不到任何软件包来满足我的愿望。对于我的iOS和Android应用程序,我https://pub.dev/packages/stripe_payment使用,但我在Flutter中看到了一些带有JS的Stripe Checkout教程。我的问题是,除了如何在Flutter

  • 我正在尝试实现身份验证 可以请求任何微服务的API网关。 用户微服务-我存储所有用户的地方。实现在此微服务中对用户进行身份验证。按应有的方式工作,登录路由返回我用于在此微服务中对用户进行身份验证的令牌。 其他5个微服务,未经任何身份验证或授权。 问题是:使用身份验证的正确方法是什么

  • 问题内容: 在简要回顾了Go语言规范,有效的Go和Go内存模型之后,我仍然不清楚Go通道是如何工作的。 它们是什么样的结构?它们的行为有点像线程安全队列/数组。 它们的实现取决于体系结构吗? 问题答案: 通道的源文件位于/src/pkg/runtime/chan.go中(从您的源代码根目录开始)。 是通道的中央数据结构,带有发送和接收链接列表(持有指向其goroutine和data元素的指针)和一

  • 问题内容: 在Java中,您可以执行以下操作: 在Kotlin中可以做同样的事情吗?假设是抽象的并且没有实现 问题答案: 接口实现和类继承之间在语法上没有区别。只需列出冒号后用逗号分隔的所有类型,如下所示: 禁止多个类继承,而单个类可以实现多个接口。

  • 问题内容: 如何在ASP.Net MVC中实现Comet体系结构? 问题答案: 基于这一事实,您可以在MVC应用程序中使用处理程序: 网络同步 会做的工作:)