HardТеория27 min

ArchiMate

Enterprise Architecture моделирование: слои, элементы, viewpoints и связь бизнеса с технологиями

Что такое ArchiMate

ArchiMate -- стандарт The Open Group для моделирования enterprise-архитектуры. Описывает бизнес, приложения и инфраструктуру в единой модели. Позволяет видеть связь между бизнес-целями и технической реализацией.

Зачем нужен ArchiMate

Проблема Как решает ArchiMate
Бизнес не понимает IT-затраты Показывает связь бизнес-процессов и систем
IT не понимает приоритеты бизнеса Визуализирует влияние на бизнес-цели
Нет общей картины enterprise Единая модель всех слоёв
Сложно оценить impact изменений Impact analysis через связи элементов
Дублирование систем Видимость всех систем и их функций

Когда использовать ArchiMate

Ситуация Подходит
Enterprise Architecture (EA) Да -- основное назначение
Планирование IT-трансформации Да
Связь бизнес-целей и IT-систем Да
Impact analysis при изменениях Да
Архитектура одного приложения Нет (используй C4)
Дизайн кода/классов Нет (используй UML)
Бизнес-процесс в деталях Нет (используй BPMN)

Три основных слоя

ArchiMate организует enterprise в три слоя, каждый со своими элементами:

┌─────────────────────────────────────────────────────┐
│                 Strategy Layer                       │
│  Resource, Capability, Value Stream, Course of Action│
├─────────────────────────────────────────────────────┤
│                 Business Layer                       │
│  Actor, Role, Process, Service, Event, Object        │
├─────────────────────────────────────────────────────┤
│               Application Layer                      │
│  Component, Interface, Function, Service, Data Object│
├─────────────────────────────────────────────────────┤
│               Technology Layer                       │
│  Node, Device, System Software, Artifact, Network    │
├─────────────────────────────────────────────────────┤
│              Implementation & Migration              │
│  Work Package, Deliverable, Plateau, Gap             │
└─────────────────────────────────────────────────────┘

Business Layer

Описывает бизнес-процессы, участников и сервисы, предоставляемые организацией.

Элемент Описание Пример
Business Actor Участник (организация, человек) Клиент, Поставщик
Business Role Роль, выполняемая актором Менеджер продаж, Бухгалтер
Business Process Бизнес-процесс Обработка заказа, Найм сотрудника
Business Service Сервис для внешних потребителей Доставка, Поддержка клиентов
Business Event Событие, запускающее процесс Получение заявки, Жалоба клиента
Business Object Бизнес-данные Заказ, Контракт, Счёт
Contract Соглашение между участниками SLA, Партнёрское соглашение
Product Набор сервисов для клиента Подписка Premium, Тариф Enterprise

Application Layer

Описывает приложения, компоненты и данные, поддерживающие бизнес.

Элемент Описание Пример
Application Component Приложение или модуль CRM, ERP, Order Service
Application Interface Точка доступа к приложению REST API, Web UI, CLI
Application Function Внутренняя функция Расчёт стоимости, Генерация отчёта
Application Service Сервис, предоставляемый приложением Управление клиентами, Биллинг
Data Object Структура данных Customer Entity, Order Record
Application Event Событие в приложении OrderCreated, PaymentReceived
Application Process Автоматизированный процесс ETL, Batch Processing

Technology Layer

Описывает инфраструктуру: серверы, сети, ПО.

Элемент Описание Пример
Node Вычислительный ресурс Application Server, Docker Host
Device Физическое устройство Сервер Dell, Firewall, Load Balancer
System Software ПО платформы Linux, PostgreSQL, Nginx, PHP-FPM
Technology Interface Точка подключения HTTP/443, TCP/5432
Technology Service Инфраструктурный сервис Hosting, CDN, DNS
Artifact Артефакт деплоя Docker Image, WAR-файл, Config
Communication Network Сеть LAN, VPN, Internet
Path Канал связи HTTPS, gRPC, AMQP

Связи (Relationships)

ArchiMate определяет типизированные связи между элементами.

Структурные связи

