【发布时间】:2015-05-03 06:21:01
【问题描述】:
我收到大量跨实例和 Servlet 线程的 HTTP 遥测请求,但数量不定。我想以 500 条记录的块向 BigQuery 插入所有数据以最大限度地减少请求,因此我将请求中的数据缓存在并发队列中,并在队列达到 500 时发送数据。我还使用 PushQueues 写入 BigQuery,以便客户端请求不承担这个时间。
我成功使用了 ArrayBlockingQueue,但有一个例外:我找不到刷新队列的方法。场景是请求流量停止。我设置了一个 cron.xml 以每 10 分钟左右发送一条刷新消息以获取最后的消息,但当然 cron 请求仅由一个实例处理,所以如果我有 10 个实例,我可能有 9 x 499记录卡住了。我真的需要一种方法来将此消息传递给所有实例。
我也尝试使用 MemCache,但共享队列所需的互斥标志意味着这将无法扩展。
我也尝试过 Datastore,但这有点愚蠢。非常慢,非常昂贵。
我选择了 appengine,因此它可以在不同负载期间自动扩展,从而节省成本和管理,但我真的找不到解决这个问题的方法。
【问题讨论】:
-
如果您知道某个实例的 ID,如果您是该应用的管理员,您可以通过 instance-dot-version-dot-module-dot-app-id.appspot.com 联系它。 (如果您没有明确使用模块,
module将被命名为default)。不幸的是,我不知道列出当前实例的通用 API;我相信(不是 100% 肯定)通过手动缩放它们会是 1、2、... 向上,但这没有记录,所以可能会改变。我建议打开 API 或gcloud preview app命令的功能请求以列出当前活动的(实例、版本、模块)三元组。 -
在不知道您尝试如何使用它的情况下,您发现 Datastore 速度慢的原因是什么?您是否无法将数据推送到拉取队列并从那里通过一个或多个 cron 作业将其导出到 BQ?您可能会发现 this article/video 相关。
-
@Alex 谢谢。我认为使用 MemCache 和 init 注册每个实例可能是可行的,但不幸的是,该寻址方案无法使用自动缩放,只有 manual and basic
-
@tx802 拉取队列对我没有吸引力,因为它们不自动缩放,但它们需要进一步检查。我误用 Datastore 作为暂存缓存。感谢您的精彩视频。
-
@tx802 拉取队列运行良好。感谢您的指点。如果您愿意,请将其作为答案,我会标记为已回答。
标签: java google-app-engine servlets google-bigquery