В последнее время я довольно часто натыкаюсь на данную теорему. Она довольно давно доказана и про нее много чего написано. Однако каждый раз когда я натыкаюсь на распределенную систему, претендующую в описании на CA в терминах данной теоремы, т.е. систему в которой жертвуют Partition Tolerance в угоду Consistency и Avalability, я зависаю, так как хоть убейте не могу себе представить такого зверя. После долгих раздумий я все же пришел к выводу, что такая система бессмысленна, о чем и хочу порассуждать в данном топике.
В самом начале все же напомню, что значит каждая буква в аббревиатуры теоремы. Хотя она и сформулирована для общего случая распределенных систем, давайте для упрощения сузим область рассмотрения для систем распределенного хранения данных. Хочу уточнить, что определение я даю не общее, а очень даже узкое, но чтобы всем было себе это легче представить.
В теореме говорится, что если вы строите распределенную систему, то можете удовлетворить только два из вышеупомянутых свойства, т.е. обязательно надо пожертвовать одним из свойств. Главный вопрос, который вызывает недопонимание — это что значит пожертвовать Partition Tolerance. В конечном итоге я пришел к заключению, что это значит распрощаться с гарантией того, что система сможет функционировать при разделении системы на области, между которыми пропала какая-либо связь, или же просто при падении некоторого набора компонент. Вы можете представить себе систему, которая будет готова на это? Я — нет. В общем, ни я один. Вот очень интересная статья по этому поводу. Если бы я на нее не наткнулся, придя к заключению, описанному выше, то, наверное, не стал бы писать данный топик, решив, что я просто чего-то не понимаю. Прочитав же эту статью, которую, между прочим одобрил сам автор теоремы, я все же убедился, что здесь есть о чем поговорить.
Таким образом, так как нельзя пожертвовать Partition Tolerance, для себя я формулирую CAP теорему следующим образом. При построении распределенной системы, которая могла бы пережить отказ некоторых из ее компонент необходимо пожертвовать либо доступностью (avalability), либо согласованностью (consistency).
Однако тут все таки возникает вопрос зачем же тогда вообще было введено понятие Partition Tolerance в данной теореме? Я думаю, что в идеальном мире, где не может случиться отказа сети, железа и ПО, вполне можно было бы построить CA систему, в которой одновременно была бы и доступность и согласованность. Но как только мы попадаем в реальный мир, и случается какой-нибудь отказ, то мы сразу обязаны соблюдать Partition Tolerance и придется отказаться либо от полной согласованности, либо от полной доступности. Ну или найти какой-нибудь компромисс, но полностью удовлетворить оба свойства не удастся.
Update:
Как показали бурные комментарии, самая большое непонимание в CAP-теореме (по крайней мере с моей стороны) — это определение понятия Partition Tolerance, а вернее, что значить пожертвовать им. В итоге, я остановился на том, чтобы считать под Partition Tolerance свойство системы терять связь между компонентами. Т.е. в интерпретации CAP-теоремы, отказаться от PT (а значит, выбрать C и A) значит полагать, что система имеет идеальную связь и никогда не теряет сообщения между своими частями. В этом случае формулировка звучит довольно таки ясно.
Ссылки:
В самом начале все же напомню, что значит каждая буква в аббревиатуры теоремы. Хотя она и сформулирована для общего случая распределенных систем, давайте для упрощения сузим область рассмотрения для систем распределенного хранения данных. Хочу уточнить, что определение я даю не общее, а очень даже узкое, но чтобы всем было себе это легче представить.
- Consistency (Согласованность). Как только мы успешно записали данные в наше распределенное хранилище, любой клиент при запросе получит эти последние данные.
- Avalability (Доступность). В любой момент клиент может получить данные из нашего хранилища, или получить ответ об их отсутствии, если их никто еще не сохранял.
- Partition Tolerance (Устойчивость к разделению системы). Потеря сообщений между компонентами системы (возможно даже потеря всех сообщений) не влияет на работоспособность системы. Здесь очень важный момент состоит в том, что если какие-то компоненты выходят из строя, то это тоже подпадает под этот случай, так как можно считать, что данные компоненты просто теряют связь со всей остальной системой.
В теореме говорится, что если вы строите распределенную систему, то можете удовлетворить только два из вышеупомянутых свойства, т.е. обязательно надо пожертвовать одним из свойств. Главный вопрос, который вызывает недопонимание — это что значит пожертвовать Partition Tolerance. В конечном итоге я пришел к заключению, что это значит распрощаться с гарантией того, что система сможет функционировать при разделении системы на области, между которыми пропала какая-либо связь, или же просто при падении некоторого набора компонент. Вы можете представить себе систему, которая будет готова на это? Я — нет. В общем, ни я один. Вот очень интересная статья по этому поводу. Если бы я на нее не наткнулся, придя к заключению, описанному выше, то, наверное, не стал бы писать данный топик, решив, что я просто чего-то не понимаю. Прочитав же эту статью, которую, между прочим одобрил сам автор теоремы, я все же убедился, что здесь есть о чем поговорить.
Таким образом, так как нельзя пожертвовать Partition Tolerance, для себя я формулирую CAP теорему следующим образом. При построении распределенной системы, которая могла бы пережить отказ некоторых из ее компонент необходимо пожертвовать либо доступностью (avalability), либо согласованностью (consistency).
Однако тут все таки возникает вопрос зачем же тогда вообще было введено понятие Partition Tolerance в данной теореме? Я думаю, что в идеальном мире, где не может случиться отказа сети, железа и ПО, вполне можно было бы построить CA систему, в которой одновременно была бы и доступность и согласованность. Но как только мы попадаем в реальный мир, и случается какой-нибудь отказ, то мы сразу обязаны соблюдать Partition Tolerance и придется отказаться либо от полной согласованности, либо от полной доступности. Ну или найти какой-нибудь компромисс, но полностью удовлетворить оба свойства не удастся.
Update:
Как показали бурные комментарии, самая большое непонимание в CAP-теореме (по крайней мере с моей стороны) — это определение понятия Partition Tolerance, а вернее, что значить пожертвовать им. В итоге, я остановился на том, чтобы считать под Partition Tolerance свойство системы терять связь между компонентами. Т.е. в интерпретации CAP-теоремы, отказаться от PT (а значит, выбрать C и A) значит полагать, что система имеет идеальную связь и никогда не теряет сообщения между своими частями. В этом случае формулировка звучит довольно таки ясно.
Ссылки: