sandbox/ivideon/puml/analytics/camera_worker_stream.puml
2026-02-10 09:44:09 +03:00

70 lines
2.5 KiB
Text
Raw 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
title Взаимосвязь Camera -> Stream -> Worker -> VAP
actor "Система управления\nаналитикой" as System
participant "Camera #42\n(у входа)" as Camera42
participant "Camera #77\n(у кассы)" as Camera77
queue "Video Proxy" as Proxy
participant "Worker_1\n(process)" as Worker1
participant "Worker_2\n(process)" as Worker2
participant "VAP Instance\n(в Worker_1)" as VAP1
participant "VAP Instance\n(в Worker_2)" as VAP2
database "Configs" as Configs
== Инициализация потоков ==
System -> Worker1: Запустить обработку\nstream_id=42
activate Worker1
Worker1 -> VAP1: vap.init_stream(\n stream_id=42,\n lines=[{"y": 100}]\n)
activate VAP1
VAP1 -> Configs: Сохранить config_42.yaml\n(линия подсчёта y=100)
note right: Конфигурация привязана\nк камере #42, не к Worker_1!
System -> Worker2: Запустить обработку\nstream_id=77
activate Worker2
Worker2 -> VAP2: vap.init_stream(\n stream_id=77,\n zones=[{"x": 50, "y": 200}]\n)
activate VAP2
VAP2 -> Configs: Сохранить config_77.yaml\n(зона у кассы)
== Обработка видеопотоков ==
Camera42 -> Proxy: Видеопоток (stream_id=42)
Camera77 -> Proxy: Видеопоток (stream_id=77)
loop Каждый кадр
Proxy -> Worker1: frame + stream_id=42
Worker1 -> VAP1: vap.process_frame(frame)
VAP1 -> VAP1: Task(stream_id=42, frame_id=N, ...)
VAP1 --> Worker1: events
Worker1 --> System: События от камеры #42
end
loop Каждый кадр
Proxy -> Worker2: frame + stream_id=77
Worker2 -> VAP2: vap.process_frame(frame)
VAP2 -> VAP2: Task(stream_id=77, frame_id=M, ...)
VAP2 --> Worker2: events
Worker2 --> System: События от камеры #77
end
== Worker_1 упал! ==
Worker1 -> Worker1: ❌ CRASH
deactivate VAP1
deactivate Worker1
System -> Worker2: Перенести обработку\nstream_id=42 на Worker_2
Worker2 -> VAP2: vap2 = new VAP()
activate VAP2
Worker2 -> VAP2: vap2.init_stream(\n stream_id=42,\n lines=[{"y": 100}]\n)
VAP2 -> Configs: Загрузить config_42.yaml
note right: ТА ЖЕ конфигурация!\nstream_id=42 не изменился,\nизменился только Worker
loop Обработка продолжается
Proxy -> Worker2: frame + stream_id=42
Worker2 -> VAP2: vap2.process_frame(frame)
VAP2 --> Worker2: events
Worker2 --> System: События от камеры #42
end
@enduml