首页 > 解决方案 > Appengine 后端停止处理来自推送队列的任务

问题描述

自过去 1 个月以来,我们开始面临 AppEngine 后端随机停止处理任何作业的问题。我见过的最接近的其他 Q 是thisthis,但没有任何用处。我的推送队列配置是

<queue>
  <name>MyFetcherQueue</name>
  <target>mybackend</target>
  <rate>30/m</rate>
  <max-concurrent-requests>1</max-concurrent-requests>
  <bucket-size>30</bucket-size>
  <retry-parameters>
    <task-retry-limit>10</task-retry-limit>
    <min-backoff-seconds>10</min-backoff-seconds>
    <max-backoff-seconds>200</max-backoff-seconds>
    <max-doublings>2</max-doublings>
  </retry-parameters>
</queue>

具有多个模块的标准 Java App Engine,其中一个是具有基本缩放功能的后端,B4。

<runtime>java8</runtime>
<threadsafe>true</threadsafe>
<instance-class>B4</instance-class>
<basic-scaling>
  <max-instances>2</max-instances>
</basic-scaling>

注意,为了解决这个问题,我尝试了以下但无济于事:

  1. 将 java 从 7 更新到 8 - 没有用
  2. 从早期的 B1 更改为 B4 - (认为这可能是内存问题,但日志中没有任何内容) - 没用
  3. 将队列处理速率更改为低至 15/m,存储桶大小为 15。
  4. 将 max-instances 从之前的 1 更改为 2,希望如果至少一个实例挂起,另一个应该能够处理,但无济于事。我注意到(今天)当这个问题发生时,第二个实例只有 2 个请求(另一个有 1400+),但是新实例没有从队列中提取剩余的任务。ETA 的任务不断增加。
  5. 将 Java Appengine sdk 从早期的 1.9.57 更新到最新的 1.9.63

行为:一段时间后(现在几乎每天一次),后端将停止响应,并且此队列中的任务将保持原样。继续的唯一方法是从控制台中终止后端实例,然后新实例开始处理任务。这些任务是获取数据的简单 http 调用。队列通常随时都有 1 个任务到 15-20 个任务。注意到即使低至 3-4,它有时也会停止。

日志根本不显示任何内容,没有滚动。只有当后端实例被删除时,日志才会显示 /task 已通过控制台终止。没有内存不足,没有崩溃,没有 404。

我捕获的早期日志和屏幕截图: 按类型请求 交通

我无法添加更多图像,但这里是UtilizationMemory Usage最近的内存使用情况,之后我删除了实例并恢复了任务。

这次和最近的其他经历动摇了我对 Google App Engine 的信心。我究竟做错了什么?(这个带有队列配置的精确 B1 后端设置已经工作了很多年!)

标签: javagoogle-app-engine

解决方案


推荐阅读