【问题标题】:App Engine >60 seconds backend processing?App Engine >60 秒后端处理?
【发布时间】:2016-12-21 21:58:03
【问题描述】:

我有一个接收 pubsub 消息的 appengine 应用。

我正在处理可能需要超过 60 秒的数据。

由于请求处理程序是limited 60 秒,我立即确认发布订阅,然后进行处理。

尽管这无济于事 - 我发送的消息会一次又一次地重试(我在记录器中看到),即使处理已完成。

这是我的代码:

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. 这是确认 pubsub 的正确方式吗?
  2. 确认后该过程是否需要超过 60 秒?
    • 如果是 - 为什么我的 pubsub 消息会一次又一次地重新发送?
    • 如果不是:我可以做些什么来解决 - 虽然我不能使用任务队列?

【问题讨论】:

    标签: java google-app-engine


    【解决方案1】:

    您需要让您的 servlet 线程尽快运行。在您的代码中,您编写响应而不是在 servlet 线程上进行有效负载处理。而是在收到请求后立即解析有效负载并将其存储到数据存储区,启动异步处理(通过任务队列),设置状态 HttpServletResponse.SC_OK 并从doPost 返回。如果您将使用数据存储来存储您的有效负载,您将不会达到任务大小限制,因为您将能够输入仅任务数据存储记录 ID,而不是所有有效负载。

    【讨论】:

    • 我可以使用 google-storage 代替数据存储吗?存储过程是否会少于 60 秒?
    • 也正如我从文档中了解到的那样 - 请求处理程序生成并返回对请求的响应的时间有限,通常约为 60 秒。所以我不能回复然后像上面的代码那样继续吗?这个 60 秒的限制是什么?关于响应回复?还是处理后记?
    • 1.如果您愿意,可以尝试使用 Cloud Storage 而不是 Cloud Datastore。 2. 在您上面的代码中,您正在编写回复并在此之后继续使用 servlet 线程。因此,在您的方法中,60 秒的时间限制适用于 doSomethingWithPayload 呼叫。
    • 3.要摆脱这个限制,您应该尽早从doPost 归还控制权。这就是为什么我建议在 servlet 线程上做最少的事情:解析有效负载,将其写入一些持久存储,将任务发布到队列以进行异步处理并从 doPost 返回。在我的方法中,doSomethingWithPayload 的长时间调用不会发生在 servlet 线程上,而是发生在队列工作线程上,因此您可以绕过 servlet 请求处理时间限制(60 秒)。
    • 请注意,如果您使用 App Engine 标准运行时,任务最多可以运行 10 分钟,或者在灵活运行时最多可以运行 24 小时 :)。
    猜你喜欢
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多