문제

저는 사용자가 파일을 업로드할 수 있는 Django 애플리케이션을 개발 중입니다.이 파일을 보내기 전에 서버측 처리를 수행해야 합니다. 아마존 S3.에 대한 답변을 읽은 후 이 질문 그리고 이 블로그 게시물 나는 이것을 처리하는 가장 좋은 방법은 내 뷰 핸들러가 메소드를 호출하도록 하는 것이라고 결정했습니다. 파이로 비동기적으로 처리를 수행한 다음 즉시 클라이언트에 Http 200을 반환합니다.나는 이것을 프로토타입으로 만들었고 잘 작동하는 것 같습니다. 그러나 클라이언트가 애플리케이션을 폴링하여 파일이 처리되어 S3에 업로드되었는지 확인할 수 있도록 처리 상태도 저장하고 싶습니다.

폴링을 충분히 쉽게 처리할 수 있지만 프로세스 상태를 저장할 적절한 위치가 어디에 있는지 잘 모르겠습니다.Pyro 프로세스에서 쓸 수 있어야 하고 폴링 뷰에서 읽을 수 있어야 합니다.

  • 실제로 30~60초 동안만 지속되어야 하는 데이터에 대해 데이터베이스에 열을 추가하는 것을 주저하고 있습니다.
  • 나는 Django를 사용하는 것을 고려했습니다. 저수준 캐시 API 그러나 파일 ID를 키로 사용하면 이것이 실제로 캐시 프레임워크가 설계된 목적이라고 생각하지 않으며 이 경로를 진행하는 데 어떤 예상치 못한 문제가 있을 수 있는지 잘 모르겠습니다.
  • 마지막으로 처리를 수행하는 Pyro 객체에 상태를 저장하는 것을 고려했지만 여전히 뷰가 Pyro 객체에서 상태를 쿼리할지 여부를 알 수 있도록 부울 "processing_complete" 데이터베이스 열을 추가해야 할 것 같습니다.

물론, 데이터베이스에서 상태를 분리하는 것과 관련하여 몇 가지 데이터 무결성 문제도 있습니다(서버가 다운되고 이 모든 데이터가 메모리에 있으면 어떻게 될까요?).노련한 웹 애플리케이션 개발자가 이런 종류의 상태 저장 처리를 어떻게 처리할지 듣고 싶습니다.

도움이 되었습니까?

해결책

데이터베이스에 "요청" 테이블을 가짐으로써 이를 수행합니다.

업로드가 도착하면 업로드된 File 객체를 생성하고 요청을 생성합니다.

백그라운드 배치 프로세서를 시작합니다.

200 "작업 중" 페이지가 반환됩니다. 여기에는 요청과 해당 상태가 표시됩니다.

우리의 배치 프로세서는 Django ORM을 사용합니다.완료되면 Request 객체가 업데이트됩니다.이메일 알림을 보낼 수는 있지만 보낼 수는 없습니다.대부분의 경우 사용자가 다시 로그인하여 처리가 완료되었음을 확인할 수 있도록 상태를 업데이트합니다.


배치 서버 아키텍처 노트.

일괄 처리 요청을 포트에서 기다리는 WSGI 서버입니다.요청은 ID 번호가 있는 REST POST입니다.배치 프로세서는 이를 데이터베이스에서 찾아 처리합니다.

서버는 REST 인터페이스에 의해 자동으로 시작됩니다.실행 중이 아니면 생성합니다.이로 인해 사용자 트랜잭션이 느린 것처럼 보이지만, 뭐, 그렇죠.충돌해서는 안 됩니다.

또한 실행 중인지 확인하는 간단한 crontab이 있습니다.기껏해야 "살아 있습니까?" 확인 사이에 30분 동안 다운됩니다.공식적인 시작 스크립트는 없지만(mod_wsgi를 사용하여 Apache에서 실행) WSGI 파일을 건드린 다음 상태 확인을 수행하는 URL에 대해 POST를 수행하는 "다시 시작" 스크립트를 생성할 수 있습니다. 배치 프로세서).

일괄 서버가 시작되면 POST를 받지 못한 처리되지 않은 요청이 있을 수 있습니다.따라서 기본 시작은 요청 대기열에서 모든 작업을 가져오는 것입니다. -- 뭔가 누락되었을 수 있다고 가정합니다.

다른 팁

나는 이것이 오래된 질문이라는 것을 알고 있지만 누군가는 이 시간이 지난 후에도 내 대답이 유용하다고 생각할 수 있으므로 여기에 있습니다.

물론 데이터베이스를 대기열로 사용할 수 있지만 해당 목적에 맞게 개발된 솔루션이 있습니다.

AMQP 바로 그것을 위해 만들어졌습니다.함께 셀러리 또는 당근 그리고 브로커 서버는 다음과 같습니다 RabbitMQ 또는 ZeroMQ.

이것이 바로 우리가 최신 프로젝트에서 사용하고 있는 것이며 훌륭하게 작동하고 있습니다.

귀하의 문제에는 Celery와 RabbitMQ가 가장 적합한 것 같습니다.RabbitMQ는 메시지의 지속성을 제공하고 Celery는 병렬로 실행되는 프로세스의 상태를 확인하기 위한 폴링을 위한 간편한 보기를 제공합니다.

당신은 또한에 관심이있을 수 있습니다 문어.

따라서 필요한 것은 작업 대기열입니다.귀하의 경우, 해당 상태의 수명이 짧더라도 상태를 저장하기 위해 반드시 DB를 사용하겠습니다.이는 귀하의 모든 요구 사항을 충족할 것으로 보이며, 이미 모든 움직이는 부분을 사용할 수 있으므로 구현하기가 크게 어렵지 않습니다.그렇지 않으면 간단하게 유지하십시오. 필요 좀 더 복잡한 것.

더 강력하고 정교한 것이 필요하다면 다음과 같은 것을 살펴 보겠습니다. 기어맨.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top