2016-12-21 1 views
1

pubsub 메시지를받는 appengine 앱이 있습니다.App Engine> 60 초 백엔드 처리?

60 초 이상 걸릴 수있는 데이터를 처리 중입니다.

요청 처리기가 limited (60 초)이므로 즉시 pubsub를 확인한 다음 처리합니다.

비록 이것이 도움이되지 않습니다 - 내가 보낸 메시지는 처리가 완료 되었음에도 불구하고 계속해서 다시 시도됩니다 (로거에서 보았습니다). 여기

내 코드입니다 :

public class Handler extends HttpServlet { 


@Override 
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { 


    // Acknowledge the message by returning a success code 
    resp.setStatus(HttpServletResponse.SC_OK); 
    resp.getWriter().close(); 

    JsonParser parser = JacksonFactory.getDefaultInstance().createJsonParser(req.getInputStream()); 
    parser.skipToKey("message"); 

    PubsubMessage message = parser.parseAndClose(PubsubMessage.class); 
    log.info("request was received " + message.getMessageId()); 
    String payload = new String(message.decodeData(), "UTF-8"); 

    doSomthingWithPayload(payload); // this takes more than 60 seconds 
} 

} 

내가 작업 큐를 사용하여 시도,하지만 내 데이터가 매우 크기 때문에 나는 Task size too large

질문 수 :

  1. 이 올바른 방법으로하는 것입니다 펍을 인정해?
  2. 승인 후 프로세스가 60 초 이상 걸릴 수 있습니까?
    • 예인 경우 - 내 pubsub 메시지가 계속해서 다시 보내지는 이유는 무엇입니까?
    • 그렇지 않은 경우 수행 할 수있는 작업 - 작업 대기열을 사용할 수없는 경우?

답변

3

당신은 서블릿 스레드가 최대한 빨리 갈 수 있도록해야합니다. 귀하의 코드에서 서블릿 스레드에서 페이로드 처리를 수행하는 것보다 응답을 작성하는 경우. 요청을받은 직후에 페이로드를 구문 분석하여 데이터 저장소에 저장하고 비동기 처리 (작업 대기열을 통해)를 시작하고 HttpServletResponse.SC_OK 상태를 설정 한 다음 doPost에서 반환해야합니다. 데이터 저장소를 사용하여 페이로드를 저장하는 경우 모든 페이로드가 아닌 데이터 저장소 레코드 ID 만 작업에 넣을 수 있으므로 작업 크기 제한에 도달하지 않습니다.

+0

데이터 저장소 대신 google-storage를 사용할 수 있습니까? 저장 프로세스가 60 초 이내에 완료됩니까? – dina

+0

도 내가 docs에서 알기에 - 요청 처리기에는 요청에 대한 응답을 생성하고 반환하는 시간이 제한되어 있습니다 (일반적으로 약 60 초). 그래서 위의 코드에서 회신하지 않고 계속할 수 있습니까? 와트는 약 60 초 동안 제한됩니까? 응답 회신에 대해? 또는 afterword 처리? – dina

+0

1. 원하는 경우 Cloud Datastore 대신 Cloud Storage를 사용해 볼 수 있습니다. 2. 위의 코드에서 회신을 작성하고 그 후에 서블릿 스레드를 계속 사용합니다. 따라서 60 초의 시간 제한이'doSomethingWithPayload' 호출에 적용됩니다. –

관련 문제