流数据时出现以下错误:
Google.ApisGoogle.Apis.Requests.RequestError
Internal Error [500]
Errors [
Message[Internal Error] Location[ - ] Reason[internalError] Domain[global]
]
我的代码:
public bool InsertAll(BigqueryService s, String datasetId, String tableId, List<TableDataInsertAllRequest.RowsData> data)
{
try
{
TabledataResource t = s.Tabledata;
TableDataInsertAllRequest req = new TableDataInsertAllRequest()
{
Kind = "bigquery#tableDataInsertAllRequest",
Rows = data
};
TableDataInsertAllResponse response = t.InsertAll(req, projectId, datasetId, tableId).Execute();
if (response.InsertErrors != null)
{
return true;
}
}
catch (Exception e)
{
throw e;
}
return false;
}
我一直在不断地传输数据,而且每天都有很多次错误。我该如何解决这个问题?
答案 0 :(得分:4)
我们看到了几个问题:
对于所有这些,我们在付费Google Enterprise支持中打开了案例,但不幸的是他们没有解决它。接缝建议的选项是指数 - 退避并重试,甚至是支持告知这样做。此外,故障率符合我们在SLA中99.9%的正常运行时间,因此没有理由反对。
关于SLA需要注意的事项,它是一个非常严格定义的结构,细节是here。 99.9%的正常运行时间未直接转换为失败率。这意味着如果BQ在一个月内有30分钟的停机时间,然后在该时间段内进行10,000次插入但在该月的其他时间没有进行任何插入,则会导致数字被串联。这就是我们建议指数退避算法的原因。 SLA明确地基于正常运行时间而不是错误率,但从逻辑上讲,如果您在不同时间使用退避重试设置在整个月中进行流式插入,则两者之间会密切相关。从技术上讲,如果你已经设置了适当的重试机制,那么如果你在月内进行插入,你应该平均经历大约1/1000次失败的插入。
您可以查看有关项目运行状况的此图表: https://console.developers.google.com/project/YOUR-APP-ID/apiui/apiview/bigquery?tabId=usage&duration=P1D
关于时代。由于流媒体的有效载荷大小有限,请参阅Quota policy它更容易谈论时间,因为有效载荷以同样的方式限制在我们两个人身上,但我也会提到其他副作用。
我们为每个流媒体请求测量1200-2500毫秒,这在过去的一个月中是一致的,如图所示。
您选择的方法如果花费数小时就意味着it does not scale
,并且不会缩放。您需要重新考虑可以重试的async processes
方法。
后台处理IO绑定或cpu绑定任务现在是大多数Web应用程序中的常见做法。有大量软件可以帮助构建后台作业,其中一些基于Beanstalkd等消息传递系统。
基本上,您需要在封闭网络中分配插入作业,确定优先级,然后使用(运行)它们。嗯,这正是Beanstalkd所提供的。
Beanstalkd提供了在管中组织作业的可能性,每个管对应于作业类型。
你需要一个可以将作业放在管上的API /生产者,让我们说这行的json表示。这是我们用例的杀手级功能。所以我们有一个获取行的API,并将它们放在管上,这只需要几毫秒,因此您可以实现快速响应时间。
另一方面,你现在在一些管子上有一堆工作。你需要一个代理人。代理人/消费者可以预约工作。
它还可以帮助您进行作业管理和重试:成功处理作业后,消费者可以从管中删除作业。在失败的情况下,消费者可以埋葬这份工作。这项工作不会被推回管中,但可供进一步检查。
消费者可以释放一份工作,Beanstalkd会将这项工作推回管中,并将其提供给其他客户。
可以在大多数常见语言中找到Beanstalkd客户端,web interface可用于调试。