Нет, не требуется, чтобы записи журнала были идемпотентными, если вы используете алгоритм распределенного консенсуса, такой как Paxos или Raft. Создание системы на основе идемпотентных операций дает много преимуществ, но это не всегда возможно. Алгоритмы распределенного консенсуса отлично подходят для случаев, когда вы не можете достичь идемпотентности, поэтому вам нужно быть уверенным, что операции обрабатываются не более одного раза на каждой реплике. Более того, они позволяют гарантировать, что операции всегда выполняются в одном и том же порядке на каждой реплике. Это очень сильные свойства, и вам нужно выполнить некоторую относительно дорогостоящую координацию, чтобы гарантировать, что они сохраняются, поэтому мы стараемся избегать их, где это возможно.
Распределенный консенсус гарантирует, что каждая запись журнала будет одинаковой для каждой реплики, если эта запись журнала будет принята большинством реплик. Каждая реплика должна обрабатывать только те записи журнала, которые были приняты большинством реплик, поскольку другие записи журнала могут измениться во время восстановления. Каждая реплика должна тщательно отслеживать, какие операции она уже обработала, чтобы избежать их повторной обработки во время восстановления. Это легко сделать, поскольку журнал полностью упорядочен, поэтому каждая реплика может отслеживать операции, которые она обработала, с помощью одного числа, представляющего позицию последней обработанной операции в журнале.
Фактически, другой взгляд на распределенный консенсус заключается в том, что это эффективный способ добавить идемпотентность (и коммутативность) обратно в набор операций, которые могут не быть идемпотентными (или коммутативными). Так что нет, операции не обязательно должны быть идемпотентными, потому что вместо этого вы можете получить необходимую идемпотентность из алгоритма распределенного консенсуса.
person
Dave Turner
schedule
07.07.2019