Связь Символ Описание Пример
Composition Заполненный ромб Часть-целое (strong) CRM содержит модуль контактов
Aggregation Пустой ромб Группировка (weak) Платформа включает несколько сервисов
Assignment Точки + стрелка Кто выполняет Сервер назначен приложению
Realization Пунктир + треугольник Реализует Компонент реализует сервис

Динамические связи

Связь Символ Описание Пример
Serving Сплошная стрелка Обслуживает API обслуживает клиента
Access Пунктирная стрелка Доступ к данным Процесс читает/пишет Order
Flow Пунктир + треугольник Поток данных/управления Заказ передаётся на склад
Triggering Сплошная стрелка + заливка Запускает Событие запускает процесс

Другие связи

Связь Описание Пример
Influence Влияние (с +/-) Новая система улучшает производительность
Association Общая связь Связь между элементами без типизации
Specialization Наследование Premium Customer специализирует Customer

Viewpoints (Точки зрения)

Viewpoints определяют, какие элементы и связи показывать для конкретной аудитории.

Viewpoint Аудитория Показывает
Organization Менеджмент Структура организации, роли
Business Process Бизнес-аналитики Процессы, сервисы, события
Application Usage Бизнес + IT Как бизнес использует приложения
Application Cooperation Архитекторы Взаимодействие между приложениями
Technology Usage DevOps, SRE Приложения на инфраструктуре
Layered CTO, Enterprise Architects Все три слоя одновременно
Migration Руководство Текущее → целевое состояние

Пример: E-Commerce Enterprise Architecture

Layered View

Strategy Layer
┌─────────────────────────────────────────────────────────┐
│  [Capability: Online Sales]  [Capability: Fulfillment]  │
│          │                           │                   │
│  [Value Stream: Order-to-Delivery]                       │
└─────────────────────┬───────────────────────────────────┘
                      │ realizes
Business Layer
┌─────────────────────┴───────────────────────────────────┐
│                                                          │
│  (Actor: Customer)──serves──▶[Process: Order Placement]  │
│                                    │                     │
│                               triggers                   │
│                                    ▼                     │
│  (Role: Warehouse)──▶[Process: Order Fulfillment]        │
│                                    │                     │
│                               serves                     │
│                                    ▼                     │
│                        [Service: Delivery]               │
└─────────────────────┬───────────────────────────────────┘
                      │ realizes
Application Layer
┌─────────────────────┴───────────────────────────────────┐
│                                                          │
│  [Component: Web Shop]──────▶[Component: Order Service]  │
│         │                           │                    │
│    (Interface:                (Interface:                 │
│     Web UI)                   REST API)                  │
│                                     │                    │
│                          [Component: Inventory Service]   │
│                                     │                    │
│                          [Data Object: Order]            │
│                          [Data Object: Product]          │
└─────────────────────┬───────────────────────────────────┘
                      │ realizes
Technology Layer
┌─────────────────────┴───────────────────────────────────┐
│                                                          │
│  [Node: Kubernetes Cluster]                              │
│     │                                                    │
│     ├──[System SW: PHP-FPM 8.4]                         │
│     ├──[System SW: Nginx]                               │
│     ├──[System SW: PostgreSQL 18]                        │
│     └──[System SW: Redis 7]                             │
│                                                          │
│  [Network: Cloud VPC]                                    │
│  [Artifact: Docker Images]                               │
└─────────────────────────────────────────────────────────┘

Моделирование ArchiMate-элементов

<?php

declare(strict_types=1);

namespace App\Architecture;

/**
 * ArchiMate layer types.
 */
enum ArchimateLayer: string
{
    case Strategy = 'strategy';
    case Business = 'business';
    case Application = 'application';
    case Technology = 'technology';
    case Implementation = 'implementation';
}

/**
 * Relationship types between ArchiMate elements.
 */
enum RelationshipType: string
{
    case Composition = 'composition';
    case Aggregation = 'aggregation';
    case Assignment = 'assignment';
    case Realization = 'realization';
    case Serving = 'serving';
    case Access = 'access';
    case Flow = 'flow';
    case Triggering = 'triggering';
    case Influence = 'influence';
    case Specialization = 'specialization';
    case Association = 'association';
}

