문제

Django에 응용 프로그램이 있는데, 이는 다양한 사용 사례에서 사용자에게 많은 이메일을 보내야합니다. 나는 명백한 이유로 응용 프로그램 내에서 이것을 동기식으로 처리하고 싶지 않습니다.

Python과 잘 통합 된 메시지 대기열 서버에 대한 권장 사항이 있거나 Django 프로젝트에 사용 된 사람이 있습니까? 내 스택의 나머지 부분은 Apache, mod_python, mysql입니다.

도움이 되었습니까?

해결책

지금까지 나는 이것에 대한 "좋은"솔루션을 찾지 못했습니다. 나는 더 엄격한 소프트 실시간 요구 사항 (레지 판 상자에서 사진을 찍음)이있어서 접근 방식 중 하나가 충분히 빠를 것입니다. 이메일이 몇 분 동안 기다릴 수 있다고 가정합니다.

  • CRON 작업에 의해 처리 된 데이터베이스의 "TODO 목록".
  • 데몬에 의해 영구적으로 꿀벌이 처리 된 데이터베이스의 "Todo List".
  • UDP 패킷을 통해 웹 서버가 알림을받는 사용자 정의 데몬을 사용합니다 (오늘날 제작). 기본적으로 큐를 처리하기위한 IP 스택이있는 내 자신의 큐 시스템.
  • ActivEMQ 사용 메시지 중개인 - 안정성 문제로 인해 문제가 해결되지 않았습니다. 또한 나에게 자바 데몬은 일반적으로 다소 통통합니다
  • CouchDB에서 업데이트 트리거 사용. 멋지지만 업데이트 트리거는 이미지 처리를 중단하기위한 것이 아니므로 내 문제에 적합하지 않습니다.

지금까지 나는 문제를 처리하기 위해 RabbitMQ와 Xmpp/ejabebrd를 시도하지 않았지만 시도해 볼 차기 목록에 있습니다. Rabbitmq는 2008 년에 괜찮은 Python 연결을 얻었으며 수많은 XMPP 라이브러리가 있습니다.

그러나 아마도 당신이 필요한 것은 로컬 컴퓨터의 올바르게 구성된 MailServer입니다. 이것은 아마도 메일을 로컬 메일 서버에 동기식으로 덤프하여 전체 소프트웨어를 훨씬 더 간단하게 만들 수 있습니다.

다른 팁

이메일 대기열 인 특정 경우, 나는 쉬운 길을 가고 사용합니다. Django-Mailer. 멋진 측면 보누스로서 스택에서 볼 때 Django-Mailer를 활용할 수있을만큼 똑똑한 다른 플러그 프로젝트가 있습니다.

더 일반적인 대기열 솔루션은 아직 시도해 볼 수 없었지만 여기에 더 흥미로운 것들이 있습니다.

  1. pybeanstalk/beanstalkd
  2. Gearman의 Python 인터페이스 (아마도 지금은 더 흥미로울 것입니다. 기어맨의 C 버전)
  3. memcacheq
  4. 스톰프
  5. 셀러리

Stompserver는 좋은 옵션입니다. Django/Python에서 가볍고 설치하기 쉽고 사용하기 쉽습니다.

우리는 전자 메일을 보내고 다른 작업을 비동기 적으로 처리하기 위해 프로덕션에서 stompserver를 사용하는 시스템을 가지고 있습니다.

Django는 Django의 Model.post_save 핸들러 인 Database에 이메일을 데이터베이스에 저장합니다. 이벤트를 StompServer에게 보냅니다. STOMPSERVER는 이벤트를 비동기 작업을 수행하는 소비자 프로세스로 이벤트를 전달합니다 (이메일을 보냅니다).

런타임에 소비자 프로세스를 추가 할 수 있기 때문에 상당히 잘 확대됩니다. 두 소비자가 이메일보다 두 배나 보낼 수 있으며 소비자는 별도의 기계에있을 수 있습니다. 한 가지 약간의 합병증은 각 소비자가 자체 명명 된 대기열이 필요하므로 Django는 사용 가능한 소비자 수를 알고 각 큐에 라운드 로빈 방식으로 이벤트를 보내야한다는 것입니다. (동일한 대기열에서 듣는 두 소비자는 각각의 메시지 = 복제를 얻습니다). 하나의 소비자 프로세스 만 원한다면 이것은 문제가되지 않습니다.

우리는 이전에 작업을 위해 데이터베이스를 지속적으로 투표 한 프로세스를 가지고 있었지만 처리 할 필요가없는 경우에도 시스템에 많은 부하가 추가되고 있음을 발견했습니다.

이메일을 데이터베이스에 추가 한 다음 일부 작업 스케줄러 유틸리티 (CRON이 떠오른)에서 다른 스크립트를 작성하여 이메일을 보내십시오.

당신은보고 싶을 수도 있습니다 PYMQ. 파이썬으로 작성되었으며 클라이언트와 HTTP에 대해 이야기하며 대기열에 대한 다양한 모니터링 및 관리 옵션을 제공합니다.

메일 인프라를 사용하여 이것을 해결하는 것이 잘못된 것이 있습니까? 마찬가지로, 자신의 메일 데몬을 실행하는 모든 앱 서버는 로컬로 제출 된 메일을 대기시킬 수 있습니다.

http://www.snakemq.net/ 또한 효과가있을 수 있습니다

이미 MySQL을 설치 한 경우 "Todo List"로 사용할 테이블을 만들 수 있습니다.

스레드는 테이블에 작업을 동기식으로 추가하고 배치 된 작업은 완료된 작업을 제거합니다.

그렇게하면 더 많은 소프트웨어를 설치하고 배울 필요가 없으며 보내지 않는 한 지속적인 작업 상점으로 잘 작동해야합니다. 많이 이메일 (예 :> 10/sec).

게으른하지만 정확하고 적절한 솔루션이 있습니다. 다음 데이터베이스 테이블을 큐로 사용하십시오.

drop table if exists mailqueue;
create table mailqueue (
    id bigint primary key,
    subject text not null,
    body mediumtext not null,
    from varchar(255) not null,
    to varchar(255) not null
);

발신자는이 테이블의 끝에 새 행을 삽입해야합니다.

작업자 스레드를 다른 쪽 끝에서 한 번에 하나씩 팝 메일로 설정하고 (가장 낮은 ID) 보내려고합니다.

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