为什么Google App Engine上运行的流程会挂起?

Avi*_*tal 5 java cron google-app-engine task-queue google-cloud-sql

我们有一个cron作业,它在后端模块上每小时运行一次并创建任务.cron作业在Cloud SQL数据库上运行查询,并且任务对其他服务器进行HTTP调用并更新数据库.通常它们运行得很好,即使创建了数千个任务,但有时它会"卡住",并且日志中没有任何内容可以解释这种情况.例如,昨天我们监控了cron作业,同时它创建了几十个任务,然后停止了,还有8个任务也被卡在了队列中.当很明显没有发生任何事情时,我们再多次运行该过程并且每次都成功完成.

一天之后,原始任务被DeadlineExceededException杀死,然后显然在同一实例中运行的其他8个任务被以下消息杀死:处理此请求的进程遇到问题,导致它退出.这可能会导致新进程用于您的应用程序的下一个请求.如果经常看到此消息,则可能会在应用程序初始化期间抛出异常.(错误代码104)

在进程被杀死之前,我们在日志中看不到它们的记录,现在我们看到它们在DeadlineExceededException之前没有日志记录,所以我们不知道它们在什么时候被卡住了.我们怀疑数据库中存在一些锁定,但我们在以下链接中看到查询有10分钟的限制,因此这会导致进程在一天之内发生故障:https://cloud.google. COM/AppEngine上/文档/ JAVA /云的SQL /#Java_Size_and_access_limits

我们模块的类和扩展配置是:

<instance-class>B4</instance-class>
<basic-scaling>
    <max-instances>11</max-instances>
    <idle-timeout>10m</idle-timeout>
</basic-scaling>
Run Code Online (Sandbox Code Playgroud)

队列的配置是:

<rate>5/s</rate>
<max-concurrent-requests>100</max-concurrent-requests>
<mode>push</mode>
<retry-parameters>
    <task-retry-limit>5</task-retry-limit>
    <min-backoff-seconds>10</min-backoff-seconds>
    <max-backoff-seconds>200</max-backoff-seconds>
</retry-parameters>
Run Code Online (Sandbox Code Playgroud)

我上传了一些cron作业的跟踪数据图片:http: //imgur.com/a/H5wGG.这包括跟踪摘要以及时间轴的开始/结束.8个已终止的任务没有跟踪数据.

可能是什么原因以及我们如何进一步调查?

Avi*_*tal 2

我们最终通过以下步骤解决了这个问题:

  1. 我们将该模块分为两个 - 一个模块用于运行 cron 作业,一个模块用于处理生成的任务。这让我们看到问题出在处理任务上,因为这是唯一一直卡住的模块。
  2. 我们将并发任务的数量限制为 2,这似乎是系统可以同时处理而不卡住的最大任务数量。