- Описание
- Отправленные решения
29. Средняя сетевая задержка
В одном из сервисов организована древовидная структура бэкендов. Запросы в сервис обрабатываются следующим образом: в корневой бэкенд (назовем его balancer.test.yandex.ru
) поступает запрос, он формирует подзапросы в бэкенды-потомки (не более одного подзапроса в потомок), ожидает от них ответ, формирует свой ответ и отправляет его пользователю. Каждый из потомков обрабатывает подзапросы по той же схеме. На всех бэкендах регистрируются события следующей структуры:
datetime
— время наступления события;request_id
— id запроса;parent_request_id
— id родительского запроса (для корневого бэкендаNULL
);host
— имя бэкенда, на котором возникло событие;type
— тип события (список указан ниже);data
— описание события.
События бывают следующих типов:
RequestReceived
— на бэкенд поступил новый запрос (полеdata
пустое);RequestSent
— на бэкенд-потомок был отправлен подзапрос (в полеdata
записывается имя бэкенда-потомка);ResponseSent
— бэкенд отправил ответ родителю (data
пустое);ResponseReceived
— бэкенд получил ответ от потомка (в полеdata
записываются имя бэкенда-потомка и статус —OK
илиERROR
— , разделенные символом табуляции).
Все события собираются в одну таблицу. Очевидно, что на каждом бэкенде имеются сетевые издержки на пересылку запросов и ответов. Для одного запроса в корневой бэкенд считаем, что на них тратится сумма разниц datetime
между всеми соответствующими парами событий RequestSent
/RequestReceived
и ResponseSent
/ResponseReceived
, которые возникли при обработке запроса. Вам нужно посчитать эту величину, усредненную по запросам в корневой бэкенд.
Формат ввода
Используется БД postgresql 10.6.1 x64.
Система перед проверкой создает таблицу с событиями следующим запросом:
CREATE TABLE requests (
datetime TIMESTAMP,
request_id UUID,
parent_request_id UUID,
host TEXT,
type TEXT,
data TEXT
);
После таблица заполняется тестовыми данными.
Формат вывода
Напишите SELECT выражение, которое вернет таблицу из одной строки с колонкой avg_network_time_ms
типа numeric
, в которую будет записана средняя сетевая задержка в миллисекундах.
Внимание! Текст выражения подставится в систему как подзапрос, поэтому завершать выражение точкой с запятой не надо (в противном случае вы получите ошибку Presentation Error
).
Примечание
Для таблицы requests
с таким содержимым (здесь для компактности пишем числа вместо UUID'а и миллисекунды в datetime, в проверочной таблице будут UUID'ы и timestamp'ы):
datetime | request_id | parent_request_id | host | type | data |
---|---|---|---|---|---|
.000 | 0 | NULL | balancer.test.yandex.ru | RequestReceived | |
.100 | 0 | NULL | balancer.test.yandex.ru | RequestSent | backend1.ru |
.101 | 0 | NULL | balancer.test.yandex.ru | RequestSent | backend2.ru |
.150 | 1 | 0 | backend1.ru | RequestReceived | |
.200 | 2 | 0 | backend2.ru | RequestReceived | |
.155 | 1 | 0 | backend1.ru | RequestSent | backend3.ru |
.210 | 2 | 0 | backend2.ru | ResponseSent | |
.200 | 3 | 1 | backend3.ru | RequestReceived | |
.220 | 3 | 1 | backend3.ru | ResponseSent | |
.260 | 1 | 0 | backend1.ru | ResponseReceived | backend3.ru OK |
.300 | 1 | 0 | backend1.ru | ResponseSent | |
.310 | 0 | NULL | balancer.test.yandex.ru | ResponseReceived | backend1.ru OK |
.250 | 0 | NULL | balancer.test.yandex.ru | ResponseReceived | backend2.ru OK |
.400 | 0 | NULL | balancer.test.yandex.ru | ResponseSent | |
.500 | 4 | NULL | balancer.test.yandex.ru | RequestReceived | |
.505 | 4 | NULL | balancer.test.yandex.ru | RequestSent | backend1.ru |
.510 | 5 | 4 | backend1.ru | RequestReceived | |
.700 | 5 | 4 | backend1.ru | ResponseSent | |
.710 | 4 | NULL | balancer.test.yandex.ru | ResponseReceived | backend1.ru ERROR |
.715 | 4 | NULL | balancer.test.yandex.ru | ResponseSent |
запрос участника должен возвращать следующий результат:
avg_network_time_ms |
---|
149.5 |
Тут два корневых запроса. Выпишем времена, которые прошли между отправкой запроса/ответа и его получением.
Запрос с id
balancer.test.yandex.ru -> backend1.ru
— мс (от до )balancer.test.yandex.ru -> backend2.ru
— мс (от до )backend1.ru -> backend3.ru
— мс (от до )backend2.ru -> balancer.test.yandex.ru
— мс (от до )backend3.ru -> backend1.ru
— мс (от до )backend1.ru -> balancer.test.yandex.ru
— мс (от до )Суммарно это мс
Запрос с id
balancer.test.yandex.ru -> backend1.ru
— мс (от до )backend1.ru -> balancer.test.yandex.ru
— мс (от до )Суммарно это мс
Итого, ответ .
Ограничения
Ограничение времени
1 с
Ограничение памяти
64 МБ