2014-04-06 7 views
2

Twisted 응용 프로그램에서 데이터를 유지하는 방법을 이해하려고합니다. 이제 나는 트위스트 서버 쓰기로 결정했습니다 가정 해 봅시다 :Twisted 응용 프로그램에서 데이터 지속

  1. 인바운드 SMTP는
  2. 가 수정을 위해 제 3 자 시스템에 메시지를 보냅니다 요청 수용을
  3. 릴레이 목적지로 수정 된 메시지

전형적인 트위스트 튜토리얼은 대략, 당신은 Deferreds 및 콜백을 사용하여이 응용 프로그램을 구축 할 것이다 :

  • 팩토리가 인바운드 요청을 처리합니다.
  • 전체 전자 메일을 수신 할 때마다 원격 메시지 프로세서로 전화가 전송되어 지연이 반환됩니다.
  • 수정 호출에서 문제가 발생하면 원래 메시지를 대체하는 오류 메시지를 추가합니다.
  • 수신자에게 메시지를 보내려면 콜백을 추가하고, 다시 지연을 반환합니다.
  • 실제 서버는 발신자 또는 기타 등을 다시 시도하거나 알리기 위해 추가 호출/오류 수정을 추가/포함합니다. 다시 한번 말하지만, 간단하게하기 위해이 값을 허용 가능한 양으로 간주하고 오류 만 기록한다고 가정합니다.

물론 이것은 충돌/재시작/다른 이벤트가 발생할 경우 NO 데이터를 유지합니다. 제 3의 영구 데이터 저장소 (RabbitMQ는 종종 언급 됨)가 포함 된 솔루션을 얻었으며 결과를 얻기 위해 12 가지의 임의의 방법이 제공 될 수 있습니다.

그러나 Twisted 앱에서 가장 잘 작동하는 몇 가지 방법이 있다고 상상해보십시오. 그들은 같은 중요시하는 점은 무엇입니까? 어떻게 진행중인 메시지를 저장하고 (충돌시 복구 할 수 있습니까?)

+0

작성한 간단한 샘플 코드 (http://sscce.org/)를 제시하고 "이 모든 작업을 어떻게 수행 할 것인가"가 아닌 잘못된 내용을 묻는다면 도움이 될 것입니다. ? – Glyph

+0

나는이 모든 것을 어떻게 구현할 것인지 절대 묻지 않았다. 나는 튜토리얼을 계속 읽었으며 (용어를 제외하고) 의사 코드는 꽤 많이 죽었다. 예를 들어 [이 튜토리얼] (https://github.com/jdavisp3/twisted-intro/blob/master/twisted-client-5/get-poetry.py)은 거의 똑같은 논리적 흐름을 따릅니다. 기본 전화를 SMTP 팩토리 ([this setup] (https://github.com/jdavisp3/twisted-intro/blob/master/twisted-server-1/fastpoetry.py)와 유사)로 바꾸고 poem_done을 async relay_message로 바꾸면 작동하는 서버가 생깁니다. – claytond

+0

질문은 이와 같은 시스템에서 높은 수준의 "데이터를 유지하는 방법"(즉, 배달 안정성 제공)입니다. 그 대답은 다른 아키텍처 (즉, 콜백 체인을 대신하는 메시지 브로커 대체)를 사용하는 것일 수 있다는 것을 알고 있습니다. 그래서 나는 좀 더 일반적인 "더 나은 접근 방법이 있습니까?"에서 끝났습니다. – claytond

답변

0

이 질문을 발견했다면 이미 Twisted가 이벤트 기반이라는 것을 이미 알고있을 것입니다. 간단 하긴하지만 대답의 "가장 어려운"부분은 퍼시스턴스 플랫폼이 필요할 때 필요한 이벤트를 생성하는 것입니다. 당연히 DB 또는 메시지 대기열에 데이터를 유지할 수 있지만 일부 플랫폼은 자연스럽게 이벤트를 생성하지 않습니다. 예 :

  • ZeroMQ는 새 데이터 용으로 no callback을 갖습니다. 또한 지속성이 비교적 낮습니다. 다른 경우

, 이벤트는 간단하지만 신뢰성에 문제가 :

  • pgSQL의는 triggers을 사용하여 이벤트를 생성하도록 구성 될 수 있지만 완전 재개 할 수 없습니다 그래서 그들은 한 번 일이야 이벤트

터널 끝의 표시등은 RabbitMQ와 비슷합니다.

  • RabbitMQ 우리는 응용 프로그램이 신뢰할 수 있도록 두 다리에 승인 (발신 SMTP로 들어오는 RabbitMQ에 SMTP 및 RabbitMQ)를 사용할 수 있습니다
  • 충돌을 생존을 위해 데이터베이스에 메시지를 persist 수 있습니다. 중요한 것은 RabbitMQ가 acknowledgements을 지원한다는 것입니다.
  • 마지막으로, RabbitMQ 클라이언트의 여러 전체 비동기 지원을 제공

그것은 RabbitMQ 클라이언트가 우리에게 이벤트 기반 인터페이스를 제공하는 우리의 목적을 위해 충분하다 (예를 pika, txampq에 대한보고, puka).

그러나보다 이론적 인 수준에서는 그렇지 않아도됩니다. 사실 위의 '알림'문제에도 불구하고 ZeroMQ는 event-based client입니다. 우리의 소프트웨어가 우아하게 이벤트 기반이라 할지라도 우리는 그렇지 않은 시스템을 사용하게 될 것입니다. 이 경우 polling으로 돌아갈 수밖에 없습니다. 원칙적으로 실제로는 아니지만 메시지 공급자에게 메시지를 쿼리합니다. 현재 대기열을 다 써 버렸을 때 (그리고 메시지가없는 경우 즉시) callLater 명령을 사용하여 나중에 다시 확인합니다. 그것은 안티 패턴을 느낄 수 있지만,이 특별한 경우를 처리하는 올바른 방법입니다.