2012-10-24 2 views
2

Nginx/Unicorn을 통해 배포 할 때 문제는 실행중인 인스턴스와 연락하는 방법입니다. 이 응용 프로그램의 메모리 캐시를 업데이트하려면이 필요합니다. Nginx의/얇은와모든 Unicorn 인스턴스를 어떻게 업데이트합니까?

, 나는 여러 포트에 여러 인스턴스를 실행할와 같은 포트에 의해 응용 프로그램 인스턴스를 호출 :

#!/bin/bash 
curl :2000/update_cache/page_id 
curl :2001/update_cache/page_id 
etc. 

미운 접근하지만 난 한 페이지의 캐시를 업데이트 할 수 있습니다 원인은에서 (작품 수천)를 실행중인 모든 앱 인스턴스에 저장합니다.

나는 Unicorn으로 어떻게 할 수 있는지 궁금하지만 포트로는 할 수 없다. Unicorn은 실행중인 인스턴스의 목록을 제공합니까? 아니면 그들과 상호 작용할 수있는 방법을 제공합니까?

메모리 내 캐시의 문제는 일부 인스턴스에서 업데이트 할 때 일반적으로 다른 인스턴스에서 업데이트되지 않으므로 일부 사용자에게는 업데이트 된 콘텐츠가 표시되고 다른 사용자에게는 이전 콘텐츠가 남아 있기 때문에 콘텐츠 불일치가 발생합니다.

모든 Unicorn 인스턴스의 캐시를 어떻게 업데이트합니까?

+0

여러 작업자를 실행할 때 메모리 내 캐시를 사용하면 안됩니다. –

답변

3

, 당신은 노동자의 PID의 목록을 얻을 수있는이 :)처럼해서는 안하는 이유는 여러 가지 이유 중 하나입니다?

그렇다면 신호를 보내 관리 할 수 ​​있습니다.

루비는 유닉스 신호와 잘 어울리고, 그냥 잡아서 필요한 내부 작업을 수행하면됩니다.

개념의 간단한 증거 : 당신이 노동자의 PID가있는 경우

Signal.trap 'INFO' do 
    puts "Updating %s" % Process.pid 
    # clear cache ... 
end 

지금, 당신은 단순히 수행 대신 정보의 신호를 사용할 수 있습니다

#!/bin/bash 
for pid in $pids; do 
    kill -s INFO $pid 
done 

. 신호의 목록

은 루비 Signal.list

는, 노동자의 PID의 목록을 가져 유니콘의 after_fork 설정을 확인하려면을 참조하십시오.

+0

doh, it 너무 명백한 살인이다 :) 덕분에, 그것을 시도 –

+0

그거야! 물러서! 나는 지금 완전히 통제 된 Unicorn App을 가지고있다! :) –

0

이것은 불가능합니다.

유니콘 마스터 프로세스가 수신 대기 포트를 열면 작업자는 계속해서 해당 포트에서 요청을 수락하려고합니다. sending them Unix signals 이외의 개별 근로자를 선택할 방법이 없습니다.

캐싱이

+0

disapointed :(내부 캐시가없는 프로젝트에서만 Unicorn을 사용해야합니다. –

+0

또는 응용 프로그램 버전 번호 또는 임의로 변경할 수있는 토큰을 캐시 키에 통합하여 임의로 증분하여 이전 캐시를 효과적으로 무효화 할 수 있습니다. –

관련 문제