Asynchronous 微服务:取消异步作业

Asynchronous 微服务:取消异步作业,asynchronous,cloud,microservices,message-queue,Asynchronous,Cloud,Microservices,Message Queue,问题 考虑一个支持以下操作的社交网站: MediaUploadService:您可以上载单个文件或多个文件的媒体文件(图像和视频) 标记服务:文件上传后,文件中标识的所有人员都会自动标记 通知服务:一旦文件被标记,所有人都会得到通知 必须满足以下要求: 用户可以随时取消上传,这意味着上传也应该停止。这也意味着标记和通知服务甚至不应该为此类请求触发 所有服务都应该能够重试失败的作业 所有服务都通过消息传递基础结构进行通信 这些服务必须是可伸缩的和可用的 我的看法 我们可以有一个全局任务队列

问题

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

  • MediaUploadService:您可以上载单个文件或多个文件的媒体文件(图像和视频)
  • 标记服务:文件上传后,文件中标识的所有人员都会自动标记
  • 通知服务:一旦文件被标记,所有人都会得到通知
必须满足以下要求:

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

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

{
“请求id”:“abcd defg pqrs”,
“文件总数”:2,
“文件”:[
{
“id”:“bcde efgh qrst”,
“名称”:“cat.jpg”,
“类型”:“图像”
},
{
“id”:“cdef fghi rstu”,
“名称”:“kitty.mp4”,
“类型”:“视频”
}
]
}
请求被分解为单个文件上载请求,并被推送到上载请求消息队列:

{
“请求id”:“abcd defg pqrs”,
“文件总数”:2,
“文件”:{
“id”:“bcde efgh qrst”,
“名称”:“cat.jpg”,
“类型”:“图像”
}
}
每个请求作为后台作业进行挑选和处理,并将响应发送到上传响应聚合器,该聚合器记录上传的总文件数:

{
“请求id”:“abcd defg pqrs”,
“文件总数”:2,
“上传的文件”:1,
“文件”:[
“bcde efgh qrst”
]
}
上载所有文件后,最终响应将发送到标记请求消息队列:

{
“请求id”:“abcd defg pqrs”,
“文件总数”:2,
“文件”:[
“bcde efgh qrst”,
“cdef fghi rstu”
]
}
当标签服务完成作业时,它将请求发送到通知请求消息队列。最后,完成所有任务后,可以使用全局响应消息队列通知用户

关注点

  • 对于重试失败的作业,我们可以为每个服务使用其他低优先级队列。如果我们想给予同样的优先级和过程,并实时重试,该怎么办
  • 处理与服务相关的作业,即,
    upload
    → <代码>标签→ <代码>通知使用消息队列处理。有没有更好的方法实现同样的目标
  • 我们如何立即停止文件上传(假设在我们提出取消请求时文件上传仍在进行中)?对于上传的文件,我们可以直接删除这些文件
看看哪种方法提供了更好的建模方法。它本质上是一个工作流引擎,使用的代码没有任何中间表示。取消和补偿支持开箱即用