Я пытаюсь понять, что такое «атомарное» обновление с точки зрения etcd.
Когда я думаю «атомарно», я думаю, что есть «до» и «после» (во время нет, и если обновление не удается, это все еще «до»).
Вот пример:
curl -s -XPUT http://localhost:2379/v2/keys/message -d value='Hidee Ho'
Итак, на данный момент любой может получить доступ к этому сообщению и получить текущее значение:
curl -s http://localhost:2379/v2/keys/message
{"action":"get","node":{"key":"/message","value":"Hidee Ho","modifiedIndex":4748,"createdIndex":4748}}
Позже я могу изменить это значение, например:
curl -s -XPUT http://localhost:2379/v2/keys/message -d value='Mr Hanky'
И результат можно получить, как и раньше. До моего изменения возвращается значение «Хиди Хо», после изменения возвращается значение «Мистер Хэнки». Итак, мой вопрос: гарантирую ли я тот или иной результат? То есть я хочу подтвердить, что будет возвращено одно или другое (а не нулевое значение между результатом).
Я не особенно забочусь о времени. Если я сделаю обновление Mr Hanky, а последующие сборщики значения продолжат получать Hidee Ho в течение (короткого) периода времени, все в порядке.
Я запутался, потому что в протоколе есть функция Atomic CompareAndSwap. Насколько я могу судить, это не столько Atomic, сколько «выполнять обновление только в том случае, если значение соответствует тому, что я говорю». В моем случае мне все равно, какое значение было раньше. Я просто хочу знать, что оно изменилось и что читатели не увидят ничего, кроме значений «до» или «после».