Spring Boot应用部署到Google Cloud后Pub/Sub订阅者被立即移除问题求助
问题根因
- 订阅者被自动移除的核心原因:你的应用部署在Google Cloud Run上,Cloud Run默认是请求驱动的无服务运行环境,默认开启自动缩容策略,当实例没有收到HTTP请求时,会在设定的空闲超时后自动销毁实例。销毁过程会触发Spring Boot的优雅关闭钩子,执行所有Bean的销毁逻辑,自然会停掉Pub/Sub入站适配器,移除对应的订阅者。你的日志中明确出现了
ionShutdownHook线程执行的记录,也验证了是实例被主动销毁导致的问题。 - 替换依赖后启动失败的原因:版本不兼容。
org.springframework.cloud:spring-cloud-gcp:1.2.8.RELEASE最高仅支持Spring Boot 2.3.x,和你使用的Spring Boot 2.5.5存在大量类版本冲突,导致应用启动失败无法监听指定端口,所以Cloud Run抛出端口监听失败的错误。
解决方案
方案1:调整Cloud Run配置(最便捷)
如果要继续使用Cloud Run部署Pub/Sub订阅应用,可根据业务场景二选一:
- 若要保留拉模式订阅的实现:关闭自动缩容到0的特性,设置最小实例数为1,同时延长空闲超时时间最长可到3600秒。注意该配置会产生持续的实例运行费用。
- 改用Pub/Sub推送模式:修改Pub/Sub订阅为推送类型,推送端点设置为你的Cloud Run服务的HTTP接口,该模式符合Cloud Run请求驱动的特性,空闲时可以正常缩容到0,有消息时自动拉起实例处理,不用自己维护长连接的订阅者逻辑。
方案2:更换适配长驻应用的部署方式
如果你的应用核心逻辑就是处理Pub/Sub消息,对外HTTP接口很少,建议改用更适合长驻进程的部署载体:
- Google Compute Engine(GCE)虚拟机,长期运行实例
- Google Kubernetes Engine(GKE),设置Deployment的最小副本数为1
- Cloud Functions,直接对接Pub/Sub触发事件,无需自己维护订阅者实现
方案3:修复依赖版本
如果要保留拉模式订阅的代码实现,不要降级到旧版本org.springframework.cloud组下的依赖,保持原有com.google.cloud组下的2.0.4版本即可,该版本本身兼容Spring Boot 2.5.5,只要解决Cloud Run的缩容问题就能正常运行。
内容的提问来源于stack exchange,提问作者Miłosz
相关产品推荐
相关产品推荐

