怎么设计异步的Rest api?
发布于 5 年前 作者 zhengboah 4436 次浏览 来自 问答

在我们开发rest api时,有些接口处理时间比较长,可能直接先返回,然后生成一个任务,放在后台执行。

面对这样的需求,请问一般是通过什么方式进行处理,比如生产者消费者模式?

10 回复

老规矩,返回一个id / taskID 之类, 回头再轮训或者push , 都行

@captainblue2013 假如把任务放在mysql中,我想通过一个nodejs进程去进行执行具体的任务,这个程序怎么写比较好?

@zhengboah 一个 API 插入表数据,一个 API 查询任务执行状态。 Node 循环这个表执行,遇到未执行的任务,修改数据为执行中,执行结束修改数据为执行结束。

前端轮询查询任务执行状态

消息队列,比如kafka。

用户发请求到服务器,服务器在数据库里记录任务t正在处理中,服务器将向消息队列A发送任务t,消费者服务不断从消息队列A中取任务,取到任务t的时候就处理它,处理完后把结果发送到消息队列B,消息队列B把执行结果记录到数据库中,客户端发起查询任务t的执行结果的请求,服务器返回t的执行结果。

@zhengboah 另一个服务啊,你不会只能写api吧

用redis streams, 很方便

来自酷炫的 CNodeMD

@captainblue2013 我知道用node服务,但是只能写个定时任务或循环去去队列里的任务,然后执行,有没有什么方法能够做到队列有任务时,能驻点去调用任务执行服务?

MQ 队列,确切的说是用rabbitMQ。。。。。kafka 不适合做业务消息,因为没有ack机制保证消息100%触达。 需要一个写队列的处理,一个收队列的消息的处理

@zhengboah 实践中,我觉得这个方式更方便管理和扩展,非要触发的话,就采取发布订阅。

回到顶部