我们使用google-api-php-client库将大量数据服务器端流式传输到BigQuery中。除了性能之外,流媒体工作得很好。
我们的负载测试为我们提供了将一行流入BigQuery的平均时间1000毫秒(1秒)。我们无法让客户等待超过200毫秒。我们使用较小的有效载荷进行了测试,时间保持不变。客户端的异步调用对我们来说不是一个选项。
&#39>瓶颈'代码行是:
$service->tabledata->insertAll(PROJECT_NUMBER, DATA_SET, TABLE, $request);
在库的引擎盖下,插入行的调用只是一个cURL请求(Curl.php in the library)。
有没有办法修改insertAll()以使其更快?我们不关心结果,所以一场“忘不了”对我们有用。我们尝试在底层cCURL请求中设置CURLOPT_CONNECTTIMEOUT_MS和CURLOPT_TIMEOUT_MS,但它不起作用。
答案 0 :(得分:3)
阅读所有评论和旁注。您选择的方法不会扩展,也不会扩展。您需要使用异步进程重新考虑该方法。
后台处理IO绑定或cpu绑定任务现在是大多数Web应用程序中的常见做法。有大量软件可以帮助构建后台作业,其中一些基于Beanstalkd等消息传递系统。
基本上,您需要在封闭网络中分配插入作业,确定优先级,然后使用(运行)它们。嗯,这正是Beanstalkd所提供的。
Beanstalkd提供了在管中组织作业的可能性,每个管对应于作业类型。
你需要一个可以将作业放在管上的API /生产者,让我们说这行的json表示。这是我们用例的杀手级功能。所以我们有一个获取行的API,并将它们放在管上,这只需要几毫秒,因此您可以实现快速响应时间。
另一方面,你现在在一些管子上有一堆工作。你需要一个代理人。代理人/消费者可以预约工作。
它还可以帮助您进行作业管理和重试:成功处理作业后,消费者可以从管中删除作业。在失败的情况下,消费者可以埋葬这份工作。这项工作不会被推回管中,但可供进一步检查。
消费者可以释放一份工作,Beanstalkd会将这项工作推回管中,并将其提供给其他客户。
可以在大多数常见语言中找到Beanstalkd客户端,web interface可用于调试。