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




Вы можете установить 0-байтовый буфер отправки сокета (и я точно не рекомендую это), чтобы при блокирующем вызове HttpResponse.send () у вас было более точное представление о том, когда остался последний байт, но время в пути не учитывается. . Экк - меня тошнит даже от упоминания об этом. Вы можете сделать это в Tomcat с конкретными настройками коннектора. (Документация по Tomcat 6 Connector)
Или вы могли бы придумать какой-то подход с отметкой времени javascript, но я бы не ожидал установить часы клиента. Потребовалось бы сделать несколько обращений к веб-серверу.
И этот подход покроет задержку, хотя у вас все еще есть некоторая дисперсия джиттера.
Хммм ... интересная проблема у вас там. :)
Если вы хотите измерить его в своем браузере для имитации любого клиентского запроса, вы можете посмотреть вкладку net в firebug, чтобы узнать, сколько времени требуется для загрузки каждой части страницы и порядок загрузки.
Невозможно узнать, сколько времени клиенту пришлось ждать исключительно на стороне сервера. Вам понадобится JavaScript.
Вы не хотите синхронизировать часы клиента и сервера, это перебор. Просто измерьте время между тем, когда клиент делает запрос, и когда он заканчивает отображение своего ответа.
Если клиент AJAX, это может быть довольно просто: вызовите new Date (). GetTime (), чтобы получить время в миллисекундах, когда был сделан запрос, и сравнить его со временем после анализа результата. Затем отправьте эту информацию о времени на сервер в фоновом режиме.
Для приложения, отличного от AJAX, когда пользователь щелкает запрос, используйте JavaScript, чтобы отправить текущую метку времени (с точки зрения клиента) на сервер вместе с запросом и передать ту же метку времени обратно клиенту, когда полученная страница перезагружается. В обработчике onLoad этой страницы измерьте общее прошедшее время, а затем отправьте его обратно на сервер - либо используя XmlHttpRequest, либо добавив дополнительный аргумент к следующему запросу, сделанному серверу.
Вы можете обернуть объект HttpServletResponse и OutputStream, возвращаемый HttpServletResponse. Когда вывод начинает писать, вы можете установить startDate, а когда он останавливается (или когда он сбрасывается и т. д.), Вы можете установить stopDate.
Это можно использовать для расчета времени, которое потребовалось для потоковой передачи всех данных обратно клиенту.
Мы используем его в нашем приложении, и цифры кажутся разумными.
изменить: вы можете установить дату начала в ServletFilter, чтобы получить продолжительность ожидания клиента. Я дал вам время, необходимое для записи вывода клиенту.
но это не учитывает буфер сокета и задержку, о которой упоминает OP :(
это выглядит многообещающе, я попробую.
просто попробовал это, и это не сработало. кажется, что байты в выходной поток записываются задолго до того, как они покидают физическую машину.
Ознакомьтесь с Jiffy-web, разработанным netflix, чтобы дать им более точное представление об общей странице -> время рендеринга страницы.
У меня такая же проблема. Но этот Бумага JavaOne мне очень помог решить эту проблему. Я бы попросил вас пройти через это, и он в основном использует javascript для расчета времени.
Проблема с этим подходом в том, что его нельзя прозрачно добавить к существующей реализации, отличной от ajax. будет сложно добавить дополнительный параметр даты к каждому сделанному запросу, но этот метод звучит так, как будто он действительно измеряет время весь, необходимое для перехода от клиент-сервер-клиент.