如何在将行传输到BigQuery时指定超时?

时间:2017-06-23 14:31:13

标签: php google-bigquery

基本上我想在系统的一个非常关键的部分将一些非关键数据流式传输到BigQuery。

我想指定一个大约2秒的最大超时时间,因为如果存在任何连接问题,或者如果BigQuery不可用(之前已发生过,尽管我不知道),我不希望将该进程阻塞太长时间期望它经常发生。)

我正在使用google/cloud库连接到BigQuery,我基本上使用的是此处的代码:https://cloud.google.com/bigquery/streaming-data-into-bigquery

use Google\Cloud\BigQuery\BigQueryClient;

/**
 * Stream a row of data into your BigQuery table
 * Example:
 * ```
 * $data = [
 *     "field1" => "value1",
 *     "field2" => "value2",
 * ];
 * stream_row($projectId, $datasetId, $tableId, $data);
 * ```.
 *
 * @param string $projectId The Google project ID.
 * @param string $datasetId The BigQuery dataset ID.
 * @param string $tableId   The BigQuery table ID.
 * @param string $data      An associative array representing a row of data.
 * @param string $insertId  An optional unique ID to guarantee data consistency.
 */
function stream_row($projectId, $datasetId, $tableId, $data, $insertId = null)
{
    // instantiate the bigquery table service
    $bigQuery = new BigQueryClient([
        'projectId' => $projectId,
    ]);
    $dataset = $bigQuery->dataset($datasetId);
    $table = $dataset->table($tableId);

    $insertResponse = $table->insertRows([
        ['insertId' => $insertId, 'data' => $data],
        // additional rows can go here
    ]);
    if ($insertResponse->isSuccessful()) {
        print('Data streamed into BigQuery successfully' . PHP_EOL);
    } else {
        foreach ($insertResponse->failedRows() as $row) {
            foreach ($row['errors'] as $error) {
                printf('%s: %s' . PHP_EOL, $error['reason'], $error['message']);
            }
        }
    }
}

我相信他们的库使用Guzzle作为http客户端,但我不知道如何传递我希望在设定的时间后发生超时。

2 个答案:

答案 0 :(得分:2)

我可以给你的最佳建议:不要从你不想阻止的流程直接流向BigQuery。在中间设置一个服务,可以处理超时和重试,同时保持主流程畅通无阻。

有些选择是:

您可以在3年前Shine发布的故事中看到一些架构原因:https://shinesolutions.com/2014/08/25/put-on-your-streaming-shoes/https://shinesolutions.com/2014/12/19/license-to-queue/

答案 1 :(得分:0)

起初我有点不清楚,但您可以使用httpOptions选项将选项传递给Guzzle http处理程序,包括超时。

在上面的代码段中,您可以修改$table->insertRows()语句:

$insertResponse = $table->insertRows([
    ['insertId' => $insertId, 'data' => $data],
    // additional rows can go here
], ['httpOptions' => ['timeout' => $timeoutInSeconds]]);

在那里,您可以指定此处列出的任何请求选项:http://docs.guzzlephp.org/en/stable/request-options.html

然而,菲利普的答案可能仍然是更好的建议。