C# 流式处理数据时出现Bigquery内部错误

C# 流式处理数据时出现Bigquery内部错误,c#,google-bigquery,C#,Google Bigquery,流式传输数据时出现以下错误: 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 table

流式传输数据时出现以下错误:

 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;
}
public bool InsertAll(BigqueryService s、字符串datasetId、字符串tableId、列表数据)
{
尝试
{
TabledataResource t=s.Tabledata;
TableDataInsertAllRequest req=新的TableDataInsertAllRequest()
{
Kind=“bigquery#tableDataInsertAllRequest”,
行=数据
};
TableDataInsertAllResponse=t.InsertAll(req,projectId,datasetId,tableId).Execute();
if(response.InsertErrors!=null)
{  
返回true;
}
}
捕获(例外e)
{
投掷e;
}
返回false;
}

我不断地流式传输数据,每天有很多次我都会出现这种错误。如何解决此问题?

我们发现了几个问题:

  • 请求随机失败,类型为“后端错误”
  • 请求随机失败,类型为“连接错误”
  • 请求随机失败,类型为“timeout”(注意这里,因为只有一些行失败,而不是整个负载)
  • 其他一些错误消息是非描述性的,它们非常模糊,对您没有帮助,请重试
  • 我们每天都会看到数百个这样的失败,因此它们几乎是固定不变的,与云健康无关
对于所有这些,我们在付费的谷歌企业支持中打开了案例,但不幸的是,他们没有解决这个问题。建议采用的选项是通过重试进行指数退避,即使支持人员被告知这样做。此外,故障率符合SLA中99.9%的正常运行时间,因此没有理由反对

关于SLA,需要记住一些东西,它是一个非常严格定义的结构,细节如下。99.9%的正常运行时间不能直接转化为故障率。这意味着,如果BQ在一个月内有30分钟的停机时间,然后您在这段时间内插入了10000次,但在一个月的其他时间内没有插入任何内容,这将导致数字出现偏差。这就是为什么我们建议使用指数退避算法。SLA明确基于正常运行时间,而不是错误率,但如果您在一个月内的不同时间使用回退重试设置执行流式插入,则两者在逻辑上密切相关。从技术上讲,如果您已经设置了正确的重试机制,那么您在一个月内都在执行插入操作,那么您应该平均经历大约1/1000的插入失败

您可以查看以下有关项目运行状况的图表:


大约三次。由于流媒体的有效负载大小有限,所以更容易谈论时间,因为有效负载对我们两人都有相同的限制,但我还要提到其他副作用

我们对每个流式处理请求的测量值在1200-2500毫秒之间,正如您在图表中看到的,这在上个月是一致的


您选择的方法需要数小时,这意味着它不可伸缩,也不会伸缩。您需要重新考虑可以重试的
异步进程的方法

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

基本上,您需要在一个封闭的网络中分发插入作业,对它们进行优先级排序,并使用(运行)它们。这正是Beanstalkd提供的

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

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

另一方面,你现在在一些管子上有很多工作。你需要一个代理人。代理/消费者可以预订工作

它还可以帮助您进行作业管理和重试:成功处理作业后,使用者可以从管道中删除作业。在失败的情况下,消费者可以埋葬工作。此作业不会被推回管道,但可供进一步检查

消费者可以释放作业,Beanstalkd会将此作业推回到试管中,并使其可供其他客户端使用


Beanstalkd客户端可以在大多数常见语言中找到,a对于调试非常有用。

我们发现了几个问题:

  • 请求随机失败,类型为“后端错误”
  • 请求随机失败,类型为“连接错误”
  • 请求随机失败,类型为“timeout”(注意这里,因为只有一些行失败,而不是整个负载)
  • 其他一些错误消息是非描述性的,它们非常模糊,对您没有帮助,请重试
  • 我们每天都会看到数百个这样的失败,因此它们几乎是固定不变的,与云健康无关
对于所有这些,我们在付费的谷歌企业支持中打开了案例,但不幸的是,他们没有解决这个问题。建议采用的选项是通过重试进行指数退避,即使支持人员被告知这样做。此外,故障率符合SLA中99.9%的正常运行时间,因此没有理由反对

关于SLA,需要记住一些东西,它是一个非常严格定义的结构,细节如下。99.9%的正常运行时间不能直接转化为故障率。这意味着,如果BQ在一个月内有30分钟的停机时间,然后您在这段时间内插入了10000次,但在一个月的其他时间内没有插入任何内容,这将导致数字出现偏差。这就是为什么我们建议使用指数退避算法。SLA明确基于正常运行时间,而不是错误率,但如果您执行流式插入thr,则两者在逻辑上密切相关