【问题标题】:How to design a Web Service that returns cached results when called that are updated from an independent recurring thread?如何设计一个 Web 服务,该服务在调用时返回从独立循环线程更新的缓存结果?
【发布时间】:2014-09-13 13:24:08
【问题描述】:

我希望重新设计一个由多个客户端应用程序使用的服务。这些应用程序以 30 到 60 秒的间隔对服务上的一种特定方法发出重复请求。此方法获取数据,然后将其缓存大约 30 到 45 秒。因为该方法是由请求驱动的,所以它会检查每个请求以查看与最后一个缓存的时间差是否 > 30 秒,如果是,则在返回结果之前刷新它。

虽然我最终想改用 pub/sub 模型,但现在我必须继续进行投票。我想做的是创建一个重复的后台进程,该进程在指定的时间间隔内刷新缓存,而与对服务的请求无关。然后随着对该方法的请求,它总是会从缓存中返回。

我不知道具体如何做到这一点?我不相信我想将后台线程的启动与初始请求联系起来,但我不确定如何启动它。我必须创建某种共享应用程序域的 Windows 服务还是有更好的方法?

【问题讨论】:

    标签: c# web-services architecture polling


    【解决方案1】:

    为什么不想使用缓存过期机制?在这种情况下,您可以确保如果缓存数据变得陈旧,返回的数据将是正确的,并且您不需要对 DB 执行额外的(可能不需要的)请求。

    【讨论】:

    • 什么触发了初始缓存?是对服务的请求吗?我记得 Cache 有一个可以使用的过期回调。我有点不确定回调是否存在与触发它的第一个请求相关联的任何问题。它本质上是永远保持第一次会议开放吗?如果该会话由于某种原因丢失会发生什么情况,此时回调是否中断?
    • 第一次缓存将由请求触发,是的。这是一个问题吗?数据库查找需要多长时间?如果它不是很长,那么为什么需要过期回调,只需从缓存中返回数据(如果存在)或进行数据库查找(当然,将新数据添加到需要过期的缓存中)。在这种情况下,您无需关心它是否是第一次请求。
    • 我们看到的现有问题之一是,如果查询的返回时间比正常时间长,它会导致请求在等待完成时基本上备份。通过仅服务来自缓存的请求并从单独的线程更新缓存,我希望消除这种情况。另一个优势是,如果将来需要,实际上可以将此处理转移到另一台机器上。
    • 您的案例有简单的实现。只需在您的服务中创建另一个端点,在访问时将获取数据并将其添加到缓存中(如果您使用 IIS,这将在不同的线程中工作)。然后创建将触发此端点的简单控制台应用程序,并将其配置为在使用 Windows 时使用任务调度程序运行。您可以使此端点只能在本地访问。您可能会考虑将此端点用于其他数据类型更通用。当然正常的请求处理程序应该检查缓存数据是否存在。
    猜你喜欢
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 2016-02-29
    相关资源
    最近更新 更多