基于Google Cloud Run、FastAPI与Meta WhatsApp API的响应问题求助
单服务解决方案
针对你的问题,以下是几个无需开启Cloud Run「始终运行」、也不用拆分微服务的单服务层面可行方案:
方案1:调整Cloud Run闲置超时 + FastAPI BackgroundTasks
- 核心逻辑:让Cloud Run实例在LLM任务处理期间保持活跃,任务完成后自动进入闲置状态并关闭
- 操作步骤:
- 在Cloud Run控制台,将实例闲置超时时间设置为你的LLM任务最长处理时长(Cloud Run支持最长15分钟闲置超时,可根据实际需求调整)
- 继续使用FastAPI的
BackgroundTasks处理LLM逻辑,收到WhatsApp消息后立即返回200状态码 - 注意:单实例场景下完全适配;若服务需扩缩容为多实例,内存型任务队列可能导致任务丢失,此时可优先考虑其他方案
方案2:后台任务保活机制
- 核心逻辑:通过内部保活请求,让Cloud Run判定实例始终有活跃请求,直到LLM任务完成
- 操作步骤:
- 在FastAPI服务中添加一个简单的健康检查端点:
from fastapi import FastAPI import aiohttp import asyncio app = FastAPI() @app.get("/health") async def health_check(): return {"status": "ok"} - 在LLM处理的后台任务中,启动一个异步保活子任务,每隔30秒发送一次GET请求到
/health端点:async def keep_alive(): async with aiohttp.ClientSession() as session: while True: await session.get("http://localhost:8080/health") await asyncio.sleep(30) - 当LLM任务完成后,立即终止保活子任务,实例会在闲置超时后自动关闭
- 在FastAPI服务中添加一个简单的健康检查端点:
- 优势:无需调整Cloud Run全局配置,适配多实例场景
方案3:单服务集成Pub/Sub队列
- 核心逻辑:用Pub/Sub做异步任务队列,但不拆分服务,实现消息接收与LLM处理的解耦
- 操作步骤:
- 在Google Cloud控制台创建一个Pub/Sub主题和订阅
- 在FastAPI服务的
lifespan事件中启动异步订阅者,持续拉取队列任务并处理LLM逻辑 - 收到WhatsApp消息后,立即返回200状态码,同时将任务参数(如用户ID、消息内容)发布到Pub/Sub主题
- 订阅者拉取到任务后,调用LLM生成回复,再通过WhatsApp Cloud API发送给用户
- 优势:即使Cloud Run实例返回200后关闭,后续有新任务时会自动启动实例处理,任务不会丢失;仅在处理任务时实例运行,成本可控
内容的提问来源于stack exchange,提问作者millsy
相关产品推荐
相关产品推荐

