假设我已经在后端处理了幂等键和查找/存储,现在是时候在前端处理了。
我有一个使用 reactjs 的前端应用程序,我确实为每个请求生成一个幂等密钥
uuid()
.
每次用户单击按钮创建订单时,我都会生成密钥。但是我有一些情况,我认为这不是生成密钥的正确位置,或者可能使用一些其他机制可以在用户刷新网页时重新使用相同的密钥。如果刷新网页,则会创建一个新的幂等密钥。
那么让我们想象这样一个场景,订单已经创建但由于某种原因请求超时,用户决定刷新网站并重试。我应该重试相同的请求但使用相同的幂等密钥对吗?
所以我想到了一些可能的解决方案来解决这个问题:
isProcessed
和日期时间将请求的幂等密钥保存在本地存储中,并检查请求是否已处理,否则重新生成密钥。但是,如果同时清除本地存储和缓存怎么办?有什么想法吗?
使用幂等键是正确的。但是:
我在工作中常用的解决前后端状态不同步问题的方案是列表版本控制。
每当用户或其他任何人更改用户订单列表(状态、内容等)时,服务器都会更新版本。它可以是订单列表的编号或哈希,存储在数据库中。在使用 POST 查询的前端,您提供一个前端已知的版本(我正在使用 If-Match header)。后端检查来自前端的版本是否等于其实际版本。如果不是,则返回,例如 409 响应代码,您必须处理这种情况。您可以查询用户订单列表并检查当前订单是否已经下单,如果是,则返回 OK 给用户,无需 POST 新订单查询。
因此,使用后端作为单一事实来源将使您摆脱由于状态去同步而产生的许多问题。