/**
 * Access type for Access relationships.
 */
enum AccessType: string
{
    case Read = 'read';
    case Write = 'write';
    case ReadWrite = 'read_write';
}

/**
 * An element in the ArchiMate model.
 */
final class ArchimateElement
{
    /** @var array<string, mixed> */
    private array $properties = [];

    public function __construct(
        public readonly string $id,
        public readonly string $name,
        public readonly string $type,
        public readonly ArchimateLayer $layer,
        public readonly ?string $description = null,
    ) {}

    public function setProperty(string $key, mixed $value): void
    {
        $this->properties[$key] = $value;
    }

    public function getProperty(string $key): mixed
    {
        return $this->properties[$key] ?? null;
    }

    /** @return array<string, mixed> */
    public function getProperties(): array
    {
        return $this->properties;
    }
}

/**
 * A relationship between two ArchiMate elements.
 */
final readonly class ArchimateRelationship
{
    public function __construct(
        public string $id,
        public RelationshipType $type,
        public string $sourceId,
        public string $targetId,
        public ?string $label = null,
        public ?AccessType $accessType = null,
    ) {}
}
### Enterprise Architecture Model
<?php

declare(strict_types=1);

namespace App\Architecture;

/**
 * Enterprise Architecture model following ArchiMate standard.
 * Manages elements, relationships, and provides analysis capabilities.
 */
final class EnterpriseArchitectureModel
{
    /** @var array<string, ArchimateElement> */
    private array $elements = [];

    /** @var array<string, ArchimateRelationship> */
    private array $relationships = [];

    /**
     * Add an element to the model.
     */
    public function addElement(ArchimateElement $element): void
    {
        if (isset($this->elements[$element->id])) {
            throw new \DomainException(
                sprintf('Element with ID "%s" already exists', $element->id),
            );
        }

        $this->elements[$element->id] = $element;
    }

    /**
     * Add a relationship between two elements.
     */
    public function addRelationship(ArchimateRelationship $relationship): void
    {
        $this->validateElementExists($relationship->sourceId);
        $this->validateElementExists($relationship->targetId);
        $this->validateRelationship($relationship);

        $this->relationships[$relationship->id] = $relationship;
    }

    /**
     * Impact analysis: find all elements affected by changing a given element.
     * Traverses serving, realization, and triggering relationships.
     *
     * @return array<ArchimateElement>
     */
    public function impactAnalysis(string $elementId): array
    {
        $this->validateElementExists($elementId);

        $visited = [];
        $impacted = [];

        $this->traverseImpact($elementId, $visited, $impacted);

        return $impacted;
    }

    /**
     * Get all elements in a specific layer.
     *
     * @return array<ArchimateElement>
     */
    public function getElementsByLayer(ArchimateLayer $layer): array
    {
        return array_filter(
            $this->elements,
            static fn(ArchimateElement $e) => $e->layer === $layer,
        );
    }

    /**
     * Get elements that serve (support) a given element.
     *
     * @return array<ArchimateElement>
     */
    public function getSupportingElements(string $elementId): array
    {
        $this->validateElementExists($elementId);

        $supporting = [];

        foreach ($this->relationships as $rel) {
            if ($rel->targetId === $elementId && $rel->type === RelationshipType::Serving) {
                $supporting[] = $this->elements[$rel->sourceId];
            }
        }

        return $supporting;
    }

    /**
     * Get elements that realize a given element.
     *
     * @return array<ArchimateElement>
     */
    public function getRealizingElements(string $elementId): array
    {
        $this->validateElementExists($elementId);

        $realizing = [];

        foreach ($this->relationships as $rel) {
            if ($rel->targetId === $elementId && $rel->type === RelationshipType::Realization) {
                $realizing[] = $this->elements[$rel->sourceId];
            }
        }

        return $realizing;
    }

