2011-11-16 5 views
15

GAE 채널 API를 재정적으로 실행 가능하게 만드는 유일한 방법은 일종의 풀링 메커니즘을 구현하는 것입니다. (수석 앱 엔진 제품 관리자 중 한 명이 이메일로 엄청난 가격에 대해) 아직 만료되지 않은 채널을 재사용 할 수 있습니다.Google App Engine에서 채널 풀링의 가장 좋은 방법

저는 채널 풀을 구현하는 방법 (장소)에 대해 브레인 스토밍을 해왔지만 각각의 생각에는 꽤 심각한 단점이 있습니다.

서블릿의 정적 메모리 - 새로운 VM 인스턴스가 열리거나 클라이언트가 한 VM에서 다른 VM으로 전달 될 때 꽤 많은 열린 채널이 삭제됩니다.

Memcache를 - 적어도 메모리가 모든 VM에서 세계적으로 액세스 할 수 있지만 지금은 아주 실행 가능한 채널을 포기의 가능성이 비활성 메모리 압력에 의한 가능성이 크다.

백엔드 인스턴스 - 신뢰성면에서 가장 좋은 옵션이지만, 현재 백엔드를 실행하는 데 드는 비용은 처음에는 풀을 구현하는 데 드는 모든 비용을 먹을 것입니다!

내가 누락 된 VM 전체에 채널 풀을 구현하는 더 좋은 방법이 있습니까? 아니면 여기 내 옵션의 단점을 불필요하게 버텨야할까요? 정말 거기에 있기를 바랄뿐입니다. 또는 내 앱이 폴링으로 되돌아 가야 할 것처럼 보입니다. (이는 예비적인 측정 항목에서 조금 더 싸게 보입니다.)

+0

당신이 타임 스탬프 데이터 저장소에서 그들을 저장할 수 있습니다, 다음 만료 된 것들을 삭제하는 크론을 실행? 읽기/쓰기 작업은 당신에게 비용이 많이 들지만 ... –

+0

@Jonathan Newmuis 그래, Memcache 솔루션과 함께 가고 있지만, 언급 한 것처럼 비용도 들지 않습니다. 아마도 그들 중 두 명이 함께 작업하는 것이 가장 실용적인 옵션이 될 것입니다. 누구나이 시도를하는 척도 나 경험이 있습니까? – depthfirstdesigner

+0

소프트웨어가 수행하는 작업에 대한 정보를 추가 할 수 있습니까? – AlfredoVR

답변

8

가 여기에 내가 할 줄거야. (실제로 질문을 본 후이 라이브러리를 쓰고 고려 중이 야 나도 필요) :

은 다음 API와 taskpool 모듈을 만듭니다.

client_id, token = taskpool.get() 

# Setup a heartbeat in the client JS, maybe every minute. 
# Also call this every time the client indicates presence 
taskpool.ping(client_id) 

taskpool.release(client_id) 

구현하십시오이 사용되고 있는지 여부를 나타내는 상태, 마지막 핑 시간, 작성 시간

  • 스토어 엔티티의 client_idtoken. client_id을 키로 둡니다. NDB도 사용하는 것이 좋습니다. 무료 memcaching.

get()은 사용되지 않은 토큰이 있는지 확인하고 발견되지 않은 토큰을 반환합니다. 그렇지 않으면 새 것을 작성하여 저장하고 리턴하십시오.

ping() 해당 토큰의 마지막 핑 시간을 업데이트합니다. 폴링 대신 클라이언트가 [하트 비트] 시간마다 ping을 보내도록하십시오.

release() 토큰을 사용하지 않는 것으로 표시합니다.

[하트 비트] 초마다 작업/크론을 실행하여 잠시 동안 핑을 얻지 못한 토큰을 찾아서 사용하지 않는 토큰으로 설정하십시오.

클라이언트가 닫힌 토큰을보고하면 get()을 수행하십시오.

그러나 보안상의 손실은 모든 유형의 토큰 풀링의 부산물이라는 점에 유의하십시오. 악의적 인 클라이언트가 토큰을 보유하고 하트 비트 전송을 중지 한 경우 나중에 토큰을 다시 사용하면 새 클라이언트에 전달되는 메시지를 수신 할 수 있습니다.이것은 공개 사이트에있는 경우 문제가되지 않지만 어쨌든 염두에 두어야합니다.

이 답변을 라이브러리로 작성하는 경우이 답변을 업데이트합니다.

+0

창조적 인 답변 Sudhir에 감사하지만 NDB는 무엇입니까? App Engine Memcache API는 이미 무료였습니다. 이것은 완전히 실용적인 솔루션과 같지만 이러한 여러 움직이는 부분 (crons/tasks 및 datastore 작업)이 어떻게 작동 하는지를 알면 매우 흥미로울 것입니다. 도서관을 시작하는 바람에 (특히 오픈 소스 저장소를 여는 경우) 알려주십시오.). – depthfirstdesigner

+0

NDB는 1.6.0 이후 버전의 새로운 데이터 저장소 API입니다 (http : //code.google.com/p/appengine-ndb-experiment/). 답변을 링크로 업데이트했습니다. –

+0

아, '무료 memcaching'은 NDB가 캐싱을 처리한다는 의미입니다. 추가 코드 줄이 없습니다. –

2

Google App Engine 지원팀에 따르면 채널 토큰을 다시 사용할 수 없습니다. 그것들을 다시 사용하는 것은 효과가 없을 것으로 예상됩니다.

Can Google App Engine Channels be reused?