Я новичок в разработке Node.У меня возникли проблемы с пониманием асинхронной природы JS и Node.Я создаю серверный веб-сервер микросервисов, использующий Express в службе шлюза, которая переводит запросы REST в серии сообщений, опубликованных с использованием модуля асинхронного обмена сообщениями RabbitMQ (amqplib), на который, в свою очередь, могут подписаться другие службы, обработать запрос и затем ответить.
Мой сервис, который обрабатывает асинхронный запрос от шлюза, выглядит следующим образом:
amqp.connect('amqp://172.17.0.2', function(err, conn) {
console.log("connection created");
conn.createChannel(function(err, ch) {
console.log("channel created");
var exchange = 'main';
ch.assertExchange(exchange, 'topic', {durable: true});
ch.assertQueue('', {exclusive: true}, function(err, q) {
console.log(' [*] Waiting for logs. To exit press CTRL+C');
ch.bindQueue(q.queue, exchange, "VENUE_TOPIC.PENDING_STATUS.*.*");
ch.consume(q.queue, function(msg) {
console.log(" [x] %s:'%s'", msg.fields.routingKey, msg.content.toString());
var pending_event = JSON.parse(msg.content.toString())
console.log(pending_event.payload.id == 2)
console.log(pending_event.payload.id)
if (pending_event.payload.id == 1) {
var venue = getVenueByID(pending_event.payload.id);
const approved_event = new Event("VENUE_TOPIC", "APPROVED_STATUS", false, "READ_METHOD", {"venue":venue});
var key = approved_event.getMetaAsTopics();
var msg = Buffer.from(JSON.stringify(approved_event.getEventAsJSON()));
ch.assertExchange(exchange, 'topic', {durable: true});
ch.publish(exchange, key, msg, {persistent: true});
console.log(" [x] Sent '%s'", msg);
} else if (pending_event.payload.id == 2) {
sleep(10000); //this function checks the OS's clock to count time in ms
var venue = getVenueByID(pending_event.payload.id);
const approved_event = new Event("VENUE_TOPIC", "APPROVED_STATUS", false, "READ_METHOD", {"venue":venue});
var key = approved_event.getMetaAsTopics();
var msg = Buffer.from(JSON.stringify(approved_event.getEventAsJSON()));
ch.assertExchange(exchange, 'topic', {durable: true});
ch.publish(exchange, key, msg, {persistent: true});
console.log(" [x] Sent '%s'", msg);
}
}, {noAck: true});
});
});
});
Допустим, у меня есть 2 запроса, один из которых занимает много времени, а другой - короче.Более длинный запрос приходит раньше, чем более короткий.В моем примере длинным процессом является ID === 2, а коротким процессом - ID === 1.
Теперь, если я отправлю запрос, где ID равен 2, а затем сразу же отправлю запрос, где ID равен 1Мне нужно подождать 10 секунд, пока первый завершится, а затем другой завершится.
Я не могу понять, возможно ли обрабатывать оба запроса одновременно, без длинного процесса, блокирующего короткий процесс, пока он не завершится..