Software Architecture: The Hard Parts (Neal Ford, Mark Richards)

There are no easy decisions in software architecture. Instead, there are many hard parts--difficult problems or issues with no best practices--that force you to choose among various compromises. With this book, you'll learn how to think critically about the trade-offs involved with distributed architectures.

Architecture veterans and practicing consultants Neal Ford, Mark Richards, Pramod Sadalage, and Zhamak Dehghani discuss strategies for choosing an appropriate architecture. By interweaving a story about a fictional group of technology professionals--the Sysops Squad--they examine everything from how to determine service granularity, manage workflows and orchestration, manage and decouple contracts, and manage distributed transactions to how to optimize operational characteristics, such as scalability, elasticity, and performance.
By focusing on commonly asked questions, this book provides techniques to help you discover and weigh the trade-offs as you confront the issues you face as an architect.

Analyze trade-offs and effectively document your decisions
Make better decisions regarding service granularity
Understand the complexities of breaking apart monolithic applications
Manage and decouple contracts between services
Handle data in a highly distributed architecture
Learn patterns to manage workflow and transactions when breaking apart applications

Cover
Copyright
Preface
Conventions Used in This Book
Using Code Examples
O’Reilly Online Learning
How to Contact Us
Acknowledgments
Acknowledgments from Mark Richards
Acknowledgments from Neal Ford
Acknowledgments from Pramod Sadalage
Acknowledgments from Zhamak Dehghani
What Happens When There Are No “Best Practices”?
Why “The Hard Parts”?
Giving Timeless Advice About Software Architecture
The Importance of Data in Architecture
Architectural Decision Records
Architecture Fitness Functions
Using Fitness Functions
Architecture Versus Design: Keeping Definitions Simple
Introducing the Sysops Squad Saga
Nonticketing Workflow
Ticketing Workflow
A Bad Scenario
Sysops Squad Architectural Components
Sysops Squad Data Model
Pulling Things Apart
Discerning Coupling in Software Architecture
Architecture (Quantum | Quanta)
Independently Deployable
High Functional Cohesion
High Static Coupling
Dynamic Quantum Coupling
Sysops Squad Saga: Understanding Quanta
Architectural Modularity
Modularity Drivers
Maintainability
Testability
Deployability
Scalability
Availability/Fault Tolerance
Sysops Squad Saga: Creating a Business Case
Architectural Decomposition
Is the Codebase Decomposable?
Afferent and Efferent Coupling
Abstractness and Instability
Distance from the Main Sequence
Component-Based Decomposition
Tactical Forking
Trade-Offs
Sysops Squad Saga: Choosing a Decomposition Approach
Component-Based Decomposition Patterns
Identify and Size Components Pattern
Pattern Description
Fitness Functions for Governance
Sysops Squad Saga: Sizing Components
Gather Common Domain Components Pattern
Pattern Description
Fitness Functions for Governance
Sysops Squad Saga: Gathering Common Components
Flatten Components Pattern
Pattern Description
Fitness Functions for Governance
Sysops Squad Saga: Flattening Components
Determine Component Dependencies Pattern
Pattern Description
Fitness Functions for Governance
Sysops Squad Saga: Identifying Component Dependencies
Create Component Domains Pattern
Pattern Description
Fitness Functions for Governance
Sysops Squad Saga: Creating Component Domains
Create Domain Services Pattern
Pattern Description
Fitness Functions for Governance
Sysops Squad Saga: Creating Domain Services
Summary
Pulling Apart Operational Data
Data Decomposition Drivers
Data Disintegrators
Data Integrators
Sysops Squad Saga: Justifying Database Decomposition
Decomposing Monolithic Data
Step 1: Analyze Database and Create Data Domains
Step 2: Assign Tables to Data Domains
Step 3: Separate Database Connections to Data Domains
Step 4: Move Schemas to Separate Database Servers
Step 5: Switch Over to Independent Database Servers
Selecting a Database Type
Relational Databases
Key-Value Databases
Document Databases
Column Family Databases
Graph Databases
NewSQL Databases
Cloud Native Databases
Time-Series Databases
Sysops Squad Saga: Polyglot Databases
Service Granularity
Granularity Disintegrators
Service Scope and Function
Code Volatility
Scalability and Throughput
Fault Tolerance
Security
Extensibility
Granularity Integrators
Database Transactions
Workflow and Choreography
Shared Code
Data Relationships
Finding the Right Balance
Sysops Squad Saga: Ticket Assignment Granularity
Sysops Squad Saga: Customer Registration Granularity
Putting Things Back Together
Reuse Patterns
Code Replication
When to Use
Shared Library
Dependency Management and Change Control
Versioning Strategies
When To Use
Shared Service
Change Risk
Performance
Scalability
Fault Tolerance
When to Use
Sidecars and Service Mesh
When to Use
Sysops Squad Saga: Common Infrastructure Logic
Code Reuse: When Does It Add Value?
Reuse via Platforms
Sysops Squad Saga: Shared Domain Functionality
Chapter 9. Data Ownership and Distributed Transactions
Assigning Data Ownership
Single Ownership Scenario
Common Ownership Scenario
Joint Ownership Scenario
Table Split Technique
Data Domain Technique
Delegate Technique
Service Consolidation Technique
Data Ownership Summary
Distributed Transactions
Eventual Consistency Patterns
Background Synchronization Pattern
Orchestrated Request-Based Pattern
Event-Based Pattern
Sysops Squad Saga: Data Ownership for Ticket Processing
Distributed Data Access
Interservice Communication Pattern
Column Schema Replication Pattern
Replicated Caching Pattern
Data Domain Pattern
Sysops Squad Saga: Data Access for Ticket Assignment
Managing Distributed Workflows
Orchestration Communication Style
Choreography Communication Style
Workflow State Management
Trade-Offs Between Orchestration and Choreography
State Owner and Coupling
Sysops Squad Saga: Managing Workflows
Transactional Sagas
Transactional Saga Patterns
Epic Saga(sao) Pattern
Phone Tag Saga(sac) Pattern
Fairy Tale Saga(seo) Pattern
Time Travel Saga(sec) Pattern
Fantasy Fiction Saga(aao) Pattern
Horror Story(aac) Pattern
Parallel Saga(aeo) Pattern
Anthology Saga(aec) Pattern
State Management and Eventual Consistency
Saga State Machines
Techniques for Managing Sagas
Sysops Squad Saga: Atomic Transactions and Compensating Updates
Contracts
Strict Versus Loose Contracts
Trade-Offs Between Strict and Loose Contracts
Contracts in Microservices
Stamp Coupling
Over-Coupling via Stamp Coupling
Bandwidth
Stamp Coupling for Workflow Management
Sysops Squad Saga: Managing Ticketing Contracts
Managing Analytical Data
Previous Approaches
The Data Warehouse
The Data Lake
The Data Mesh
Definition of Data Mesh
Data Product Quantum
Data Mesh, Coupling, and Architecture Quantum
When to Use Data Mesh
Sysops Squad Saga: Data Mesh
Build Your Own Trade-Off Analysis
Finding Entangled Dimensions
Coupling
Analyze Coupling Points
Assess Trade-Offs
Trade-Off Techniques
Qualitative Versus Quantative Analysis
MECE Lists
The “Out-of-Context” Trap
Model Relevant Domain Cases
Prefer Bottom Line over Overwhelming Evidence
Avoiding Snake Oil and Evangelism
Sysops Squad Saga: Epilogue
Appendix A. Concept and Term References
Appendix B. Architecture Decision Record References
Appendix C. Trade-Off References
Index
About the Authors
Colophon

