Перейти к основному содержимому

Эта страница никогда не обращается к сервису напрямую. Каждая кнопка отправляет запрос в SvelteKit, сервер которого вызывает сервис runtime-lab — отдельный процесс на Rust в собственном контейнере — с ключом доступа, которого браузер не видит. Все значения ниже измерены на этом вызове.

browser → +page.server.ts → client.ts → runtime-lab (Rust, отдельный контейнер)

Цели

Цель — место, где работает сервис: она настроена на сервере и выбирается здесь только по имени, никогда по URL. Пока вы не нажмёте «Проверить», ничего не вызывается.

Локальный контейнер

Не настроена

Сервис в собственном контейнере Podman рядом с dev-сервером.

Удалённый хост

Настроена

Тот же образ на бесплатном хостинге, доступный по HTTPS. Бесплатные хосты засыпают при простое; первый вызов может занять около минуты.

Вычисление

Отправьте заготовленный заказ в движок правил. Страница передаёт только имя заготовки; тело запроса формирует сервер. Отказ — это ответ движка, а не ошибка.

Учебные сбои

Бюджет времени запроса уже исчерпан. Клиент не начинает работу, которую не успеет закончить, — ничего не отправляется.

Отправляет корректно оформленный, но неверный bearer-ключ. Сервис сам отклоняет его с кодом 401.

Отправляет заказ с недопустимыми значениями в обход проверок клиента. Сервис проверяет его повторно и отвечает 400.

Этот сеанс

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

Вызовов пока нет.

Граница

  • Один контракт: типы Rust порождают openapi.json, из которого генерируются типы TypeScript, по которым проверяет клиент сервиса. Изменение на любой стороне ломает тест раньше, чем запрос.
  • Сервис сам проверяет свой bearer-ключ и без него не запускается. Ключ хранится только в серверной конфигурации и никогда не попадает на эту страницу, в журнал или в сообщение об ошибке.
  • Цели зафиксированы на сервере; эта страница только называет их и не может указать на что-то другое. Нет ни прокси, ни CORS — браузер никогда не обращается к сервису.
  • У каждого вызова есть срок и ограниченный по размеру ответ, и он завершается ровно одним итогом. Повторяются только идемпотентные вызовы — один раз и только если ответ не пришёл.
  • Сервис необязателен: от него зависит только эта страница. Остановите его — эта страница сообщит, что он недоступен, а остальной сайт продолжит работать.
  • Один и тот же образ контейнера работает локально в Podman и на бесплатном хостинге — меняются только порт и ключ доступа.

Думаете, этот паттерн можно сделать лучше? Расскажите как.

Оставить отзыв