2012-10-01 2 views
0

초당 30-100 개의 이메일을 처리해야하는 자체 개발 된 SMTP 릴레이 서버에 고 가용성을 구현하는 가장 좋은 방법은 무엇입니까?자체 개발 한 Delphi SMTP Relay Server의 고 가용성?

이 서버의 주요 기능은 다양한 smtp 클라이언트로 인증 한 다음 특정 메일 서버로 릴레이하고 오류를 처리하는 것입니다. 메일 서버를 사용할 수 없습니다. 따라서 큰 첨부 파일을 포함 할 수있는 이메일 메시지를 포함하는 대기열이 필요합니다. 고 가용성을 위해 시스템은 클러스터링을 지원해야하는데, 기본/보조 활성 클러스터에 대해 Windows 클러스터링을 사용할 수 있습니다.

내가 리스팅 대기열에있을 수 있음을 생각한다 : (.이 방법은 명백한 이유를 위해 밖으로)

  • RDMS
  • 파일이

    1. 메모리 (나는이 가상 SMTP가 사용하는 IIS 무엇이라고 생각?)
    2. 같은 SQLite는 같은 임베디드 DB
    3. SQLite는 믹스 및 파일
    4. 설치 양론 할 필요가 일부 공상 제 3 자 Queue 제품 문채 있는?

    일반적인 가용성은 MySQL과 같은 RDBMS를 사용하는 것이지만 메시지 대기열로 RDBMS를 사용하면 강력한 MySQL 서버가없는 한 성능이 크게 저하됩니다. 그 중에서도 쉽지 않은 MySQL 클러스터링을 구현해야합니다. 또한 어느 누구도 MySQL을 대기열로 사용해서는 안되는 곳을 읽었습니다. - http://www.engineyard.com/blog/2011/5-subtle-ways-youre-using-mysql-as-a-queue-and-why-itll-bite-you/

    또는 SQLite + File을 사용하면 가장 빠른 (순수 메모리 제외) 방법이고 배포 방법이 가장 쉽습니다.), SQLite에 대한 클러스터링이 없으므로 서버가 충돌하면 보내지 않은 메시지가 여전히 손실 될 수 있습니다.

  • +2

    'sendmail'과 같이 현재 사용 가능한 SMTP 서버가 고 가용성을 포함하여 원하는 것을 수행 할 수있는 이유는 무엇입니까? –

    +1

    @ JeroenWiertPluimers, 우리는 항상 더 잘 할 수 있기 때문에, 그렇지 않습니까? ;) –

    +0

    @ Jeroen Wiert Pluimers - 일부 메일을 별도의 처리를 위해 필터링 중이므로 Exchange 플랫폼과 함께 작동해야합니다. – Joshua

    답변

    1

    2와 4는 RDBMS와 같습니다. RDBMS는 복잡한 쿼리를 대상으로하므로 시간이 오래 유지되어야하기 때문에 이것이 바람직하지 않습니다. 쓰레기를 모으고, 인덱스를 다시 만들고, DB 파일을 늘리십시오. 다음 번 INSERT는 느려지거나 잠시 동안 완전히 차단됩니다. Firebird 및 Postgress와 같은 버전 기반 엔진에서도. MS SQL 및 SQLite와 같은 잠금 기반의 경우 더욱 그렇습니다.

    신뢰할 수있는 경우 여러 협업 작업자로 구현하면 OmniThreaLibrary 또는 AsyncCalls를 사용하여 멀티 스레딩의 이점을 얻을 수 있습니다.

    "싱크"작업자는 메모리 버퍼로 메일을 받아야하며 일부 메타 데이터 양식 헤더를 추출하여 현재 수신 대기열에 저장해야합니다. Win32 쓰레드는 값 비싸기 때문에 Erlang/Scala의 "액터"프레임 워크 인 한 번에 하나의 쓰레드가 여러 소켓으로 작업하게하는 것이 좋습니다. 클럭을 현지화하기 위해 설계된 qmail과 같은 exe를 분리하기 위해 일부 스레드를 이동할 수도 있습니다. 그리고 앞으로는 컴퓨터 클러스터에서도 마찬가지입니다.

    "Dumper"는 분리 된 큐를 가져 와서 인접한 비 SQL 파일 (HDD 쓰 래싱 데이터 - 파일 시스템 데이터 파일 시스템 ... 때문에 개별 파일을 원하지 않을 것입니다) d 대기열을 전환합니다. 앞에서 설명한 수신 대기열을 덤프 용으로 분리하고 방금 비운 대기열로 다시 병합합니다. "대기열이 두 개 있고 스위치를 사용하는"것은 3D 게임에서 사용되는 일반적인 "페이지 뒤집기"특성입니다. TForm.DoubleBuffering은 비슷하지만 아직 축소 된 개념입니다. BTW, 위의 메모리 내 대기열과 같은 해당 파일이있는 두 개의 폴더가 있어야합니다.

    "dbkeeper"는 마찬가지로 파일 덤프 중 하나를 가져 와서 RDBMS로 옮기고 전환합니다.

    이러한 전환 작업과 관련하여 이러한 작업자간에 통신을 설정해야합니다. 각 대기열은 동시 액세스 (빈도와 수명 모두)를 최소화하여 수신하거나 덤프해야합니다.

    mailinator 디자인 - 유지 관리 담당자가 하나 또는 다른 병목 현상을 밟은 후 몇 차례 자신의 소프트웨어를 리팩터링 한 것으로 보았을 때 병목 현상이 성능에 영향을 줄 때 추정치를 제공 할 수도 있습니다.


    하지만 정말로 준비가되어 있고 테스트를 마친 서버를 사용하지 않으시겠습니까?

    +0

    감사합니다. Arioch, 별도의 처리를 위해 일부 메일을 필터링하는 논리를 추가 할 것입니다. 로드가 너무 많으면 클러스터링을 사용할 수 있다고 생각합니까? :) 디커플링의 요점은 – Joshua

    +0

    입니다. Google의 MapReduce와 같은 궁극적 인 형식은 아닙니다.하지만 MapReduce 문서를 읽으면 그 관점을 이해할 수 있습니다. 일반적인 단일 스레드 선형 명령 코드에 대한 절름발이가 멀티 스레딩 환경에서 적절한 방법 일 수 있습니다. 그러나 클러스터링은 빠른 상호 연결을 필요로합니다. 여기에서는 복잡한 수학이 필요하지 않으므로 Seti @ Home (계산 2 일, 데이터 교환 2 분)과 같은 것은 불가능합니다. 그런 "작은 노동자"decoupling'd 병목 현상 2를 현지화하는 것을 돕는다 그 (것)들을 단단히 해결하십시오 –