    /**
     * Dependency analysis: find all elements that this element depends on.
     *
     * @return array<ArchimateElement>
     */
    public function getDependencies(string $elementId): array
    {
        $this->validateElementExists($elementId);

        $dependencies = [];
        $dependencyTypes = [
            RelationshipType::Serving,
            RelationshipType::Realization,
            RelationshipType::Access,
        ];

        foreach ($this->relationships as $rel) {
            if ($rel->sourceId === $elementId && in_array($rel->type, $dependencyTypes, true)) {
                $dependencies[] = $this->elements[$rel->targetId];
            }
        }

        return $dependencies;
    }

    /**
     * Generate a layered view of the architecture as text.
     */
    public function generateLayeredView(): string
    {
        $output = [];

        foreach (ArchimateLayer::cases() as $layer) {
            $elements = $this->getElementsByLayer($layer);

            if (empty($elements)) {
                continue;
            }

            $output[] = sprintf('=== %s Layer ===', ucfirst($layer->value));

            foreach ($elements as $element) {
                $output[] = sprintf(
                    '  [%s] %s (%s)',
                    $element->type,
                    $element->name,
                    $element->id,
                );

                // Show outgoing relationships
                foreach ($this->relationships as $rel) {
                    if ($rel->sourceId === $element->id) {
                        $target = $this->elements[$rel->targetId];
                        $output[] = sprintf(
                            '    --%s--> %s',
                            $rel->type->value,
                            $target->name,
                        );
                    }
                }
            }

            $output[] = '';
        }

        return implode("\n", $output);
    }

    /**
     * Recursive traversal for impact analysis.
     *
     * @param array<string, bool> $visited
     * @param array<ArchimateElement> $impacted
     */
    private function traverseImpact(string $elementId, array &$visited, array &$impacted): void
    {
        if (isset($visited[$elementId])) {
            return;
        }

        $visited[$elementId] = true;

        $impactTypes = [
            RelationshipType::Serving,
            RelationshipType::Realization,
            RelationshipType::Triggering,
            RelationshipType::Composition,
            RelationshipType::Flow,
        ];

        foreach ($this->relationships as $rel) {
            // Elements that depend on the changed element
            if ($rel->sourceId === $elementId && in_array($rel->type, $impactTypes, true)) {
                if (!isset($visited[$rel->targetId])) {
                    $impacted[] = $this->elements[$rel->targetId];
                    $this->traverseImpact($rel->targetId, $visited, $impacted);
                }
            }

            // Elements that are served by the changed element
            if ($rel->targetId === $elementId && $rel->type === RelationshipType::Serving) {
                if (!isset($visited[$rel->sourceId])) {
                    $impacted[] = $this->elements[$rel->sourceId];
                    $this->traverseImpact($rel->sourceId, $visited, $impacted);
                }
            }
        }
    }

    /**
     * Validate allowed relationships between layers.
     * ArchiMate restricts certain cross-layer relationships.
     */
    private function validateRelationship(ArchimateRelationship $relationship): void
    {
        $source = $this->elements[$relationship->sourceId];
        $target = $this->elements[$relationship->targetId];

        // Serving relationships typically go upward (lower layer serves upper)
        if ($relationship->type === RelationshipType::Serving) {
            $layerOrder = [
                ArchimateLayer::Technology->value => 0,
                ArchimateLayer::Application->value => 1,
                ArchimateLayer::Business->value => 2,
                ArchimateLayer::Strategy->value => 3,
            ];

            $sourceOrder = $layerOrder[$source->layer->value] ?? 0;
            $targetOrder = $layerOrder[$target->layer->value] ?? 0;

            if ($sourceOrder > $targetOrder) {
                throw new \DomainException(
                    sprintf(
                        'Serving relationship from %s layer to %s layer is not typical in ArchiMate',
                        $source->layer->value,
                        $target->layer->value,
                    ),
                );
            }
        }
    }

    private function validateElementExists(string $elementId): void
    {
        if (!isset($this->elements[$elementId])) {
            throw new \DomainException(
                sprintf('Element "%s" not found in model', $elementId),
            );
        }
    }
}
### Пример: построение модели
<?php

declare(strict_types=1);

namespace App\Architecture;

/**
 * Example: building an ArchiMate model for an e-commerce system.
 */