=======
В архитектуре программного обеспечения нет простых решений. Наоборот, есть много трудных моментов — сложных проблем или проблем, для которых нет передового опыта, — которые вынуждают вас выбирать между различными компромиссами. С помощью этой книги вы научитесь критически относиться к компромиссам, связанным с распределенными архитектурами.

Ветераны архитектуры и практикующие консультанты Нил Форд, Марк Ричардс, Прамод Садаладж и Жамак Дегани обсуждают стратегии выбора подходящей архитектуры. Переплетая историю о вымышленной группе профессионалов в области технологий — Sysops Squad, — они исследуют все, от того, как определить степень детализации обслуживания, управлять рабочими процессами и оркестровкой, управлять и отделять контракты и управлять распределенными транзакциями, до того, как оптимизировать операционные характеристики, такие как как масштабируемость, эластичность и производительность.

Сосредоточив внимание на часто задаваемых вопросах, эта книга предлагает методы, которые помогут вам найти и взвесить компромиссы, когда вы сталкиваетесь с проблемами, с которыми вы сталкиваетесь как архитектор.

- Анализируйте компромиссы и эффективно документируйте свои решения
- Принимайте более взвешенные решения относительно детализации обслуживания
- Понимание сложностей разделения монолитных приложений
- Управляйте контрактами между службами и разделяйте их
- Обработка данных в высокораспределенной архитектуре
- Изучите шаблоны для управления рабочим процессом и транзакциями при разделении приложений.

