BigQuery streaming 'insertAll' performance with PHP


BigQuery streaming 'insertAll' performance with PHP

我们正在使用google-api-php-client库将大量服务器端数据流式传输到BigQuery中。除了性能之外,流媒体工作得很好。

我们的负载测试给了我们1000ms(1秒)的平均时间来将一行流到BigQuery。我们不能让客户端等待超过200ms。我们用更小的有效载荷进行了测试时间保持不变。客户端异步调用对我们来说不是一个选项。

"瓶颈"代码行是:

$service->tabledata->insertAll(PROJECT_NUMBER, DATA_SET, TABLE, $request);

查看了库的底层,插入行调用只是一个cURL请求(库中的cURL .php)。

是否有任何方法来修改insertAll(),使其更快?我们不关心结果,所以立即走人对我们来说是可行的。我们已经尝试在底层的cCURL请求中设置CURLOPT_CONNECTTIMEOUT_MS和CURLOPT_TIMEOUT_MS,但它不起作用。

阅读你所有的评论和旁注。您选择的方法不能扩展,也不会扩展。您需要重新考虑使用异步进程的方法。

处理后台IO绑定或cpu绑定任务现在是大多数web应用程序的常见做法。有很多软件可以帮助创建后台任务,其中一些基于beanstald等消息传递系统。

基本上,您需要在封闭的网络中分发插入作业,确定它们的优先级,并使用(运行)它们。好吧,这正是Beanstalkd提供的。

Beanstalkd提供了在管道中组织作业的可能性,每个管道对应于一个作业类型。

你需要一个API/生产者,它可以把作业放到一个管道上,比如行的json表示。这是我们用例的杀手级特性。所以我们有一个API来获取行,并将它们放在管上,这只需要几毫秒,所以你可以实现快速响应时间。

另一方面,你现在在一些管道上有一堆工作。你需要一个经纪人。代理/消费者可以预定一个作业。

它还有助于作业管理和重试:当作业被成功处理时,使用者可以从管道中删除该作业。在失败的情况下,消费者可以埋葬工作。这项工作将不会被推回管道,但将可供进一步检查。

消费者可以释放一个作业,beanstald将把这个作业推回到管道中,并使它可供另一个客户端使用。

beanstald客户端可以在大多数常见语言中找到,web界面可以用于调试。