【发布时间】:2016-08-28 23:24:29
【问题描述】:
我们有一个应用程序从用户那里获取一些输入并进行大约 50 次 RPC 调用。每次通话大约需要 4-5 分钟。
在后端,我们使用推送队列并将这 50 个调用中的每一个都作为任务排入队列。这是我们的队列规范:
queue:
- name: some-name
rate: 500/s
bucket_size: 100
max_concurrent_requests: 500
我的理解是所有 50 个请求都应该并行运行,因此它们应该在 4-5 分钟内完成。但实际发生的情况是,这些请求中只有大约 15 个正在返回结果,而其余请求则超过了 10 分钟的限制并超时。另一件需要注意的事情是,如果我们将请求数减少到
总是有可能请求超时,因为 RPC 响应实际上花了那么长时间。但我想确认的是:
- 我对并行运行的任务的理解是正确的。
- 我们的队列配置和我们排队的任务数量与这些请求超时无关。 这些正确吗?
【问题讨论】:
-
这取决于为该队列服务的模块的
.yaml配置。threadsafe和缩放配置是什么?换句话说:一个实例可以并行执行多少个任务,并行运行多少个实例? -
@DanCornilescu 我们将线程安全设置为 true,但我们没有明确指定任何缩放配置。我认为这会导致基本扩展,并且从文档看来基本扩展还可以在需要时提供按需实例。
-
自动缩放是默认的。但是启动实例可能需要一段时间,您的队列配置需要能够缓冲任务,直到实例开始服务。检查是否在任务高峰发生时根据需要启动了额外的实例,并检查在任务高峰发生时实例已经在运行时是否仍然存在问题。
-
@DanCornilescu 实例确实启动了,但可能没有我们希望的那么快。您认为我们应该进行手动扩展并始终运行 10-15 个实例吗?
-
除非你有 100 个空闲实例,否则我会大幅减少 bucket_size,以便让应用引擎有机会启动实例。现在的配置方式是您尝试在单个(或少数)实例上运行 100 个任务,但大多数任务都失败了,因为现有实例无法处理负载。一旦一些任务通过测量延迟拉动,将导致应用引擎启动更多实例。您应该尝试减少影响少数实例的并行任务的数量。注意应用引擎的扩展方式,您可以并行执行更多操作。
标签: google-app-engine scalability task-queue