API와 일부 장기 실행 작업을 실행하는 작업자로 구성된 Google App Engine (Python)에서 실험용 애플리케이션을 실행하고 있습니다.
API는 클라우드 엔드 포인트가있는 표준 모듈이고 작업자는 ManagedVM 모듈입니다.
사용자는 풀 큐에 태스크로 넣는 데이터베이스에 태스크를 작성합니다. 작업자는 해당 작업을 가져와 임대를 연장하여 무한히 실행합니다. 작업자는 또한 데이터베이스에서 작업 상태 (예 : "실행 중"또는 "오류")를 설정합니다.
목표는 사용자가 다시 중지 할 때까지 작업을 영원히 실행하는 것입니다. 상태를 "중지"로 설정하고 작업자에서 처리기를 호출하여 작업을 중지함으로써이를 구현했습니다 (workerUrl은 작업 모델에 저장 됨). 그러면 작업자는 상태를 "중지됨"으로 설정하고 임대 한 작업을 삭제합니다.
이것은 지금까지 몇 가지 사소한 문제로 작동합니다 (예 : 작업을 두 번 배치). 하지만이 문제를 처리하는 더 나은 방법이 있는지 궁금합니다. 기본적으로 문제는 원격 작업자 실행을 데이터베이스 모델과 동기화하는 방법입니다.
또한 응용 프로그램을 중지하면 작업이 상태에 따라 대기열에 다시 넣어야한다는 문제가 있습니다 (의도적으로 중지 될 수 있음). 라이브 서버에서는 앱이 기본적으로 멈추지 않기 때문에 큰 문제가 아니지만 dev-server에서는 그렇습니다. 크론 작업에 적합할까요?
업데이트 1 :
작업에 대한 정보는 실제로 데이터베이스에 저장됩니다. 큐의 작업에는 데이터베이스에있는 모델의 ID가 포함되어 있습니다. 그림에서 상태는 API에서 업데이트됩니다.
작업자 (MVM)와 API 간의 통신은 작업자 측에서 Python 클라이언트를 사용하는 Cloud Endpoints를 통해 이루어집니다. 이것은 매우 안정적으로 작동합니다.
중복 된 작업을 피하기 위해 작업 이름을 사용해야하는 것은 사실입니다. 내가 만난 유일한 문제는 같은 이름을 꽤 오랫동안 재사용 할 수 없다는 사실 이었기 때문에 타임 스탬프를 포함하여 몇 가지 작업 이름을 알아 내야했습니다.
일부 데이터베이스 전용 접근 방식보다 작업 대기열을 선택한 이유는 함께 제공되는 장애 조치 메커니즘 때문입니다. 내 작업자가 실패 할 가능성이 높으므로 다른 작업자가 작업을 픽업합니다. 또한 데이터베이스 호출과 API 호출을 줄입니다.
나는 일종의 명령 모델을 갖기 위해 자체 모델에서 "작업 상태"를 리팩토링 할 것이라고 생각합니다. 이것은 또한 작업에 대한 로그 역할을하므로 실행 수준에서 발생한 일을 볼 수 있습니다. 작업 대기열과 함께 작동 할 수도 있습니다. 그렇지 않은 경우 대기열을 제거 할 수 있는지 확인할 수 있습니다.
작업자와 API 프런트 엔드가 스토리지를 공유하기를 원하는 것처럼 들리며 솔루션은 작업 대기열을 해당 스토리지로 사용하는 것입니다. 작업자에서 Cloud Datastore의 REST API를 사용하는 것이 더 좋습니다. 여전히 pull 큐를 사용하여 작업을 시작하고 (동일한 작업을 여러 작업자에게 임대하지 않도록) 해당 데이터 저장소 레코드를 사용하여 API 프런트 엔드와 작업자간에 업데이트를 전달할 수 있습니다. 예를 들어 API 프런트 엔드는 "중지"요청을 저장 한 다음 작업자가 실행될 때이를 폴링합니다.
App Engine의 API 프런트 엔드는 동일한 트랜잭션에서 데이터 저장소와 작업 대기열 모두에 커밋 할 수 있습니다. 이를 통해 공유 레코드 및 작업을보다 강력하게 설정할 수 있습니다.
중복 작업을 방지하려면 작업 이름을 고려하십시오. 작업에 이름을 할당하여 동일한 이름으로 두 작업이 생성되지 않도록 할 수 있습니다.
데이터 저장소를 공유하는 경우 개발 중에 GAE API 프런트 엔드 및 관리 형 VM 작업자 백엔드를 가장 잘 설정하는 방법을 잘 모르겠습니다. 둘 다 Datastore REST API와 개발 별 프로젝트를 사용해야 할 수 있으며 API 프런트 엔드에는 '개발 서버가 REST를 사용하고 기본 데이터 저장소 API를 사용하는 경우'래퍼가 필요합니다. (더 나은 방법이 있다면 알고있는 것이 즐겁습니다. 아직 관리 형 VM을 처음 사용합니다.) 귀하의 질문에 개발자 서버는 요청하지 않는 한 실행 사이에 자체 로컬 시뮬레이션 데이터 저장소를 유지한다고 덧붙일 것입니다. 실행간에 작업자 상태를 유지하는 데 도움이 될 수 있습니다.
작업 대기열에 작업을 남겨두고 임대를 무기한 연장하는 기술은 여러 작업자가 동일한 작업을 수행하는 것을 피하면서 새로운 작업자가 중단 된 작업을 선택할 수 있도록하기위한 것이라고 가정합니다. 무한한 작업으로 데이터 저장소를 기반으로 유사한 메커니즘을 구축하고 연결 유지 프로세스를 사용하여 필요에 따라 작업을 다시 시작할 수 있습니다. 이것이 훨씬 낫다고 주장하기는 어렵지만 개발 환경 문제를 단순화 할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다