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

Data flows и топология

Ownership отвечает на вопрос кто несёт ответственность за ресурс и его смерть. Flow независимо отвечает кто с кем и как взаимодействует. Зависимость сервисов не должна притворяться владением только ради рисунка.

Ресурс объявляет своё исходящее ребро:

pgExporter := dockerlib.Container(ctx, agent, exporterSpec,
pipeline.WithFlowTo(pg, pipeline.TCP, "postgres", pipeline.FlowPort(5432)),
)

WithFlowTo указывает на handle другого ресурса. WithFlow может указывать на внешнюю endpoint-строку. Известные протоколы: TCP, HTTP, GRPC, PrometheusPull, RemoteWrite, OTLP; значение открыто, поэтому библиотека может назвать более специальный protocol. Port остаётся структурированным полем, label — человеческим описанием.

Flows описывают заявленное намерение, а не проверенный сетевой traffic. Они живут в state записи, сохраняются после передачи ресурса стенду и позволяют Studio рисовать текущую топологию. Системные virtual edges также показывают, как агент переносит commands, TTY sessions и telemetry через сервер.

Дверь зеркалит flows записи в visibility (search attribute EntityFlows, одно ключевое слово на ребро) вместе с её владельцем, поэтому каждая строка листинга или дерева несёт flows — и у живой записи, и у удалённой. Топология завершённого прогона читается из graphenectl tree run/<id> --flows или одного вызова Tree, хотя state его удалённых записей ушёл вместе с их воркером. Зеркало ограничено лимитом Temporal 2 КиБ на атрибут: 25–50 рёбер на запись; запись с большим числом хранит их все в state и не показывает в зеркале.

Resource flows не следует смешивать с межпайплайновыми control и data contracts: upstream trigger запускает другой пайплайн, artifact переносит durable bytes. Они могут быть видны рядом с топологией, но имеют собственную lifecycle-семантику.