2011-10-20 2 views
1

더 정밀한 파이썬 응용 프로그램이있어 네트워크 응용 프로그램이 다운 될 수 없으므로 다른 서버 및 클라이언트와 실제로 대화하기 때문에 PID를 죽일 수 없습니다. 그래서 ... 중단 시간이 많은 분당 많은 € 당신은 평소 24/7 시스템을 알고 있습니다.How-To - 실시간 실행 Python 응용 프로그램을 업데이트하십시오.

어쨌든 내 취미 프로젝트에서 나는 WSGI 프레임 워크와도 많은 일을한다. 그리고 나는 오프 피크 시간에도 같은 문제가 있다는 것을 알아 차렸다.

어쨌든 TCP/UDP를 사용하는 정상적인 서버를 상상해보십시오 (여기에 원하는 WSGI/SIP/Classified Information Server/등을 넣으십시오).

이제 원격 서버에서 git 풀을 수행하면 새로운 파이썬 파일이 서버로 이동합니다 (물론이 파일은 실제 소켓이 아닌 데이터 처리에만 영향을 미치기 때문에 해당 파일을 다시 올릴 필요가 없습니다). 소켓 또는 어떤 방식 으로든 네트워크 부분을 터치).

내부 모니터 업데이터를 깨우기 위해 SIGNAL을 사용하기 때문에 보통 파일 모니터를 사용하지 않습니다.

지금

from mysuper.app import handler 

while True: 
    data = socket.recv() 
    if data: 

    socket.send(handler(data)) 

그 핸들러가 DB 연결, 캐시 연결과 함께 APP 상상할 수 있습니다 다음 코드 등 핸들러를 업데이트하는 가장 좋은 방법은 무엇

을 상상한다.

reload (핸들러)를 호출해도 안전합니까?

DB 연결이 중단됩니까?

이 재시작까지 DB 연결이 지속됩니까?

현재 거래가 손실됩니까?

대인 관계가 생성됩니까?

사람들이 일반적으로 사용하는 가장 좋은 무늬 패턴은 무엇입니까?

답변

3

reload(handler)으로 전화해도 안전합니다.

연결을 초기화하는 위치에 따라 다릅니다. handler() 내부에서 연결을 만든 다음 handler() 객체가 범위를 벗어나면 가비지 수집됩니다. 하지만 네가 메인 루프 내부에 연결하지 않을거야, 그렇지? 나는 다음과 같이 추천 할 것이다 :

dbconnection = connect(...) 
while True: 
    ... 
    socket.send(handler(data, dbconnection)) 

만약 당신이 타이트한 루프 안에서 값 비싼 연결을하지 않는다면.

그건 완전히 다른 아키텍처로가는 것이 좋습니다. 기본적으로 UDP 데이터 그램을 수신하고 RabbitMQ과 같은 메시징 큐로 보내고 응답 메시지가 클라이언트에 결과를 다시 보낼 때까지 대기하는 수신기 프로세스를 만듭니다. 그런 다음 메시징 큐에서 요청을 ^는 실제 서 v를 작성하고 처리 한 후 응답 메시지를 다시 보내십시오.

UDP 서버를 업그레이드하려면 다른 포트에서 수신 대기중인 새 인스턴스를 실행하십시오. 들어오는 트래픽을 새 포트로 리디렉션하려면 방화벽 규칙을 업데이트하십시오. 규칙을 다시로드하십시오. 이전 프로세스를 종료하십시오. Voila : 원활한 컷오프.

진정한 승리는 백엔드를 연결 해제하는 것입니다. 프론트 엔드 "프록시"서비스에서 여러 프로세스가 동일한 메시지를 수신 할 수 있기 때문에 원할 경우 다른 시스템에서 여러 개의 프로세스를 병렬로 실행할 수 있습니다. 백엔드를 업그레이드하려면 새 인스턴스를 시작한 다음 이전 인스턴스를 종료하여 적어도 하나의 인스턴스가 실행되지 않는 시간이 없도록하십시오.

프록시를 확장하려면 여러 인스턴스를 다른 포트 또는 다른 호스트에서 실행하고 들어오는 데이터 그램을 프락시 중 하나로 임의로 리디렉션하도록 방화벽을 구성하십시오.

백엔드를 확장하려면 더 많은 인스턴스를 실행하십시오.

+0

안녕 커크 프록시 케이스가 유효합니다 내 경우에는 mongrel2 :)를 사용하고 있습니다. 물론 백엔드가 하나뿐이라면 문제가 남아 있습니다. 백엔드 없음 프록시 REQ에 REP가 없습니다. 물론 이것은 두 개의 프로세스를 올리고 순차적으로 업데이트를 수행함으로써 모두 정렬 될 수 있습니다. 그러나이 질문은 다른 사람들이 어떻게 볼 수 있는지 더 많은 방법 이었기 때문에 어쨌든 하나의 투표를 UP하십시오 :) – PythonWolf

+0

@PythonWolf 글쎄, 그렇게 할 수 있습니다. :-) 나는 거의 항상이 시스템을 허약하고 어렵게 만드는 것처럼 보이기 때문에 이런 식으로 너무 까다로워지는 것을 좋아하지 않는다. 나는 간단한 작은 구성 요소를 만들고 함께 붙이는 것을 선호한다. –

관련 문제