java - Appengine 后端停止处理来自推送队列的任务
问题描述
自过去 1 个月以来,我们开始面临 AppEngine 后端随机停止处理任何作业的问题。我见过的最接近的其他 Q 是this和this,但没有任何用处。我的推送队列配置是
<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>
注意,为了解决这个问题,我尝试了以下但无济于事:
- 将 java 从 7 更新到 8 - 没有用
- 从早期的 B1 更改为 B4 - (认为这可能是内存问题,但日志中没有任何内容) - 没用
- 将队列处理速率更改为低至 15/m,存储桶大小为 15。
- 将 max-instances 从之前的 1 更改为 2,希望如果至少一个实例挂起,另一个应该能够处理,但无济于事。我注意到(今天)当这个问题发生时,第二个实例只有 2 个请求(另一个有 1400+),但是新实例没有从队列中提取剩余的任务。ETA 的任务不断增加。
- 将 Java Appengine sdk 从早期的 1.9.57 更新到最新的 1.9.63
行为:一段时间后(现在几乎每天一次),后端将停止响应,并且此队列中的任务将保持原样。继续的唯一方法是从控制台中终止后端实例,然后新实例开始处理任务。这些任务是获取数据的简单 http 调用。队列通常随时都有 1 个任务到 15-20 个任务。注意到即使低至 3-4,它有时也会停止。
日志根本不显示任何内容,没有滚动。只有当后端实例被删除时,日志才会显示 /task 已通过控制台终止。没有内存不足,没有崩溃,没有 404。
我无法添加更多图像,但这里是Utilization、Memory Usage和最近的内存使用情况,之后我删除了实例并恢复了任务。
这次和最近的其他经历动摇了我对 Google App Engine 的信心。我究竟做错了什么?(这个带有队列配置的精确 B1 后端设置已经工作了很多年!)
解决方案
推荐阅读
- python - 在 matplotlib 插图中调整轴标签和轴边界之间的间距
- python - 不要将鼠标悬停在元素上并单击(python selenium)
- java - Java中的随机for循环?
- node.js - 在 docker 容器中运行 npm install 时,Docker 节点服务返回 ECONNRESET 网络错误
- django - 如何为用户登录编写测试用例
- php - PHP 7.4+ 中的“在初始化之前不能访问类型属性”错误
- db2 - 使用 Db2 在 select 语句中调用存储过程
- azure - 无法使用 ansible 加密 Azure 存储帐户
- reactjs - 为什么我的代码在 useEffect() 之外使用时会运行两次?
- java - 使用 OWL API 提取本体命名空间/前缀