如何向所有appengine实例发送请求

时间:2015-03-02 19:08:57

标签: java google-app-engine servlets google-bigquery

我在实例和Servlet线程中收到了大量但可变量的HTTP遥测请求。我想在500条记录的块中将AllAllAll插入BigQuery以最小化请求,因此我在并发队列中缓存请求中的数据,并在队列达到500时发送数据。我还使用PushQueues写入BigQuery以便客户端请求不承担此时间。

我成功使用了ArrayBlockingQueue,但有一个例外:我找不到刷新队列的方法。方案是请求流量停止。我设置了一个cron.xml来每10分钟左右发送一次刷新消息以获取最后的消息,但当然cron请求只由一个实例处理,所以如果我有10个实例,我可能有9 x 499记录卡住了。我真的需要一种方法来将此消息传递给所有实例。

我也尝试过使用MemCache,但共享队列所需的互斥锁标记意味着这不会扩展。

我也尝试过数据存储,但这有点蠢。非常慢,非常昂贵。

我选择了appengine,因此它可以在不同的负载下自动调节,节省成本和管理,但我真的看不到解决这个问题的方法。

1 个答案:

答案 0 :(得分:2)

我只是将您的数据推送到Pull Queue并使用cron作业从那里导出到BigQuery。作为一个细微的变化,您可以使用cron将15个推送队列任务分开排队,以实现更好的控制。您可能会发现this article/video相关。

在汇总大量更新时,拉队列对我们来说非常有效,但如果您以非常高的速率向队列添加任务,则可能需要对队列进行分片。 This article解释了原因。我们目前这样做,效果很好。