多服务下如何监听第三方平台的任务状态

背景

我们需要调用其他平台的接口,启动一个任务,这个接口是异步执行的,有状态的概念。启动任务之后需要去监听这个任务的状态,在成功完成任务时停止监听,任务失败时需要去更新数据库,同时也停止监听

监听的方案有两种webhook和轮询,团队确定了使用轮询的方式去监听。

举例

假设我们要做一个视频合成的业务。
用户在页面上输入了一些参数然后点击合成,我们拿到参数后调用阿里云的接口做视频合成,在数据库视频合成任务表里面创建一条数据(状态合成中),然后在启动一个异步任务轮询调用阿里云查询视频合成结果的接口。我们需要在合成完成或失败后拿到这次构建的结果去更新数据库里面的状态

问题

正常情况下轮询监听不会有问题,收到一个请求后调openapi启动任务,然后轮询调用查看状态的openapi。但是如果服务宕机了或者需要更新服务,重启服务。一旦涉及重启,就需要从数据库中拿到所有的正在执行的任务,然后恢复监听。一个服务没问题,但是如果是多个服务,1号服务器从数据库拿到 1,2,3,4需要重新监听,2号服务器也是如此。这样就存在多个服务监听了同一个任务的情况。如何让每个服务监听一部分任务,且不重复监听,不丢失监听呢。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 9

监听是监听什么?每次重启服务的id变了?这种不是该一个etcd的中间服务保存状态吗?查询就查etcd的状态值就行了

8个月前 评论
don178 (楼主) 8个月前

1:如果有redis就把任务放到redis队列中 ,多个服务器从redis队列中取任务 ,一个任务一个任务取出来,谁取到任务就去监听。模型就是一个生产者,多个消费着。 2:如果没有redis ,数据库就多加个监听状态字段吧 ,先把监听状态 改成“已监听”,另一个服务就过滤掉已监听的任务。

8个月前 评论
don178 (楼主) 8个月前
ipka 8个月前
don178 (楼主) 8个月前
ipka 8个月前

和楼主遇到过相似的业务场景,分析下来,如何分发任务好解决,主要难点是不知道监听某个任务的服务是在正常执行还是已经挂掉了。

从这个思路出发,有这么几个方案,一是服务加平滑重启逻辑,在退出前把自己在监听的任务重置,使得任务可以重新被其他服务处理。

二是用额外的调度服务来负责任务的分发和追踪,通过心跳之类的机制,如果感知到监听服务挂了,那就把分发给这个服务的未完成任务重新分发。

我们最后用的是第二个方案。如果楼主找到更好的方案,希望分享交流下。

8个月前 评论
don178 (楼主) 8个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!