"На практике" CAP говорит, что при разделении сети в системе:
- либо каждое чтение возвращает последнюю запись, но может быть недоступность (CP)
- либо доступность, но можем не видеть записанные данные (AP)
Если же сеть в порядке, то система может быть доступной и консистентной одновременно
Однако CAP не раскрывает еще один трейдофф: даже когда с сетью все в порядке, соблюдение Consistency может требовать дополнительных задержек (например, на синхронную репликацию)
То есть, если с сетью все в порядке, то:
- либо чтение возвращает последнюю запись, но может увеличиваться latency
- либо latency низкое, но можем не видеть записанные данные
Именно это описывается принципом PACELC, который расширяет CAP на случай, когда с сетью все в порядке:
if (Partition) {
Availability OR Consistency
} else {
Latency OR Consistency
}
Это позволяет классифицировать системы как PA/EL, PA/EC, PC/EL, PC/EC. Например, DynamoDB — PA/EL: выбирает доступность вместо согласованности при разделении сети, а когда с сетью все в порядке — минимальную задержку вместо согласованности
p.s.: такие классификации — это не формальные описания систем, а скорее ментальные модели, которыми можно удобно оперировать. На эту тему есть хорошая статья
