문제

Apache (mod_wsgi, prefork)가 제공하는 Pylons 웹 응용 프로그램이 있습니다. Apache로 인해 응용 프로그램 코드를 동시에 실행하는 여러 개의 별도 프로세스가 있습니다. 응용 프로그램이 "라이브"응답 시간을 개선하기 위해 백그라운드에서 처리하기 위해 연기하고자하는 비 임박한 작업 중 일부. 그래서 저는 작업 대기열을 생각하고 있습니다. 많은 Apache 프로세스 가이 대기열에 작업을 추가하는 많은 Apache 프로세스, 단일 별도의 Python 프로세스를 일대일로 처리하고 큐에서 제거합니다.

큐는 바람직하게는 디스크에 지속되어야하므로 정전, 서버 재시작 등으로 인해 대기열이없는 작업이 손실되지 않습니다. 질문은 다음과 같습니다. 그러한 줄을 구현하는 합리적인 방법은 무엇입니까??

내가 시도한 것에 관해서는 : 나는 단순한 sqlite 데이터베이스와 단일 테이블로 시작하여 큐 항목을 저장하기 위해 시작했습니다. 부하 테스트에서 동시성 수준이 증가 할 때 예상대로 "데이터베이스 잠긴"오류를 얻기 시작했습니다. Quick'n'Dirty Fix는 SQLITE를 MySQL로 대체하는 것이 었습니다. 동시성 문제를 잘 처리하지만 필요한 간단한 일에 대한 과잉처럼 느껴집니다. 큐 관련 DB 운영도 프로파일 링 보고서에서 두드러지게 나타납니다.

도움이 되었습니까?

해결책

Apache 's와 같은 메시지 중개인 ActiveMQ 여기서 이상적인 솔루션입니다.

파이프 라인은 다음과 같습니다.

  • HTTP 요청을 처리하는 응용 프로그램 프로세스는 응답을 신속하게 생성하고 우선 순위가 낮고 무거운 작업을 AMQ 대기열로 보냅니다.
  • 하나 이상의 다른 프로세스는 AMQ 대기열을 소비하고 이러한 무거운 작업과 관련된 작업을 수행하도록 구독됩니다.

ActiveMQ는 아직 영구 저장소에 소비되지 않은 메시지를 저장하기 때문에 대기열 지속성의 요구 사항은 상자 밖으로 충족됩니다. 또한 여러 HTTP-Apps, 여러 소비자 앱 및 AMQ 자체를 각각 다른 기계에 자유롭게 배포 할 수 있기 때문에 상당히 잘 확장됩니다.

우리는 Python으로 작성된 프로젝트에서 이와 같은 것을 사용합니다. 스톰프 기본 커뮤니케이션 프로토콜로.

다른 팁

웹 서버 (모든 웹 서버)는 멀티 프로듀서, 단일 소비자 프로세스입니다.

간단한 해결책은 a를 구축하는 것입니다 wsgiref 또는 Werkzeug 백엔드 서버를 작성하여 백엔드 요청을 처리합니다.

이 "백엔드"서버는 WSGI 기술을 사용하여 빌드되므로 프론트 엔드 웹 서버와 매우 유사합니다. 제외하고. HTML 응답을 생성하지 않습니다 (JSON은 일반적으로 더 간단합니다). 그 외에는 매우 간단합니다.

이 백엔드에 대한 편안한 거래를 설계합니다. URI 구문 분석, 승인, 인증 등에 다양한 WSGI 기능을 모두 사용합니다. 일반적으로 RESTFUL SERVERS는 일반적으로 세션을 제공하지 않기 때문에 세션 관리가 필요하지 않습니다.

심각한 확장 성 문제가 발생하면 백엔드 서버를 LightTPD 또는 다른 웹 엔진으로 래핑하여 멀티 스레드 백엔드를 만듭니다.

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