@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