обработка асинхронных задач javascript - PullRequest
0 голосов
/ 24 декабря 2018

Я новичок в разработке 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 секунд, пока первый завершится, а затем другой завершится.

Я не могу понять, возможно ли обрабатывать оба запроса одновременно, без длинного процесса, блокирующего короткий процесс, пока он не завершится..

1 Ответ

0 голосов
/ 24 декабря 2018

Я не могу комментировать, так как у меня недостаточно репутации SO, но я постараюсь предоставить как можно больше информации.

Предполагая, что sleep это этот npm пакет этотожидается поведение, так называемое blocking поведение.Если вы планируете делать неблокирующие вызовы (например, веб-запросы) внутри вашей функции потребления, у вас все будет в порядке, и узел сможет получать дополнительные сообщения при обработке.Однако, если вам нужно выполнить тяжелую работу по блокировке / процессору и все еще иметь возможность обрабатывать входящие сообщения, вам нужно будет переложить эту работу на какого-то работника.

Попробуйте вместо этого этот код, он будет "спать" без блокировки:

setTimeout(() => {
    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);
}, 10000);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...