узел и экспресс. Вернуться к пользователю и продолжить выполнение

Я привык принимать запрос пользователей, обрабатывать его и отвечать на результат.

Однако у меня есть конечная точка API, в которой есть около 10 вещей, которые должны происходить с различными базами данных, ведением журнала, электронной почтой и т. д. Все асинхронно. Только первый вызов базы данных должен быть успешным, чтобы пользователь получил ответ. Остальные могут продолжать.

Проблема в том, что весь процесс может занять 10/20 секунд, поэтому пользователь ждет 10/20 секунд, когда ему нужен ответ только после первого запроса к БД (около 100 мс).

мне в принципе нужно

  • Пользователь делает запрос
  • происходит асинхронный вызов БД
  • Если это не удается, он выдает пользователю ошибку, но если это удается, он отвечает успехом.
  • пользователь может продолжать делать то, что ему нужно, но сервер продолжает выполнять несколько других вызовов БД.

Я использую асинхронное ожидание для всех асинхронных вызовов и выражаю их как свою веб-инфраструктуру.


person KittenKiller    schedule 27.03.2018    source источник
comment
Можете ли вы опубликовать свой код?   -  person Dipak    schedule 27.03.2018
comment
Итак, что вы пробовали?   -  person briosheje    schedule 27.03.2018
comment
Без кода трудно сказать, но если вы используете «ожидание», каждая строка будет ждать предыдущей, прежде чем она будет выполнена, если вы просто вызовете асинхронную функцию без «ожидания», она будет выполняться асинхронно.   -  person Michael Curry    schedule 27.03.2018
comment
Насколько я помню, вы можете вернуть ответ и продолжить работу над запросом. Но будет лучше, если вы либо сломаете конечную точку, либо введете очередь или планировщик, который сделает остальные 9 вещей. Одно из значений отправки ответа в конце всех задач состоит в том, чтобы убедиться, что все завершено или что-то сломалось на определенном этапе. Но если вы уберете это из запроса, вы можете оказаться в несогласованном состоянии. Если вы вводите очередь или планировщик, вы можете использовать механизм повторных попыток или другие действия по обработке ошибок, которые вы не можете сделать, если будете использовать свой подход.   -  person lovubuntu    schedule 27.03.2018


Ответы (1)


поскольку вы заявили: «Только первый вызов базы данных должен быть успешным, чтобы пользователь получил ответ. Остальные могут продолжаться». я думаю, вы уже получили то, что вам нужно, поэтому, скажем, вы используете асинхронное ожидание, давайте сделаем это следующим образом:

async function requestHandler(req){
    await result = firstDatabaseRequestThatIsImportant();
    setOfAsyncFunctions(result);
    return result;
}

async function setOfAsyncFunctions(result){
    asyncFunction1(?????)
    asyncFunction2(?????)
}

Поэтому в основном не используйте await для setOfAsyncFunctions, чтобы эта функция выполнялась в другом потоке, и вы могли сразу вернуть результат пользователю. Может быть, это поможет вам с вашими формулировками проблемы?

person Hans Yulian    schedule 27.03.2018