Docker环境下RabbitMQ消费者执行返回undefined错误排查求助
Docker环境下RabbitMQ消费者执行返回undefined错误排查求助
各位大佬好,我遇到一个很棘手的问题:本地运行Node.js服务时一切正常,但用Docker部署后,RabbitMQ的消费者函数在服务启动阶段就自动执行了,还返回了undefined错误,本地完全没这个情况,实在搞不懂哪里出问题了,想请大家帮忙排查下。
先给大家贴一下相关代码:
1. 入口文件 index.ts
import express from 'express'; import cors from 'cors'; import mongoose from 'mongoose'; import messageController from './controller/messagecontroller'; import router from './routes/messageRouter'; import dotenv from 'dotenv'; import {Server, Socket} from 'socket.io' dotenv.config() const app = express() app.use(cors()); app.use(express.json()); // 这里调用了消费者相关的函数 messageController.userSave() app.use(router); const mongoUrl: string | undefined = process.env.MONGO_URL if (!mongoUrl) { console.error('MongoDB connection URL is not defined.'); process.exit(1); } mongoose.connect(mongoUrl).then(()=>{ console.log('database connected..'); }) .catch((err)=>{ console.log("Database connection error", err); }) const server = app.listen('8004', () => { console.log("messaging service listening on PORT 8004"); })
2. 控制器中的 userSave 方法
async userSave() { try { const userData: any = await userMessageConsumers.userCreatedMessageConsumer() const newUser = new UserModel({ _id: userData._id, username: userData.username, phone: userData.phone, email: userData.email, profilePicture: userData.profilePicture, createdAt: userData.createdAt, updatedAt: userData.updatedAt, status: userData.status, }) await newUser.save() return } catch (error) { console.log(error); } },
3. RabbitMQ消费者函数 userCreatedMessageConsumer
async userCreatedMessageConsumer(){ try{ console.log("starting rabbit mq channel "); const channel = await RabbitMQ.createChannel(); const exchangeName = 'user-message-exchange'; const queueName = 'user-message-exchange'; await channel.assertExchange(exchangeName, 'direct', {durable: false}); const {queue} = await channel.assertQueue(queueName, {durable: false}); const routingKey = 'user-message-created'; await channel.bindQueue(queue ,exchangeName, routingKey); return new Promise((resolve ,reject)=>{ channel.consume(queue, (message: any)=>{ if(message){ try { const createdGig: any = JSON.parse(message.content.toString()); channel.ack(message); resolve(createdGig) } catch (error) { console.error("error processing gig creation"); channel.ack(message); reject(error) } } }) }) // 注意这里:return Promise之后的代码永远不会执行 await channel.close() }catch(err){ console.error("error setting up consumer", err) } },
我自己梳理的几个疑点,想请教大家:
- 本地和Docker环境的RabbitMQ连接配置是否有差异?比如Docker里的服务名、端口映射有没有问题?
- 消费者函数里,返回Promise之后的
await channel.close()根本不会执行,会不会导致Docker环境下连接泄漏或者状态异常? - 服务启动时就调用
messageController.userSave(),这时候MongoDB可能还没连接完成(因为mongoose.connect是异步的),会不会在Docker里因为启动顺序问题,导致保存用户时出错? - 消费者函数如果没有捕获到消息,会不会一直挂着导致返回undefined?本地可能因为消息队列里有缓存的消息,而Docker里是新环境没有消息?
有没有大佬遇到过类似的Docker+RabbitMQ的问题,麻烦给点思路,谢谢!
备注:内容来源于stack exchange,提问作者aswanth6000
相关产品推荐
相关产品推荐

