简而言之,我们有时会看到少量的Cloud Bigtable查询重复失败(连续10次甚至100次),错误为rpc error: code = 13 desc = "server closed the stream without sending trailers"
,直到(通常)查询最终有效。< / p>
详细说明,我们的设置如下:
我们正在Google Compute Engine上运行Go服务的集合(&lt; 10)。来自一对PULL任务队列的每个服务leases tasks。每个任务都包含一个bigtable行的ID。任务处理程序执行以下查询:
row, err := tbl.ReadRow(ctx, <my-row-id>,
bigtable.RowFilter(bigtable.ChainFilters(
bigtable.FamilyFilter(<my-column-family>),
bigtable.LatestNFilter(1))))
如果查询失败,则任务处理程序只返回。由于我们以10到15分钟的租约时间租赁任务,不久之后租约将在该任务上到期,它将再次租赁,我们将重试。这些任务的最大重试次数为1000次,因此可以在很长一段时间内重试多次。在少数情况下,特定任务将因上面的grpc错误而失败。任务通常会失败,每次运行数小时或数天同样的错误,之前(看似突然出现)最终成功(或任务耗尽重试并死亡)。< / p>
由于这通常需要很长时间,因此似乎与服务器负载无关。例如,现在在星期天早上,这些服务器的负载非常轻,但是当我拖尾日志时,我看到了很多这些错误。从this answer,我原本以为这可能是由于尝试查询大量数据,可能接近云bigtable支持的最大限制。但是我现在看到情况并非如此;我可以找到许多示例,其中多次失败的任务最终成功并且仅报告少量数据(例如,<1 MB)。 我还应该在这看什么? 编辑:从进一步测试我现在知道这完全是机器(客户端)独立的。如果我在其中一个任务租赁机器上拖尾,请等待“服务器关闭流而不发送预告片”错误,然后尝试一次性ReadRow
查询来自另一个的相同rowId,无关,完全未使用的机器,我反复得到相同的错误。
答案 0 :(得分:2)
此错误通常是由您的回复中包含more than 256MB of data引起的。
但是,我们的服务器端错误处理代码中存在一个错误,该错误允许HTTP/2预告片中的某些无效字符,这是规范不允许的。这意味着某些包含无效字符的错误消息将被视为此类错误。这应该在明年初修复。