【问题标题】:Proper way to handle race condition for 3 microservices. (Promise.all ?)处理 3 个微服务的竞争条件的正确方法。 (Promise.all ?)
【发布时间】:2020-02-10 18:08:22
【问题描述】:

我有多确定 promise.all 会一一运行 promise 请求?

场景我有 3 个服务。 frontenduploaderapi frontend 是客户端,uploader 处理 google 存储相关的操作,api 处理正常的 REST 内容。

在我的数据库中,我有类似的东西:

{
  id: 1,
  directory: 'googlestorage/dir/randomstring.jpg',
  user_id: 100
}

现在在我的前端,我有一个触发更新目录并删除旧目录的函数,因此最终结果应该是。

{
  id: 1,
  directory: 'googlestorage/new_directory/anotherRandomString.jpg',
  user_id: 100
}

在我的frontend 中,我需要确保先调用api 来更新数据库中的记录,然后再调用fileuploader 删除它。

但是在我的fileuploader 上,我通过directory 来检查并验证是否允许用户删除文件。

但是如果我先更新数据库,那么我将无法检查记录是否仍在用户的记录中,因为数据已经更新并且与旧的不匹配。

我也不想先删除文件,因为如果更新数据库的请求失败怎么办?

我试过了:

await Promise.all([requestUpdateToApi, requestToDeleteFileUploader]);

但都是一样的,一个先更新,一个先删除。

我想这样做,所以如果一个请求失败,另一个请求也不应该继续 - 有没有一个很好的解决方案,而不涉及数据库结构?

【问题讨论】:

  • doFirstRequest().then(result => doSecondRequest())?
  • 也这样做了,但是如果我先执行 firstRequest,那么它将更新数据库中的记录,我将无法再在第二次请求时查询该记录

标签: javascript node.js promise microservices race-condition


【解决方案1】:

其实我可以只编辑目录,这样每个文件都存储在randomDirectoryName/{userId}/{filename}中。

所以如果我删除文件,我只需使用iduser_id 来验证数据,然后删除/{userId}/{directoryFromRequest} 下的路径,而不用担心竞争条件。

【讨论】:

    猜你喜欢
    • 2021-07-30
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    相关资源
    最近更新 更多