70 lines
2.5 KiB
Text
70 lines
2.5 KiB
Text
@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
|