REST:处理网站维护

Posted

技术标签:

【中文标题】REST:处理网站维护【英文标题】:REST : Handle website maintenance 【发布时间】:2017-04-26 12:49:06 【问题描述】:

我有一个作为 Spring Boot 应用程序托管的 UI(角度), UI 与 REST API (Jersey) 对话。 当整个应用程序或部分应用程序处于维护状态时:

1) 我不确定,如何向现在访问的任何人显示维护网页(应该是 angular 还是 spring boot,以及球衣后端分开,以及如何?)。

2) 对于已经在网站某些部分的用户,我如何通知他们需要刷新。

3) 对于已经在网站某些部分的用户,如果他们不刷新,并且稍后在维护结束时,如果他们发送带有一些旧的无效数据的 POST 请求,我该如何检查?

注意:该网站没有任何用户身份验证。

以第三点为例: UI 显示数据库中的记录列表,用户当前正在对其中一条记录进行更改,同时后端进行维护。现在,当后端再次可用时,此用户提交更改的数据。但是现在这个数据是无效的。我如何识别它,并可能通知用户。

【问题讨论】:

【参考方案1】:

我猜你所说的维护是指你的 API 使用的一些数据库要么是更新的,要么是备份的或类似的。在这种情况下,如果 API 无法处理该命令,我会让它返回一个 503 Service Unavailable 响应代码,并让前端向用户显示一些格式良好的信息。

为了确定客户端是否发送旧数据,您可以使用ETagLast-Modified 标头。 ETag 基本上是当前资源状态的散列。如果状态发生变化,ETag 哈希也会发生变化。尝试更新资源状态的客户端将先前获取的 ETag 哈希与资源的新状态一起发送到 API,然后 API 可以检查其他客户端是否对资源应用了中间更改并因此返回对客户端的错误是它不会对最新版本起作用。条件请求在RFC 7232 中定义。

关于您的第二个问题,我不完全确定您要完成什么。我会说关于使用 AJAX 的失落的演讲。他们究竟要刷新什么?维护期间是否有一些资源数据发生变化?如果不是,他们为什么还要关心刷新?如果应该重置表单输入数据,API 可能会以205 Reset Content 响应代码进行响应,但这表明 API 已完成请求并通知客户端重置输入数据。如果 API 由于维护而无法处理请求,我还会返回 503 Service Unavailable 错误,并让前端通过 AJAX 向相应的客户端发出信息,如果这是您想要的。

【讨论】:

感谢您提供相当详细的解释。是的,通过更新我的意思是数据库我正在改变并且可能会添加新记录。关于第二个问题,如果某些记录被添加到数据库中(或删除),如果当前用户正在他的屏幕上处理这些记录,那么现在它是无效的,如果他在进行更改后将更改的记录提交回API ,那么我需要确定它来自旧页面并可能忽略它。 在这种情况下,我会生成当前状态的哈希,将其作为 ETag 标头与响应一起发送,并且如果在维护期间某些记录的状态发生了变化(通过您应用的任何逻辑)由于未满足先决条件(当前的 ETag 值与用户尝试更新的值不同),因此处理现在无效数据的客户端尝试更新记录应该失败。如果在维护期间没有改变状态并且用户更新了“旧”状态,则更新将成功,因为旧数据等于更新前的状态,因此不会发生冲突。【参考方案2】:

1) 由于 API 对前端一无所知,我们不应该将逻辑放在那里。此外,如果不通过 API 进行通信,Angular 就无法了解后端的任何信息。如果您停止 API 或 Spring Boot 进行维护,会发生什么? Angular 不会知道,除非你让它处理当这些服务不可用时它收到的响应。

2) 在 Angular 中,您可以对 REST API 的超时进行某种 ping 操作。然后在索引中有一个函数来检查您的 API 的响应状态。如果维护,请重定向到维护页面。这会给你一种听起来像你想要的实时连接的感觉,尽管它会增加网络开销并更难地影响你的 API。否则,如果您可以等到用户执行触及您 API 的操作,您就可以处理服务关闭时返回的任何 http 错误代码。

3) 你怎么知道它是旧的?这是安全问题吗?如果无法从正常传输的数据中分辨出来,您可以添加某种时间戳,但这很容易规避。如果您想这样做,有很多关于时间戳的主题。

【讨论】:

如果Angular app + Spring boot在维护,谁负责展示维护页面,应该是frontend中的新路由,还是spring boot app中的filter,将所有请求路由到 503 ? IMO 这取决于哪些服务受到影响。如果存在只有 Angular 无法访问的实例,则 Spring 端应该处理它。如果只有 API / spring 端无法访问,Angular 应该处理它。我无法想象 Angular 会因为它被编译为 html 和 js 而进行维护的情况,您只需在 5 秒的停机时间内将新文件放置到位。如果只有数据库需要维护,你可以把它放在 Spring 中,这将是最优雅的解决方案。

以上是关于REST:处理网站维护的主要内容,如果未能解决你的问题,请参考以下文章

授权代码流,将代码从移动应用程序发送到 REST API

使用 Facebook 进行身份验证的网站的 REST API

保护 javascript 前端/REST 后端架构网站的最佳方式?

使用 Oracle APEX 对自签名、未经认证的网站进行 REST 调用

具有 REST 身份验证 API 的节点快递网站 - CORS 问题

CloudFront 不能使用 S3 网站来源,只能使用 REST 来源 Cloudformation