【发布时间】:2013-01-18 08:20:59
【问题描述】:
目前,我正在尝试使用 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,它允许异步处理,但它似乎不适合我的需要。
我的问题是如何使作业队列出队并在前一个完成后执行其任务,而不是在队列为空时终止,即永久处理传入的作业。
【问题讨论】:
-
我不太擅长clojure,所以没有帮助,只是一个旁注:为什么返回204?我觉得返回一条实际消息(仅 200 条)可能会更好,其中的正文说它尚未完成或类似的内容?
-
你是对的,这实际上可能会更好,因为我错过了“如果客户端是用户代理,它不应该改变导致发送请求的文档视图” HTTP 规范,否则我猜“无内容”会更合适。
-
我总是喜欢 REST API 不尝试在 http 上播放。例如,如果我请求一些数据(例如某人的帐户但 ID 错误),我更喜欢在正文中获得 200 并提及没有这样的人,而不是例如 404。这感觉有点相同。但这是题外话,对此感到抱歉;)
标签: web-services clojure queue jobs lamina-clojure