在我们模块的负载测试过程中,我们发现bigquery插入调用需要花费3-4秒的时间。我不确定这是不是可以。我们使用java biguqery客户端库,平均每个api调用推送500条记录。我们期望每秒有一百万条记录传输到我们的模块,因此bigquery插入是处理这种流量的瓶颈。目前推送数据需要几个小时。如果我们需要更多关于代码或场景的信息,请让我知道。
感谢Pankaj
发布于 2014-11-19 15:46:16
由于流媒体有一个有限的有效载荷大小,请参见Quota policy它更容易谈论时间,因为有效载荷对我们两个人都是有限的,但我也会提到其他的副作用。
我们为每个流请求测量1200-2500毫秒,这在上个月是一致的,如您在图表中所见。

虽然我们看到了几个副作用:
对于所有这些,我们在付费谷歌企业支持中打开了案例,但不幸的是,他们没有解决这个问题。看来,对于这些问题,推荐的选项是指数回退和重试,即使是被告知要这样做的支持也是如此。对我个人来说这并不让我开心。
您选择的方法需要几个小时,这意味着it does not scale,并且不能扩展。您需要重新考虑使用async processes的方法。为了更快地完成,你需要并行运行多个工作进程,流性能将是相同的。只要有10个工作人员并行,这意味着时间将减少10倍。
在后台处理IO受限或cpu受限的任务现在是大多数web应用程序中的一种常见做法。有很多软件可以帮助构建后台作业,其中一些是基于像Beanstalkd这样的消息系统。
基本上,您需要在封闭的网络中分发插入作业,确定它们的优先级,并使用(运行)它们。这正是Beanstalkd提供的功能。
Beanstalkd提供了在管中组织作业的可能性,每个管对应于一种作业类型。
您需要一个API/producer,它可以将作业放在管道上,比如说行的json表示。对于我们的用例来说,这是一个杀手级的特性。因此,我们有一个API来获取行,并将它们放在tube上,这只需要几毫秒,所以您可以实现快速响应时间。
另一方面,你现在在一些管道上有一堆工作。你需要一个经纪人。代理/消费者可以保留一个工作。
它还可以帮助您进行作业管理和重试:当作业成功处理时,使用者可以从管中删除该作业。在失败的情况下,消费者可以隐藏工作。这项工作将不会被推回管子,但将可用于进一步检查。
消费者可以释放一个作业,Beanstalkd将把这个作业推回到管道中,并使其可供另一个客户端使用。
Beanstalkd客户端可以在大多数常见语言中找到,web interface对于调试很有用。
https://stackoverflow.com/questions/27009118
复制相似问题