- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建一个 API,该 API 需要很长时间才能返回数据,转换发生时最多需要 60 秒。在运行时,我希望让用户了解任何错误,并通知他们我们处于转换阶段的哪个进程。
这在客户端上非常容易,因为我可以简单地发送 WebSocket 事件,但对于公共(public) API,这不太实用。
我知道我可以请求通知 URL 并向给定 URL 发送更新,但这似乎很麻烦并且可能占用大量资源。还有其他更有效的方法来发送进度通知吗?
理想情况下,使用 API 的用户能够进行设置。
.on("错误", 函数(err) {
//处理错误
});
或者类似的东西。
最佳答案
您不太清楚 API 的使用者是谁、他们使用的客户端类型或工作流程是什么样子。因此,根据您正在寻找的内容以及您拥有的可用资源,会有很多不同的答案。
非详尽列表:
REST 端点轮询
了解您不是粉丝,但这仍然是为广泛的客户提供此服务的最佳方法之一,也是(据我所知)为纯粹基于浏览器执行此操作的仅有两种方法之一客户。就性能而言,如果您适本地设置缓存策略并对客户端设置限制(无论如何您都应该这样做),那么这并不可怕。我不同意这是一个供客户使用的 PITA,但这是观点,你显然有不同的感觉。缓解 PITA 的一种方法是提供一个为消费者处理该机制的 SDK。
网络套接字
我知道您可能正在处理并非从网络开始的客户端,但如果客户端可以发出 RESTful 请求,并且客户端表示有兴趣建立 Web 套接字,则您可以将服务器设置为进行网络套接字升级相同的。我不喜欢这个选项,因为它对我来说更复杂(更多移动部件),但如果您喜欢 Web 套接字并且所有/大多数客户端都支持 Web 套接字,那么这是一个选项。或者,您可以将 REST 响应设为您为该客户端打开的 Web 套接字的 URL。
网络 Hook
如果您的客户端可能是其他计算机(尤其是服务器),那么网络 Hook 是一个非常好的方法,特别是如果您想要引发的事件可能会以不可预测的时间间隔多次发生。在此方案中,客户端向您发出 REST 请求,他们发送给您的部分数据包括一个 URL,当事件发生时您将向该 URL 发布数据(以您在 API 中指定的格式)。显然,他们要么必须将该 URL 保留给您的 POST,要么您可以就您的服务器将尊重的某种凭证达成一致。
TCP 套接字
与 Web Socket 选项类似,您可能有一个 REST 请求到达您的端点,然后使用套接字连接信息/URI 响应自定义 TCP 套接字。这有点不标准,但在正确的用例中可能非常有用且高效。我已经有一段时间没有使用它了,所以他们可能已经改变了它,但这就是 Heroku 的 API 用来处理流日志的方式。
Pub/Sub 或消息队列或类似
Redis 可以做到这一点,其他许多也可以。在这种情况下,您正在制定一种更通用的解决方案,其中可能有多个事件 channel 客户端可以订阅,等等。出于安全原因,我不喜欢直接公开 Redis,这意味着您仍然需要弄清楚如何处理 Redis 和客户端之间的通信(见上文),但在幕后使用它至少会给您带来一些概念逻辑处理发布者和订阅者等;正如我所说,如果您有多个事件,则很有用。不过,这是一个比上面更重量级的解决方案,并且会增加您的系统管理开销一定程度(取决于您的高可用性需求等)
关于javascript - "Notification URL"的替代方案来处理 Node 中长时间运行的 API 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39965144/
我有一个独立的 Thread 应用程序。这是一个等待消息的监听器,当消息到达时执行一些操作,其中我必须将消息保存在数据库中。但我遇到了问题,因为如果我运行应用程序并“手动发送消息”,一切都会正常工作,
我有以下php代码: sleep(65); $query = "UPDATE database.table SET XXXXXXX = XXXXXXX - ".$YYYYYY." WHERE
我正在开发一个业余爱好应用程序。它在主布局中使用 webview。单击 webview 内的链接会使用户保持在 webview 内。启动后一切正常,但仍在应用程序内。但是,在手机休眠一段时间后,我重新
我目前运行的应用程序需要最大堆大小为 16GB。 目前我使用以下标志来处理垃圾回收。 -XX\:+UseParNewGC, -XX\:+UseConcMarkSweepGC, -XX:CMSIniti
$ uname -a Darwin Wheelie-Cyberman 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun 7 16:33:36 PDT 2011
在 while 循环仍在休眠时退出它的最简单方法是什么?是否有某种函数可以在 sleep 时检测某个值是否为真? 或者我是否在循环中设置一个小 sleep 并检查如果不再睡一会儿就退出?如果可以,我该
我正在 Ubunu 的 Jetty 6 上运行 Java Web 服务器,用于基于反向 ajax 的 Web。而且我在向浏览器重新发送数据的线程滞后方面遇到了严重的问题。很多时候,一些线程开始 hib
当我运行长时间操作时,我遇到来自 IIS 的请求超时。我的 ASP.NET 应用程序正在后台处理数据,但处理的记录数量很大,因此操作需要很长时间。 但是,我认为 IIS 使 session 超时。这是
我不确定从哪里开始解决这个问题,但如果我有一个 AJAX 网络应用程序向服务器发送请求并在数据库(在我的例子中是 postgresql)上运行长查询,有没有办法停止或如果仍在运行时用户刷新页面或关闭
我是一名优秀的程序员,十分优秀!