Go项目API与RabbitMQ Worker共存异常,端口无法访问求助
问题分析与解决:Go API与RabbitMQ Worker无法协同工作
问题现象
基于Go的API项目同时运行RabbitMQ Worker进程时,Worker启动后API的3006端口无法访问,二者无法协同工作。
根本原因
查看main.go的执行流程:
func main() { start := app.App{} start.StartApp() start.StartWorker() // 同步调用,会永久阻塞主线程 start.Run(":3006") // 该行代码从未被执行 }
StartWorker方法内部调用了consumer.Listen(),而Listen方法最后通过<-forever语句永久阻塞当前goroutine,导致主线程卡在start.StartWorker(),后续启动HTTP服务器的start.Run(":3006")完全没有执行机会,因此API端口无法被访问。
解决方案
将StartWorker的调用放到goroutine中,让Worker在后台异步运行,主线程即可继续执行启动HTTP服务器的逻辑:
修改后的main.go
func main() { start := app.App{} start.StartApp() // 启动Worker到后台goroutine go func() { start.StartWorker() }() start.Run(":3006") }
额外注意事项
StartWorker中的defer connection.Close():由于Worker的goroutine会一直阻塞在Listen方法,这个defer语句不会被触发,RabbitMQ连接会保持正常,无需额外修改。- 优雅关闭:后续可在收到终止信号时,同时关闭Worker的RabbitMQ连接和HTTP服务器,保证资源正常释放。
内容的提问来源于stack exchange,提问作者King
相关产品推荐
相关产品推荐

