微服务:取消异步作业

时间:2020-09-27 13:19:12

标签: asynchronous cloud microservices message-queue

问题

考虑一个支持以下操作的社交网站:

  • MediaUploadService :您可以上载单个文件或多个文件的媒体文件(图像和视频)。
  • TaggingService :文件上传后,文件中标识的所有人员都会被自动标记。
  • NotificationService :标记文件后,所有人员都将收到通知。

必须满足以下要求:

  • 用户可以随时取消上传,这意味着上传也应停止。这也意味着标记和通知服务甚至不应针对此类请求触发。
  • 所有服务都应该能够重试失败的作业。
  • 所有服务都通过消息传递基础结构进行通信。
  • 服务必须是可扩展的并且可用。

我的拍摄

我们可以有一个全局任务队列,上载服务可以侦听新作业。该请求可以表示为:

{
   "request_id":"abcd-defg-pqrs",
   "total_files": 2,
   "files":[
      {
         "id":"bcde-efgh-qrst",
         "name":"cat.jpg",
         "type":"image"
      },
      {
         "id":"cdef-fghi-rstu",
         "name":"kitty.mp4",
         "type":"video"
      }
   ]
}

该请求分为单个文件上传请求,并被推送到 upload-request 消息队列:

{
   "request_id":"abcd-defg-pqrs",
   "total_files": 2,
   "file":{
      "id":"bcde-efgh-qrst",
      "name":"cat.jpg",
      "type":"image"
   }
}

每个请求均被挑选并作为后台作业处理,然后将响应发送到 upload-response 聚合器,该聚合器将保留上传的文件总数:

{
   "request_id":"abcd-defg-pqrs",
   "total_files": 2,
   "uploaded_files": 1,
   "file":[
      "bcde-efgh-qrst"
   ]
}

所有文件上传完毕后,最终响应将发送到 tagging-request 消息队列:

{
   "request_id":"abcd-defg-pqrs",
   "total_files": 2,
   "files":[
      "bcde-efgh-qrst",
      "cdef-fghi-rstu"
   ]
}

完成作业的标记服务后,它将请求发送到 notification-request 消息队列。最后,一旦我们完成所有任务,就可以使用 global-response 消息队列将其通知给用户。

关注点

  • 对于重试失败的作业,我们可以为每个服务设置其他低优先级队列。如果我们也想在实时范围内给予相同的优先级和重试流程,该怎么办?
  • 处理尊重服务相关性的作业,即uploadtagnotify的工作是使用消息传递队列。有没有更好的方法可以达到相同的目的?
  • 我们如何立即停止文件上传(假设在我们提出取消请求时文件上传仍在进行中)?对于上传的文件,我们只需继续删除文件即可。

1 个答案:

答案 0 :(得分:0)

看看temporal.io,它提供了一种更好的建模此类用例的方法。它本质上是一个工作流引擎,它使用没有任何中间表示的代码。开箱即用,支持取消和赔偿。

相关问题