Tôi đang làm việc trên ứng dụng Django cho phép người dùng tải tệp lên. Tôi cần thực hiện một số xử lý phía máy chủ trên các tệp này trước khi gửi chúng đến Amazon S3. Sau khi đọc các câu trả lời cho this question và this blog post Tôi quyết định cách tốt nhất để xử lý điều này là để trình xử lý xem của tôi gọi phương thức trên đối tượng từ xa Pyro để thực hiện xử lý không đồng bộ và sau đó trả lại ngay Http 200 cho máy khách. Tôi có prototyped này và nó có vẻ hoạt động tốt, tuy nhiên, tôi cũng muốn lưu trữ trạng thái xử lý để client có thể thăm dò ý kiến ứng dụng để xem tập tin đã được xử lý và tải lên S3 chưa.Làm cách nào để lưu trữ trạng thái cho một quy trình chạy dài được gọi từ Django?
Tôi có thể xử lý việc bỏ phiếu dễ dàng đủ, nhưng tôi không chắc vị trí thích hợp để lưu trữ trạng thái quy trình. Nó cần phải được ghi bởi quá trình Pyro và có thể đọc được bằng cách xem bỏ phiếu của tôi.
- Tôi do dự khi thêm cột vào cơ sở dữ liệu cho dữ liệu thực sự chỉ tồn tại trong 30 đến 60 giây.
- Tôi đã xem xét sử dụng số low-level cache API của Django và sử dụng id tệp làm khóa, tuy nhiên, tôi không tin rằng đây thực sự là khung bộ nhớ cache được thiết kế và tôi không chắc chắn về những vấn đề không lường trước được tuyến đường.
- Cuối cùng, tôi đã xem xét lưu trữ trạng thái trong đối tượng Pyro đang xử lý, nhưng sau đó vẫn có vẻ như tôi cần thêm cột cơ sở dữ liệu "processing_complete" boolean để xem có biết truy vấn trạng thái từ Pyro hay không vật.
Tất nhiên, cũng có một số mối quan tâm toàn vẹn dữ liệu với trạng thái tách khỏi cơ sở dữ liệu (điều gì sẽ xảy ra nếu máy chủ bị hỏng và tất cả dữ liệu này nằm trong bộ nhớ?). Tôi muốn biết các nhà phát triển ứng dụng web dày dạn hơn sẽ xử lý loại xử lý trạng thái này như thế nào.
Sau khi suy nghĩ về điều này qua đêm, tôi đã quyết định rằng bạn hoàn toàn đúng. Nó chỉ không có ý nghĩa để không sử dụng cơ sở dữ liệu. Tôi cũng đã quyết định rằng Pyro là một phù hợp xấu ở đây và rằng tôi chỉ nên làm những gì người bình thường làm và sử dụng một công việc cron với một tập tin khóa. – bouvard
Chúng tôi không sử dụng cron. Chúng tôi có hệ thống lô của chúng tôi như một máy chủ WSGI nhỏ và chúng tôi thực hiện một yêu cầu HTTP với urllib2 để đánh thức nó. Nó nhận được ID yêu cầu từ yêu cầu WSGI; nhận được các chi tiết với Django ORM bình thường. –
Đây là những gì tôi dự định làm với Pyro, nhưng vấn đề tôi thấy trước đó là máy chủ đột ngột ngừng hoạt động có thể để lại tài liệu được xử lý một nửa và sẽ không có thông báo yêu cầu mới để bắt đầu lại quá trình xử lý. Nếu tôi sử dụng một công việc cron tôi biết rằng tôi có thể chỉ cần chọn 10 công việc chưa hoàn thành cũ từ bảng yêu cầu và tôi sẽ đón bất kỳ công việc nào bị cắt trong thời gian cúp điện. – bouvard