文件重新加载后台线程与基于请求

Posted

技术标签:

【中文标题】文件重新加载后台线程与基于请求【英文标题】:File reloading Background thread vs Request based 【发布时间】:2017-05-19 15:26:10 【问题描述】:

我正在构建一个 Web 服务,它为来自嵌入式数据库的请求提供服务,该数据库本质上是一个文件。该文件会定期被另一个进程替换。

服务必须检测此更改并更新文件引用。使该请求驱动是否更好,即每个请求检查是否有更新的版本可用或有后台线程来执行此操作?

【问题讨论】:

您的请求量是多少?您如何访问该文件?平面文件? json,xml? 5k/s;文本文件中的管道分隔键值对 您需要对每个请求执行某种 if-modified-since 并在适当的时候缓存数据。或者 servlet/控制器中的另一个线程获取更改。如果更新不是太频繁,您可能会在没有线程的情况下度过难关。但是每秒 5k 似乎需要一些强大的东西。异步响应会很好 【参考方案1】:

我不会对每个请求做任何与 IO 相关的事情。事实上,我认为服务本身不应该负责检查数据的新鲜度。它应该关心的是从源中查找数据(执行一些非 CPU 密集型的业务逻辑)并将其发出,以便在实时 Web 应用程序的 SLA 安全范围内(我假设?)。您可以考虑以下可能性:

后台线程(正如您所提到的)是保持 检查和更新文件。 一种基于事件的设计 (pub-sub),当文件更改触发触发器时,它会通知您的应用进行更新 内容。

【讨论】:

“我不会对每个请求做任何与 IO 相关的事情。”能详细点吗?【参考方案2】:

我认为它应该类似于后台进程,它将通知订阅者注册事件。您可以为此目的使用文件侦听器。以下示例是基于轮询的模型。

 WatchService watcher = FileSystems.getDefault().newWatchService();

    Path dir = Paths.get("Path/To/Watched/Directory");
       dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);

【讨论】:

以上是关于文件重新加载后台线程与基于请求的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot热部署简介

如何从后台线程 Swift UI GET 请求发布更改

AJAX

为啥我的文件加载线程没有与主线程并行?

Android中UI线程与后台线程交互设计的6种方法

后台线程中的 moya 请求