가져오기 작업 임대

태스크가 pull 큐에 있으면 작업자가 태스크를 임대할 수 있습니다. 태스크가 처리되면 작업자는 태스크를 삭제해야 합니다.

시작하기 전에

중요 컨텍스트

  • 이 방법은 표준 환경의 서비스 내에서 실행 중인 작업자에만 적용됩니다.
  • pull 큐를 사용하는 경우 처리량에 따라 작업자의 규모를 직접 조정해야 합니다.

태스크 임대

태스크가 큐에 있으면 작업자는 leaseTasks() 메서드를 사용하여 큐에서 태스크를 한 개 이상 임대할 수 있습니다. add()를 사용하여 최근에 추가된 태스크가 leaseTasks()를 통해 제공되기까지 약간의 지연이 있을 수 있습니다.

임대 요청 시 임대할 태스크 수(최대 1,000개 태스크)와 임대 기간(초 단위, 최대 1주)을 지정합니다. 임대 기간이 만료되기 전에 가장 느린 태스크를 마칠 수 있을 만큼 임대 기간이 길어야 합니다. modifyTaskLease()를 사용하여 태스크 임대를 수정할 수 있습니다.

태스크를 임대하면 다른 작업자가 이 태스크를 처리할 수 없으며 임대가 만료될 때까지 계속 사용할 수 없습니다.

다음 코드 샘플에서는 pull-queue 큐의 태스크를 1시간 동안 임대합니다.

List<TaskHandle> tasks = q.leaseTasks(3600, TimeUnit.SECONDS, numberOfTasksToLease);

태스크 태그 일괄 처리

여러 태스크를 서로 구분하기 위해 코드에서 태스크에 '태그'를 지정한 후 태그를 사용하여 임대할 태스크를 선택할 수 있습니다. 태그는 필터의 역할을 합니다.

q.add(
    TaskOptions.Builder.withMethod(TaskOptions.Method.PULL)
        .payload(content.toString())
        .tag("process".getBytes()));

그런 다음 필터링된 태스크를 임대합니다.

// Lease only tasks tagged with "process"
List<TaskHandle> tasks =
    q.leaseTasksByTag(3600, TimeUnit.SECONDS, numberOfTasksToLease, "process");
// You can also specify a tag to lease via LeaseOptions passed to leaseTasks.

폴링 속도 조절

임대할 태스크의 큐를 폴링하는 작업자는 큐가 공급할 수 있는 것보다 더 빠르게 태스크를 임대하려 하는지 감지해야 합니다. 이러한 오류가 발생하면 leaseTasks()에서 다음과 같은 예외가 발생할 수 있습니다.


코드는 이러한 예외를 포착하여 leaseTasks() 호출을 보류한 후 나중에 다시 시도해야 합니다. 이 문제를 방지하려면 leaseTasks()를 호출할 때 더 높은 RPC 최종 기한을 설정하는 것이 좋습니다. 임대 요청이 빈 태스크 목록을 반환하는 경우에도 보류해야 합니다.

큐별로 초당 10개를 초과하는 LeaseTasks 요청을 생성하는 경우 처음 10개 요청만 결과를 반환합니다. 요청이 이 한도를 초과하면 결과 없이 OK가 반환됩니다.

Cloud Console에서 태스크 모니터링

애플리케이션의 모든 태스크와 큐에 대한 정보를 확인하는 방법은 다음과 같습니다.

  1. Cloud Console에서 태스크 큐 페이지를 열고 페이지 상단에 있는 메뉴 바에서 pull 큐 탭을 선택합니다.

    pull 큐 탭으로 이동

  2. 원하는 대기열 이름을 클릭하여 대기열 세부정보 페이지를 엽니다. 선택한 대기열의 모든 작업이 표시됩니다.

작업 삭제

작업자는 작업을 완료한 후 대기열에서 해당 작업을 삭제해야 합니다. 작업자가 태스크를 처리한 후에도 큐에 태스크가 남아 있다면 작업자가 실패했을 가능성이 높습니다. 이러한 경우 다른 작업자가 해당 태스크를 처리합니다.

deleteTask()를 사용하여 개별 태스크 또는 태스크 목록을 삭제할 수 있습니다. 태스크를 삭제하려면 태스크 이름을 알아야 합니다. leaseTasks()에서 반환된 Task object에서 태스크 이름을 확인할 수 있습니다.

다음 코드 샘플에서는 큐에서 태스크를 삭제하는 방법을 보여줍니다.

q.deleteTask(task);