【发布时间】:2020-09-27 13:19:12
【问题描述】:
问题
考虑一个支持以下操作的社交网站:
- 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 消息队列通知用户。
疑虑
- 对于重试失败的作业,我们可以为每个服务设置其他低优先级队列。如果我们还想在真正快速的时间内通过重试给予相同的优先级和流程怎么办?
- 处理与服务相关的作业,即
upload→tag→notify是使用消息队列来处理的。有没有更好的方法来达到同样的效果? - 我们如何才能立即停止文件上传(假设在我们发出取消请求时文件上传仍在进行中)?对于上传的文件,我们可以直接删除文件。
【问题讨论】:
标签: asynchronous cloud microservices message-queue