我们的下载托管在 Google Cloud Storage 上。一段时间以来,我们一直在按需创建签名 URL(当用户单击下载按钮时),然后将用户重定向到该 URL。
这段代码已经投入生产好几个月了,但最近我们注意到有一个竞争条件:有时 URL 还没有准备好。在此之前,尝试访问签名的 URL 会导致403: Forbidden
.
我们试图通过发送 HEAD 请求来轮询 URL 是否准备好,寻找 200 响应来缓解这种情况。这似乎是一个很好的解决方案,直到我们意识到偶尔存在第三种状态:URL 已创建,但尚未准备好。我们的 HEAD 收到了200 Success
包含以下 XML 文档的响应:
<Error>
<Code>SignatureDoesNotMatch</Code>
<Message>
The request signature we calculated does not match the signature
you provided. Check your Google secret key and signing method.
</Message>
<StringToSign>
GET 1469137341 /our-bucket-name/path/to/file.exe?
response-content-disposition%3dattachment%3b+filename%3dfile.exe
</StringToSign>
</Error>
该 URL 将在几秒钟后变为可用。有关创建签名 URL 的文档没有讨论它没有立即准备好的可能性。
我的问题:您应该如何确定新创建的签名 URL 何时可以使用?
编辑
几个月来,我们实际上一直在使用 URL 生成代码(并且运行良好)。直到最近两周,我们才注意到我们使用了备用机制(即 URL 尚未准备好)。这几乎就像谷歌在上个月更改了代码,在 URL 准备好时引入了延迟。直到现在,比赛条件甚至都不明显。