Покрытие
Авторские права
Предисловие
Условные обозначения, используемые в этой книге
Использование примеров кода
Онлайн-обучение O’Reilly
Как с нами связаться
Благодарности
Благодарности от Марка Ричардса
Благодарности от Нила Форда
Благодарности от Прамода Садалаге
Благодарности от Жамака Дехгани
Что происходит, когда нет «лучших практик»?
Почему «Сложные части»?
Вечные советы по архитектуре программного обеспечения
Важность данных в архитектуре
Записи архитектурных решений
Архитектурные фитнес-функции
Использование фитнес-функций
Архитектура против дизайна: простые определения
Представляем сагу Sysops Squad
Рабочий процесс без билетов
Рабочий процесс продажи билетов
Плохой сценарий
Архитектурные компоненты Sysops Squad
Модель данных отряда сисопов
Разделение вещей
Выявление связи в архитектуре программного обеспечения
Архитектура (квант | кванта)
Независимое развертывание
Высокая функциональная сплоченность
Высокая статическая связь
Динамическая квантовая связь
Sysops Squad Saga: Понимание Quanta
Архитектурная модульность
Драйверы модульности
Ремонтопригодность
Тестируемость
Развертывание
Масштабируемость
Доступность/отказоустойчивость
Sysops Squad Saga: создание бизнес-кейса
Архитектурная декомпозиция
Можно ли разложить кодовую базу?
Афферентная и эфферентная связь
Абстрактность и нестабильность
Расстояние от главной последовательности
Компонентная декомпозиция
Тактическая развилка
Компромиссы
Sysops Squad Saga: выбор подхода к декомпозиции
Шаблоны декомпозиции на основе компонентов
Идентификация и размер массива компонентов
Описание шаблона
Фитнес-функции для управления
Sysops Squad Saga: размеры компонентов
Соберите шаблон общих компонентов предметной области
Описание шаблона
Фитнес-функции для управления
Sysops Squad Saga: Сбор общих компонентов
Выровнять массив компонентов
Описание шаблона
Фитнес-функции для управления
Sysops Squad Saga: Сведение компонентов
Определение шаблона зависимостей компонентов
Описание шаблона
Фитнес-функции для управления
Sysops Squad Saga: определение зависимостей компонентов
Создать шаблон доменов компонентов
Описание шаблона
Фитнес-функции для управления
Sysops Squad Saga: создание доменов компонентов
Создать шаблон доменных служб
Описание шаблона
Фитнес-функции для управления
Sysops Squad Saga: Создание доменных служб
Резюме
Разделение операционных данных
Драйверы декомпозиции данных
Дезинтеграторы данных
Интеграторы данных
Sysops Squad Saga: обоснование декомпозиции базы данных
Разложение монолитных данных
Шаг 1. Анализ базы данных и создание доменов данных
Шаг 2. Назначение таблиц доменам данных
Шаг 3. Отдельные подключения базы данных к доменам данных
Шаг 4. Переместите схемы на отдельные серверы баз данных
Шаг 5. Переключитесь на независимые серверы баз данных
Выбор типа базы данных
Реляционные базы данных
Базы данных ключ-значение
Базы данных документов
Базы данных семейств колонн
Графические базы данных
Базы данных NewSQL
Облачные базы данных
Базы данных временных рядов
Sysops Squad Saga: Базы данных Polyglot
Детализация обслуживания
Дезинтеграторы зернистости
Объем и функции услуги
Волатильность кода
Масштабируемость и пропускная способность
Отказоустойчивость
Безопасность
Расширяемость
Интеграторы детализации
Транзакции базы данных
Рабочий процесс и хореография
Общий код
Отношения данных
Поиск правильного баланса
Sysops Squad Saga: гранулярность назначения билетов
Sysops Squad Saga: Детализация регистрации клиентов
Собираем вещи вместе
Повторное использование шаблонов
Репликация кода
Когда использовать
Общая библиотека
Управление зависимостями и контроль изменений
Стратегии управления версиями
Когда использовать
Общий сервис
Изменить риск
Производительность
Масштабируемость
Отказоустойчивость
Когда использовать
Коляски и сервисная сетка
Когда использовать
Sysops Squad Saga: Общая логика инфраструктуры
Повторное использование кода: когда это повышает ценность?
Повторное использование через платформы
Sysops Squad Saga: функциональность общего домена
Глава 9. Владение данными и распределенные транзакции
Назначение права собственности на данные
Сценарий единоличного владения
Сценарий общей собственности
Сценарий совместной собственности
Техника разделения стола
Техника предметной области
Техника делегирования
Техника консолидации услуг
Сводка о владении данными
Распределенные транзакции
Возможные шаблоны согласованности
Шаблон фоновой синхронизации
Оркестрированный шаблон на основе запросов
Шаблон, основанный на событиях
Sysops Squad Saga: владение данными для обработки заявок
Распределенный доступ к данным
Шаблон межсервисного взаимодействия
Шаблон репликации схемы столбцов
Реплицированный шаблон кэширования
Шаблон домена данных
Sysops Squad Saga: доступ к данным для назначения билетов
Управление распределенными рабочими процессами
Оркестровый стиль общения
Хореографический стиль общения
Управление состоянием рабочего процесса
Компромиссы между оркестровкой и хореографией
Государственный собственник и муфта
Sysops Squad Saga: Управление рабочими процессами
Транзакционные саги
Шаблоны транзакционной саги
Эпическая сага (сао) Pattern
Телефонная бирка Saga (sac) Pattern
Сказочная сага (seo) Pattern
Сага о путешествии во времени (сек.)
Фэнтези-фантастическая сага (аао) Шаблон
История ужасов (aac) Шаблон
Параллельная сага (эо) Паттерн
Антология Сага (aec) Шаблон
Управление состоянием и окончательная согласованность
Сага Конечные машины
Методы управления сагами
Sysops Squad Saga: атомарные транзакции и компенсирующие обновления
Контракты
Строгие и свободные контракты
Компромиссы между строгими и свободными контрактами
Контракты в микросервисах
Штамп Муфта
Сверхсвязь через штемпельную муфту
Пропускная способность
Штамповое соединение для управления рабочим процессом
Sysops Squad Saga: управление контрактами на продажу билетов
Управление аналитическими данными
Предыдущие подходы
Хранилище данных
Озеро данных
Сетка данных
Определение сетки данных
Квантовый продукт данных
Сетка данных, связь и архитектура Quantum
Когда использовать сетку данных
Sysops Squad Saga: Data Mesh
Создайте свой собственный анализ компромиссов
Поиск запутанных измерений
Связь
Анализ точек связи
Оцените компромиссы
Методы компромисса
Качественный и количественный анализ
Списки МЕСЕ
Ловушка «вне контекста»
Примеры релевантной предметной области модели
Предпочитайте практический результат неопровержимым доказательствам
Избегайте змеиного масла и евангелизма
Sysops Squad Saga: Эпилог
Приложение A. Концепция и термины
Приложение B. Ссылки на записи решений по архитектуре
Приложение C. Ссылки на компромиссы
Индекс
Об авторах
Колофон

Книга на английском языке.
Формат: EPUB, PDF, DJVU, MOBI, AZW