Отправьте HTTP-запрос в точное время в будущем с помощью Nodejs

#node.js #http #sockets #https

Вопрос:

Мне нужно сделать http-запрос POST с точной отметкой времени в будущем, как можно более точным, вплоть до миллисекунд. Но есть и задержка в сети. Как я могу достичь такой цели?

setTimeout здесь недостаточно, потому что это всегда занимает некоторое время, что приводит к задержке запроса из-за задержки в сети. И выполнение этого запроса до целевой отметки времени может привести к раннему поступлению запроса.

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

Комментарии:

1. 1. Измерьте задержку 2. Дождитесь (exactMoment — задержка), запустите запрос. 3. ???? 4. Прибыль!

2. Звучит хорошо. Но как я могу поддерживать связь между измерением задержки и основным запросом? Там должен быть какой-нибудь пинпонг, верно?

3. Дело в том, что нет никакого способа сделать это, если у вас нет каких — то гарантий-все это только догадки. Для правильной работы вам потребуется: * Выделенное сетевое соединение со стабильной задержкой * Жесткая система реального времени на другом конце, в конце концов, нет никакой гарантии, что сервер начнет обрабатывать ваш запрос. Что, если у всех та же идея, что и у вас, придет подходящее время, и сервер будет переполнен запросами? Вы отправили запрос вовремя, но он все равно может быть доставлен с опозданием. В любом случае, вам, вероятно, понадобится постоянное соединение и «пинг».

Ответ №1:

Лучшее, что вы можете сделать в nodejs (который не является системой реального времени),-это сделать следующее:

  1. Предварительно измерьте ожидаемую задержку, чтобы знать, сколько времени потребуется для отправки запроса.
  2. Используйте setTimeout() для планирования отправки точно в однонаправленное время задержки до вашего целевого времени. В nodejs нет другого механизма, который был бы более точным.
  3. Если ваш запрос связан с поиском DNS, вы можете предварительно выбрать TCP-адрес для своего имени хоста и сократить время поиска DNS из цикла запроса или, по крайней мере, запустить локальный кэш DNS.
  4. Создайте специальную программу nodejs, которая больше ничего не делает — так что ее цикл событий не будет делать ничего другого во время setTimeout() выполнения. При желании вы можете запустить это как дочерний процесс из своей более крупной программы.
  5. Выполните ряд тестов, чтобы увидеть, как работает синхронизация, и, если вы постоянно отстаете на некоторое время, затем отрегулируйте смещение задержки.
  6. Вы можете разработать регулярный тест на задержку, чтобы определить, изменяется ли задержка со временем.

Как уже говорили другие, невозможно предсказать, каким будет естественное время отклика целевого сервера (сколько времени потребуется, чтобы начать обработку вашего запроса с момента поступления ваших сетевых пакетов). Если множество входящих запросов выполняется в один и тот же временной интервал, то ваш запрос будет чередоваться со всеми остальными и обслуживаться в определенном порядке, который вы не контролируете.

Другие вещи, которые вы можете рассмотреть. Если целевой сервер поддерживает последние спецификации http, то у вас может быть предварительно установленное http-соединение с хостом (возможно, предназначенное для какой-либо другой конечной точки), которое будет поддерживаться для отправки запроса точного времени. Это потребует некоторых экспериментов, чтобы выяснить, что поддерживает целевой хост и сработает ли это.