Hiện tại tôi đang cố gắng xây dựng một dịch vụ web bằng API RESTful xử lý một số tác vụ dài (công việc).Hàng đợi công việc không đồng bộ cho dịch vụ web ở Clojure
Ý tưởng là người dùng gửi một công việc bằng cách thực hiện một POST trả về một số URL để kiểm tra trạng thái công việc cũng chứa url cho kết quả. Khi công việc hoàn tất (nghĩa là một số giá trị được ghi vào cơ sở dữ liệu), URL kết quả sẽ trả lại thông tin thích hợp (thay vì không có kết quả) và url công việc sẽ cho biết trạng thái đã hoàn thành.
Thật không may các tính toán khá chuyên sâu nên chỉ có thể chạy một lần, do đó các công việc cần được xếp hàng đợi.
Trong giả một cái gì đó như thế này sẽ là cần thiết
(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!
Tôi đã nhìn vào Lamina cho phép xử lý không đồng bộ nhưng nó dường như không phù hợp với nhu cầu của tôi.
Câu hỏi của tôi là cách làm giảm hàng đợi công việc và thực hiện tác vụ của nó sau khi đã hoàn thành công việc trước đó, mà không chấm dứt khi hàng đợi trống rỗng, tức là xử lý vĩnh viễn các công việc sắp tới.
Tôi không quá giỏi clojure, vì vậy không có trợ giúp ở đó, chỉ cần lưu ý: tại sao trả lại 204? Tôi cảm thấy có thể tốt hơn là trả lại một thông điệp thực sự (chỉ 200) với một cơ thể nói rằng nó chưa được thực hiện hay như thế? – Nanne
Bạn nói đúng, điều đó có thể thực sự tốt hơn vì tôi bỏ lỡ "Nếu khách hàng là tác nhân người dùng, KHÔNG NÊN thay đổi chế độ xem tài liệu của nó từ đó khiến yêu cầu được gửi" trong thông số HTTP, nếu không "Không có nội dung "Tôi đoán là thích hợp hơn. – JoelKuiper
Tôi luôn thích nếu REST API không cố gắng chơi ở http. Như trong, nếu tôi yêu cầu một số dữ liệu (ví dụ như tài khoản của ai đó nhưng với một id sai), tôi là một fan hâm mộ của nhận được một 200 với bên trong cơ thể đề cập đến không có người như vậy, thay vì ví dụ một 404. Điều này cảm thấy kinda giống nhau. Nhưng điều này là không hợp lý, xin lỗi vì điều đó;) – Nanne