final class EcommerceModelBuilder
{
    public function build(): EnterpriseArchitectureModel
    {
        $model = new EnterpriseArchitectureModel();

        // --- Business Layer ---
        $model->addElement(new ArchimateElement(
            id: 'ba-customer',
            name: 'Customer',
            type: 'BusinessActor',
            layer: ArchimateLayer::Business,
        ));

        $model->addElement(new ArchimateElement(
            id: 'bp-order',
            name: 'Order Processing',
            type: 'BusinessProcess',
            layer: ArchimateLayer::Business,
            description: 'End-to-end order processing from placement to delivery',
        ));

        $model->addElement(new ArchimateElement(
            id: 'bs-delivery',
            name: 'Delivery Service',
            type: 'BusinessService',
            layer: ArchimateLayer::Business,
        ));

        // --- Application Layer ---
        $model->addElement(new ArchimateElement(
            id: 'ac-webshop',
            name: 'Web Shop',
            type: 'ApplicationComponent',
            layer: ArchimateLayer::Application,
        ));

        $model->addElement(new ArchimateElement(
            id: 'ac-orderservice',
            name: 'Order Service',
            type: 'ApplicationComponent',
            layer: ArchimateLayer::Application,
        ));

        $model->addElement(new ArchimateElement(
            id: 'ai-restapi',
            name: 'REST API',
            type: 'ApplicationInterface',
            layer: ArchimateLayer::Application,
        ));

        $model->addElement(new ArchimateElement(
            id: 'do-order',
            name: 'Order Data',
            type: 'DataObject',
            layer: ArchimateLayer::Application,
        ));

        // --- Technology Layer ---
        $model->addElement(new ArchimateElement(
            id: 'tn-k8s',
            name: 'Kubernetes Cluster',
            type: 'Node',
            layer: ArchimateLayer::Technology,
        ));

        $model->addElement(new ArchimateElement(
            id: 'ts-php',
            name: 'PHP-FPM 8.4',
            type: 'SystemSoftware',
            layer: ArchimateLayer::Technology,
        ));

        $model->addElement(new ArchimateElement(
            id: 'ts-postgres',
            name: 'PostgreSQL 18',
            type: 'SystemSoftware',
            layer: ArchimateLayer::Technology,
        ));

        // --- Relationships ---

        // Business: Customer triggers Order Processing
        $model->addRelationship(new ArchimateRelationship(
            id: 'r1',
            type: RelationshipType::Triggering,
            sourceId: 'ba-customer',
            targetId: 'bp-order',
        ));

        // Application realizes Business
        $model->addRelationship(new ArchimateRelationship(
            id: 'r2',
            type: RelationshipType::Realization,
            sourceId: 'ac-orderservice',
            targetId: 'bp-order',
            label: 'automates',
        ));

        // Web Shop serves Customer
        $model->addRelationship(new ArchimateRelationship(
            id: 'r3',
            type: RelationshipType::Serving,
            sourceId: 'ac-webshop',
            targetId: 'ba-customer',
        ));

        // Order Service accesses Order Data
        $model->addRelationship(new ArchimateRelationship(
            id: 'r4',
            type: RelationshipType::Access,
            sourceId: 'ac-orderservice',
            targetId: 'do-order',
            accessType: AccessType::ReadWrite,
        ));

        // Technology realizes Application
        $model->addRelationship(new ArchimateRelationship(
            id: 'r5',
            type: RelationshipType::Realization,
            sourceId: 'ts-php',
            targetId: 'ac-orderservice',
        ));

        $model->addRelationship(new ArchimateRelationship(
            id: 'r6',
            type: RelationshipType::Realization,
            sourceId: 'ts-postgres',
            targetId: 'do-order',
        ));

        // K8s contains PHP-FPM (composition)
        $model->addRelationship(new ArchimateRelationship(
            id: 'r7',
            type: RelationshipType::Composition,
            sourceId: 'tn-k8s',
            targetId: 'ts-php',
        ));

        return $model;
    }
}
## Impact Analysis

Одна из главных ценностей ArchiMate -- анализ влияния изменений.

<?php

