我们的目标是:
- 快速(<;10s)回复呼叫者,回复200以避免呼叫者重试.
- THEN在结束函数之前发出另外两个POST(对时间敏感)请求.
总而言之,处理这个问题的最佳解决方案是什么?我们已经看到:
- PubSub以使订阅者在发送200响应后异步完成POST请求.
- Enqueue Cloud Tasks添加到一个任务队列.我们不确定这些是否像我们在try 接近时看到的那样受到HTTPS termination的影响.
- 使用像Cloud Firestore这样的基于事件的触发器来写入具有某个id的文档,这将触发
onCreate
事件来完成POST请求.
其他相关细节是,我们现在有较小的流量作为一个较小的应用程序(远低于1000 QPS,这可能会排除Pub Sub),并希望在<;1-2秒内创建后台任务的目标仍然有一个良好的用户体验(消息应用程序).
最初,我们的代码如下:
exports.example = functions
.https
.onRequest(async (request, response) => {
const authHeader = request.get("authorization");
const {statusCode, httpsResponseMessage} =
verifyAuthHeader(authHeader, token);
// Send 200 response to our caller within 10 seconds to avoid more retries.
response.status(statusCode).send(
{
message: httpsResponseMessage,
}
);
// do other POST requests
}
我们还try 了:
exports.example = functions
.https
.onRequest(async (request, response) => {
const authHeader = request.get("authorization");
const {statusCode, httpsResponseMessage} =
verifyAuthHeader(authHeader, token);
// Send 200 response to our caller within 10 seconds to avoid more retries.
response.write(
JSON.stringify(
{
message: httpsResponseMessage
}
)
);
// do other POST requests
res.end()
}
但注意到我们的代码AFTER、response.status(statusCode).send()
的不可预测行为,如tips & tricks section of Firebase docs中所示,并且使用response.write
发送部分结果并不能避免调用者future 的重试.