我在AWS Amplify上运行NextJS。我有一个API调用,需要一段时间,所以我流它代替。在本地工作得很好,但当推送到AWS Amplify时,流媒体无法工作,并且超过了30秒的超时。
请问我能做什么?
前端:
try {
setLoading(true);
setAnswer('');
const res = await fetch(`/api/test?question=${question}`);
if (res.ok) {
// https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/getReader
const reader = res?.body?.getReader();
const processStream = async () => {
while(true) {
const {done, value} = await reader?.read() || {};
if (!value) {
setLoading(false);
break;
}
if(done) {
setLoading(false);
break;
}
let chunk = new TextDecoder('utf-8').decode(value)
chunk = chunk.replace(/^data: /, '');
setAnswer((prev) => prev + chunk);
}
}
processStream().catch(err => console.log('--stream error--', err))
} else {
setAnswer("Sorry, there was an error fetching your answer. Please try again later.");
}
} catch (error) {
console.error("Error fetching answer:", error);
setAnswer("Sorry, there was an error fetching your answer. Please try again later.");
}
谢谢你
1条答案
按热度按时间68de4m5k1#
您在使用AWS Amplify时遇到的问题可能是由于默认的API网关超时(设置为30秒)。当您的API调用时间超过30秒时,将导致超时。为了克服这个限制,你有几个选择:
**增加API网关超时设置:**您可以在AWS管理控制台中增加AWS Amplify API的超时设置。具体操作如下:打开AWS管理控制台。
导航到API网关服务。
找到您的API并转到“阶段”部分。
选择您的阶段(例如,“Prod”)。
增加超时设置。默认情况下,它设置为30秒,但您可以将其增加到适合您需要的值。
请记住,超时有一个最大限制,AWS对“Lambda Proxy”集成类型的最大限制为29秒。
**优化您的Lambda函数:**如果您的Lambda函数执行时间较长,且无法增加超时时间,请考虑优化您的函数以更快地执行。这可能涉及提高代码的效率,使用并行处理或其他技术来加速执行。
**使用AWS步骤函数:**如果您的操作是多步骤流程,并且无法进一步优化,请考虑使用AWS步骤函数。Step Functions允许您在工作流中协调和执行多个AWS服务。您可以配置Step Functions以等待长时间运行的进程完成并相应地处理响应。
**实施轮询机制:**如果您的操作可以分解为更小的任务,请考虑实施轮询机制。您的前端发送初始请求以启动操作并接收任务ID。然后,它会反复轮询后端以检查任务的状态。一旦任务完成,您就可以获取结果。这种方法可以在较短的超时情况下很好地工作。
**使用WebSockets:**对于需要实时更新的长时间运行的进程,请考虑实现WebSockets。使用WebSockets,服务器可以在长时间运行的进程进行时将更新推送到客户端。选择最适合您的应用需求和限制的方法。增加超时可能是最简单的解决方案,但其他选项可能为处理长时间运行的操作提供更大的灵活性和可伸缩性。