如何在 Node js 中跨文件或控制器共享一个基于 promise 的 RabbitMQ 连接,而不是每次都创建一个新的连接?
How to share a single promise based RabbitMQ connection across files or controllers in Node js instead of creating a new Connection each time?
amqplib
库允许您创建一个 rabbitmq
连接,该对象将成为执行其他操作(例如创建频道等)的转折点。
假设我要使用 Producer/Consumer
模式,每次用户点击特定路线时,都会生成一个作业并发送到 rabbitmq 服务器,由某些消费者(工人)处理。
app.post("/routethatdelegatesheavywork", async (req,res) => {
const amqpServerLink =
"link-to-cloudmq";
const connection = await amqp.connect(amqpServerLink);
const channel = await connection.createChannel();
//do other stuff with channel
})
虽然这“有效”,但我不想在每次调用控制器时都重新创建该连接,因为它会使生产者变得非常慢,而且它确实不是应该如何完成的。
这是我的问题所在:
如何初始化一个连接并在每次需要时重新使用它?
我曾尝试在控制器外部创建一个连接并在必要时使用它,但这是不可能的,因为该连接是基于承诺的,并且 await 在入口点上不起作用,它必须在 async
功能正常工作。
尽管可以使用 ESM
(es 模块)运行 不异步等待,但我不想这样做,因为我已经使用 CommonJS
编写了所有应用程序(require("package")
),更改它需要我查看大量文件并根据 ESM 更改每个 import/export。
那么,有没有其他方法可以创建一个连接(基于承诺)并重新使用它而无需迁移到 ESM 语法?
是的,记住 nodejs 中的 require 是单例。制作一个新的 amqpServerInterface 模块,然后做
const amqpServerLink = "link-to-cloudmq"
const connection = amqp.connect(amqpServerLink)
function connect() {
return connection
}
module.exports = {
connect
}
然后在你的控制器中
const amqpServerInterface = require('amqpServerInterface')
app.post("/routethatdelegatesheavywork", async (req,res) => {
const connection = await amqpServerInterface.connect();
const channel = await connection.createChannel();
//do other stuff with channel
})
这将始终return相同的连接承诺并将解析为保存连接。
amqplib
库允许您创建一个 rabbitmq
连接,该对象将成为执行其他操作(例如创建频道等)的转折点。
假设我要使用 Producer/Consumer
模式,每次用户点击特定路线时,都会生成一个作业并发送到 rabbitmq 服务器,由某些消费者(工人)处理。
app.post("/routethatdelegatesheavywork", async (req,res) => {
const amqpServerLink =
"link-to-cloudmq";
const connection = await amqp.connect(amqpServerLink);
const channel = await connection.createChannel();
//do other stuff with channel
})
虽然这“有效”,但我不想在每次调用控制器时都重新创建该连接,因为它会使生产者变得非常慢,而且它确实不是应该如何完成的。
这是我的问题所在:
如何初始化一个连接并在每次需要时重新使用它?
我曾尝试在控制器外部创建一个连接并在必要时使用它,但这是不可能的,因为该连接是基于承诺的,并且 await 在入口点上不起作用,它必须在 async
功能正常工作。
尽管可以使用 ESM
(es 模块)运行 不异步等待,但我不想这样做,因为我已经使用 CommonJS
编写了所有应用程序(require("package")
),更改它需要我查看大量文件并根据 ESM 更改每个 import/export。
那么,有没有其他方法可以创建一个连接(基于承诺)并重新使用它而无需迁移到 ESM 语法?
是的,记住 nodejs 中的 require 是单例。制作一个新的 amqpServerInterface 模块,然后做
const amqpServerLink = "link-to-cloudmq"
const connection = amqp.connect(amqpServerLink)
function connect() {
return connection
}
module.exports = {
connect
}
然后在你的控制器中
const amqpServerInterface = require('amqpServerInterface')
app.post("/routethatdelegatesheavywork", async (req,res) => {
const connection = await amqpServerInterface.connect();
const channel = await connection.createChannel();
//do other stuff with channel
})
这将始终return相同的连接承诺并将解析为保存连接。