2016-07-11 1 views
1

푸시 대기열에이 이상한 문제가 있습니다.Google 애플리케이션 엔진 작업 대기열 - 하나의 항목 만 허용

이 대기열에서 한 번에 하나의 작업 만 실행하면됩니다. max-concurrent-requests가 1로 설정된 푸시 큐를 구성했습니다. 그러나 큐에 작업을 제출하면 병렬로 실행됩니다. 나는 분당 1로 비율을 줄여야했다. 그러나 작업에 1 분 이상 걸리면 어떻게됩니까? 두 사람은 평행하게 달릴 것입니다.

<queue> 
    <name>winCoinsCalculatorQueue</name> 
    <max-concurrent-requests>1</max-concurrent-requests> 
    <rate>1/m</rate> 
</queue> 

나는 또한 1을 시도했지만 여전히 여러 항목을 병렬로 처리하는 것으로 보입니다.

대기열이 한 번에 하나의 작업 만 처리하도록하는 방법을 아는 사람이 있습니까?

당신은 한 번에 하나의 작업을 실행하기위한 메커니즘을 구현하지만, 작업 사이의 간격이 작업 실행 시간보다 짧은 경우에도

아룬 모든

+1

최대 동시 처리를 1로 설정하면 여러 작업이 병렬로 실행되는 이유를 자세히 설명 할 수 있습니까? – marcadian

+0

작업을 실행하는 서블릿에 디버그를 넣을 때 디버그에 두 개의 스레드가 고정되어 있습니다. 세 가지 작업을 제출하면 세 가지 스레드가 표시됩니다. 최대 동시 요청을 완전히 무시합니다. –

답변

0

작업이 동시에 실행되는 것을 방지하는 훌륭한 방법입니다. 여러분의 의견 중 하나는 개발 서버에서만 테스트 한 것입니다. The dev server does not respect some of the task queue settings. 프로덕션에서 사용해보십시오. 작동해야합니다.

작업을 완료하는 데 오랜 시간이 걸리는지 확인한 다음 몇 가지 큐를 확인하여 확인할 수 있습니다. 프로젝트의 콘솔로 이동하여 App Engine -> Task Queues를보고 대기열의 이름을 클릭하십시오. 현재 실행중인 사용자 수를 확인할 수 있습니다.

+0

예. 나는 dev 서버에서만 시도했다. 귀하의 코멘트가 작동하지 않는 링크. 나는 생산에서 그것을 시도 할 것이고 그것이 생산이 아닌 dev에서 작동한다면이 대답을 옳다고 표시 할 것이다. –

+0

Opps! 깨진 링크를 죄송합니다. 결정된. –

0

첫째, 당신은 당신의 작업을받을거야 대기열에 과밀. 즉, 나는 두 가지 가능한 해결책을 발견했다.

해결 방법 1 - 조치 토큰. 작업 실행 여부를 알려주는 데이터 저장소 항목을 만듭니다. 이제 각각의 작업이 실행되기 시작하면 DB를 검사하여 다른 작업이 실행 중인지 확인하고 다른 작업이 실행중인 경우 N 초 (다시 입력하십시오 : 인수 : taskqueue.add(url='/tasks/your_task', countdown=delay_in_seconds, params=params))로 다시 시도하십시오. 를 사용하여 풀 큐와 액션 토큰으로, 다시, 모든 N초를 실행하는 cron 작업 - '여기에 경쟁 조건)

해결 방법 2를 처리 할 수있는 방법을 찾아야 것이다. 옥수수 작업이 실행될 때마다 작업 실행 여부를 확인합니다. 그렇다면 cron은 아무 것도하지 않습니다. 실행중인 작업이 없으면 DB에 실행 플래그를 설정합니다. 작업이 완료되면 설정이 해제됩니다.

+0

이러한 솔루션에 감사드립니다. 나는 이것을 구현할 수 있었지만 max-concurrent-requests가 작동하지 않는 이유를 알고 싶다. –

관련 문제