sandbox/ivideon/puml/geo/get_video_node.puml
2026-02-13 17:36:23 +03:00

135 lines
4.3 KiB
Text
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@startuml geo_balancing_sequence
title Получение пути до камеры через Geo (пример: Analytics запрашивает стрим)
actor "Сервис Аналитики" as analytics
participant "geo-backend\n(handlers.py)" as geo_handler
participant "GeoResolver\nClient" as resolver
participant "geo-resolver" as geo_resolver
database "place_cache\ngroup_cache" as cache
participant "balancing.py" as balancing
participant "auth.py" as auth
participant "auth-server" as auth_server
participant "billing.py" as billing
database "MongoDB" as mongo
participant "Выбранная\nНода" as node
== Запрос стрима ==
analytics -> geo_handler: GET /flv?server=UIN&camera=CAM_ID&access_token=TOKEN
note right
Параметры запроса:
• server: UIN видеосервера
• camera: ID камеры
• access_token: токен доступа
• format: flv/hls/ws-fmp4
end note
geo_handler -> geo_handler: Извлечь IP клиента\nиз запроса
activate geo_handler
== Определение геолокации ==
geo_handler -> resolver: resolve(client_ip)
activate resolver
resolver -> geo_resolver: HTTP GET /resolve?ip=CLIENT_IP
activate geo_resolver
geo_resolver -> geo_resolver: Проверить кэш
geo_resolver -> geo_resolver: Запросить у Geo Providers\n(IP-API, MaxMind)
geo_resolver --> resolver: IPLocation(\n country_code="RU",\n region_iso="MOW",\n city="Москва",\n coordinates=[55.75, 37.61]\n)
deactivate geo_resolver
resolver --> geo_handler: IPLocation
deactivate resolver
== Поиск оптимальной ноды ==
geo_handler -> cache: Получить группу для локации
activate cache
cache --> geo_handler: geo_group_id
deactivate cache
geo_handler -> balancing: select_server(\n partner_id,\n geo_group,\n pattern="streaming"\n)
activate balancing
balancing -> cache: node_for_pattern(\n partner_id,\n geo_group,\n "streaming"\n)
activate cache
cache -> cache: Выбор по весам\nи доступности
cache --> balancing: selected_node_id
deactivate cache
alt Нода не найдена
balancing -> balancing: select_fallback_pattern()
balancing -> cache: Повторный поиск с fallback
cache --> balancing: fallback_node_id
end
balancing --> geo_handler: BalancingResponse(\n node_id,\n node_host\n)
deactivate balancing
== Авторизация ==
geo_handler -> auth: authorize_token(\n token,\n rights="view",\n object_type="camera",\n object_id=CAM_ID\n)
activate auth
auth -> auth_server: POST /authorize
activate auth_server
auth_server -> mongo: Проверить права\nпользователя
activate mongo
mongo --> auth_server: user_rights
deactivate mongo
auth_server --> auth: {\n owner_type: "user",\n owner_id: "USER_ID"\n}
deactivate auth_server
auth --> geo_handler: token_info
deactivate auth
== Проверка биллинга ==
geo_handler -> billing: check_limits(user_id, camera_id)
activate billing
billing -> mongo: Получить тариф\nи лимиты
activate mongo
mongo --> billing: tariff_info
deactivate mongo
billing --> geo_handler: limits_ok
deactivate billing
== Получение данных о сервере ==
geo_handler -> mongo: Получить информацию\nо сервере и камере
activate mongo
mongo --> geo_handler: {\n server: {dc, online, cameras},\n camera: {online, streams}\n}
deactivate mongo
== Формирование редиректа ==
geo_handler -> geo_handler: Сформировать URL редиректа:\n• Схема (http/https/wss)\n• Хост выбранной ноды\n• Параметры (server, camera, token)\n• Подпись запроса
geo_handler --> analytics: HTTP 302 Redirect\nLocation: https://node-moscow-1.ivideon.com/flv?server=UIN&camera=CAM_ID
deactivate geo_handler
== Подключение к ноде ==
analytics -> node: GET /flv?server=UIN&camera=CAM_ID&sig=...
activate node
node --> analytics: FLV Stream (видеопоток)
deactivate node
note over analytics, node
После редиректа сервис аналитики
получает прямое подключение к ноде,
географически близкой к нему
end note
@enduml