目前,我正在尝试使用 RESTful API 构建一个 Web 服务,以处理一些长时间运行的任务(作业)。
这个想法是用户通过执行 POST 提交作业,该 POST 返回一些用于检查作业状态的 URL,其中还包含结果的 url。一旦作业完成(即某些值被写入数据库),结果 URL 将返回适当的信息(而不是没有结果)并且作业 url 将指示完成状态。
不幸的是,计算非常密集,因此一次只能运行一个,因此需要对作业进行排队。
在伪中需要这样的东西
(def job-queue (atom queue)) ;; some queue
(def jobs (atom {}))
(defn schedule-job [params]
;; schedules the job into the queue and
;; adds the job to a jobs map for checking status via GET
;; note that the job should not be evaluated until popped from the queue
)
(POST "/analyze" [{params :params}]
(schedulde-job params))
(GET "job/:id" [:d]
(get @jobs id))
;; Some function that pops the next item from the queue
;; and evaluates it when the previous item is complete
;; Note: should not terminate when queue is empty!
我研究了允许异步处理的Lamina,但它似乎不适合我的需要。
我的问题是如何使作业队列出队并在前一个任务完成后执行其任务,而不在队列为空时终止,即永久处理传入的作业。