declare(strict_types=1);

namespace App\Architecture;

/**
 * Impact analysis report generator.
 * Shows which elements are affected when a component changes.
 */
final readonly class ImpactAnalyzer
{
    public function __construct(
        private EnterpriseArchitectureModel $model,
    ) {}

    /**
     * Generate a human-readable impact report.
     */
    public function generateReport(string $elementId): string
    {
        $impacted = $this->model->impactAnalysis($elementId);

        if (empty($impacted)) {
            return sprintf('No impact detected for element "%s".', $elementId);
        }

        $lines = [
            sprintf('Impact Analysis for: %s', $elementId),
            str_repeat('=', 50),
            '',
        ];

        // Group impacted elements by layer
        $byLayer = [];
        foreach ($impacted as $element) {
            $byLayer[$element->layer->value][] = $element;
        }

        foreach ($byLayer as $layer => $elements) {
            $lines[] = sprintf('[%s Layer]', ucfirst($layer));

            foreach ($elements as $element) {
                $lines[] = sprintf(
                    '  - %s (%s): %s',
                    $element->name,
                    $element->type,
                    $element->description ?? 'No description',
                );
            }

            $lines[] = '';
        }

        $lines[] = sprintf('Total affected elements: %d', count($impacted));

        return implode("\n", $lines);
    }

    /**
     * Assess risk level based on number and type of impacted elements.
     */
    public function assessRisk(string $elementId): string
    {
        $impacted = $this->model->impactAnalysis($elementId);

        $businessImpact = array_filter(
            $impacted,
            static fn(ArchimateElement $e) => $e->layer === ArchimateLayer::Business,
        );

        $totalCount = count($impacted);
        $businessCount = count($businessImpact);

        return match (true) {
            $businessCount > 0 && $totalCount > 5 => 'CRITICAL',
            $businessCount > 0 => 'HIGH',
            $totalCount > 5 => 'MEDIUM',
            $totalCount > 0 => 'LOW',
            default => 'NONE',
        };
    }
}
## ArchiMate vs другие нотации
Аспект ArchiMate C4 Model UML BPMN
Фокус Enterprise целиком Архитектура приложения Дизайн кода Бизнес-процессы
Слои Business + App + Tech 4 уровня zoom Нет слоёв Pools/Lanes
Аудитория Enterprise Architects, CTO Разработчики, техлиды Разработчики Бизнес + IT
Сложность Высокая Низкая Средняя-Высокая Средняя
Стандарт The Open Group Нет (de facto) OMG/ISO OMG/ISO
Impact analysis Да (основная ценность) Нет Нет Нет
Связь бизнес-IT Да Частично Нет Частично

TOGAF и ArchiMate

ArchiMate часто используется вместе с TOGAF (The Open Group Architecture Framework).

TOGAF Phase ArchiMate Viewpoint
Phase A: Architecture Vision Stakeholder, Goal Realization
Phase B: Business Architecture Business Process, Organization
Phase C: Information Systems Application Cooperation, Data
Phase D: Technology Architecture Technology Usage, Infrastructure
Phase E: Opportunities & Solutions Migration, Implementation

Инструменты для ArchiMate

Инструмент Тип Лицензия
Archi Desktop моделирование Open Source
Sparx Enterprise Architect Full EA Suite Коммерческий
BiZZdesign Enterprise SaaS Коммерческий
ADOIT EA Management Коммерческий
draw.io Универсальный (с шаблонами) Бесплатный

Итоги

Концепция Суть
Три слоя Business, Application, Technology -- единая модель
Viewpoints Разные представления для разных аудиторий
Relationships Типизированные связи: serving, realization, flow
Impact Analysis Главная ценность -- анализ влияния изменений
Strategy Layer Связь архитектуры с бизнес-целями
TOGAF ArchiMate -- визуальный язык для TOGAF-фреймворка

Совет: ArchiMate -- тяжёлая нотация. Используйте её только для enterprise-уровня (несколько систем, отделов, процессов). Для архитектуры одного приложения C4 Model будет проще и эффективнее. Начните с Archi (бесплатный) для первых экспериментов.