Паттерны мастабируемости, доступности, стабильности
https://www.slideshare.net/jboner/scalability-availability-stability-patterns/
Трейдоффы
Производительность vs Масштабируемость
Проблемы с производительностью - это когда приложение работает медленно для одного юзера.
Проблемы с масштабируемостью - это когда быстро работает для одного юзера, но медленно под большой нагрузкой
Задержка vs Пропускная способность
В идеале нужно стремиться к максимальной пропускной способности с приемлемыми задержками.
Доступность vs Консистентность
См. CAP-теорему.
В современных NoSQL-системах обычно находятся посередине между CP и AP, поэтому их относят к BASE-системам:
- Basically Available
- Soft state
- Eventually consistent
К BASE-системам относятся:
- Cassandra
- Riak
- Voldemort
- Dynomite
- SimpleDB
- и другие
На другом конце спектрума находятся ACID-системы:
- Atomicity
- Consistency
- Isolation
- Durability
К ACID-системам относятся:
- Реляционные БД (MySQL, Oracle, Postgres)
- Объектные БД (Gemstone, db4o)
- Кластеризующие продукты (Coherence, Terracotta, Hazelcast, GigaSpaces, GemStone)
- Большинство кэшей (ehcache)
Паттерны доступности
Failover && Failback
Актив-пассив
Когда узел или вся система перестает отвечать, нужно выдавать какой-то статичный ответ на запросы к нему, либо же поставить на его место другой, рабочий сервер. Для этого активный сервер шлет пассивному серверу heartbeat-сообщения. Если сообщения перестали приходить, пассивный сервер берет себе IP-адрес активного и продолжает работу.
Обычно процесс переключения не так прост:
Репликация
4 паттерна репликации:
- мастер-слейв
- мастер-мастер
- Tree Replication
- Buddy Replication
Tree Replication
Buddy Replication
Паттерны масштабируемости
Паттерны состояния
Партишнинг
Репликация
HTTP-кэширование
Через заголовок Cache-Control
.
- Reverse-proxy
- CDN
Распределенное кэширование
- Write-through: все записи в БД проходят через слой кэша
- Write-behind: записи пишутся в кэш, а оттуда попадают в очередь, из которой отдельный сервис кладет в БД
Политики исключения
- TTL
- FIFO
- LIFO
- Explicit cache invalidation
Concurrency
- Shared-State Concurrency:
- Message-Passing Concurrency (Actors): ничего не шарится, процессы легковесные, коммуникация через асинхронные и неблокирующие сообщения, каждый актор имеет свою очередь сообщений
- Dataflow Concurrency: декларативное описание, треды блокируются, пока данные не станут доступны, ленивая обработка данных по требованию, нет разницы между параллельным и последовательным кодом. Ограничения: не может иметь сайд-эффектов.
- STM: память (куча и стэк) рассматриваются как транзакционное множество данных. При коллизии транзакции автоматически повторяются. При ошибке откатываются. Ограничения: все операции внутри транзакции должны быть идемпотентными.
Паттерны поведения
- Event-Driven Architecture
- Compute Grids
- Load-balancing
- Parallel Computing
Event-Driven Architecture
- Domain Events
- Event Sourcing
- CQRS
- Event Stream Processing
- Messaging
- ESB
- Actors
- Enterprise Integration Architecture
Event Sourcing
- Каждое изменение состояния представляется в виде Event/события
- Все события шлются в EventProcessor
- EventProcessor сохраняет все события в Event Log/журнал событий
- Система может быть перезапущена и журнал событий будет проигран заново
- ORM не нужна, просто сохраняем события
- К EventProcessor может быть добавлено много EventListeners
CQRS
Есть БД домена и БД запросов
- все изменения состояния представляются в виде Domain Events
- корни аггрегации/БД домена принимают команды и паблишат события
- БД запросов апдейтится в результате запаблишенных событий
- все запросы от слоя представления идут сразу в БД запросов, а БД домена не затрагивается
Event Stream Processing
Обслуживает запросы типа:
select * from Withdrawal(amount>=200).win:length(5)
В этом запросе при каждом новом событии с amount>=200
оно будет выдано клиенту. Когда таких событий станет больше 5, то старые начнут выдаваться с пометкой OLD. Новые клиенты увидят только последние 5 таких событий.
Продукты:
- Esper
- StreamBase
- RuleCast
Messaging
- Pub-sub
- Point-to-Point
- Store-forward (отправитель шлет в медиатор, а он шлет получателю и еще куда-то, например в лог, или сохраняет в БД)
- Request-Reply (отправитель шлет запрос в очередь, получатель получает из очереди, формирует ответ на запрос, вовращает его в очередь, очередь возвращает его отправителю)
Стандарты:
- AMQP
- JMS
Продукты:
- RabbitMQ (AMQP)
- ActiveMQ (JMS)
- Tibco
- MQSeries
- и другие
ESB
Все подключены к одной большой жирной шине, через которую проходят все события.
Actors
- Fire-forget (async send)
- Fire-And-Receive-Eventually (async send + wait on Future for reply)
Compute Grids
- Divide and conquer (джобы разделяются на независимые таски, выполняются параллельно, результаты аггрегируются)
- MapReduce - Master/Worker
- Automatic provisioning
- Load balancing
- Fail-over
- Topology resolution
Продукты:
- Platform
- DataSynapse
- Google MapReduce
- Hadoop
- GigaSpaces
- GridGain
Load balacing
- Random allocation
- Round robin allocation
- Weighted allocation
-
Dynamic load balancing
- least connections
- least server CPU
- DNS Round Robin
- Reverse Proxy (Apache mod_proxy, HAProxy, Squid, Nginx)
- Hardware Load Balacing (BIG-IP, Cisco)
Паттерны стабильности
- таймауты
- разрыв сети
- Let-it-crash
- Fail fast
- Bulkheads
- Steady state
- Throttling