Тщательно изучите серию статей etcd (8): API транзакций etcd

задняя часть etcd

0 Обзор альбома

etcd является важным базовым компонентом облачной архитектуры, которая инкубируется и размещается CNCF. etcd можно использовать не только для регистрации и обнаружения сервисов в микросервисах и кластерах Kubernetes, но и как промежуточное ПО для хранения ключей и значений.

"Понимание статей серии etcd" познакомит с etcd с точки зрения базовой функциональной практики etcd, интерфейса API, принципа реализации, анализа исходного кода и опыта преодоления ям в реализации. Ожидается, что статей будет около 20, автор будет обновлять каждую неделю, прошу обратить внимание.

1 etcd транзакция Транзакция

Транзакции представляют собой атомарные структуры If/Then/Else в хранилище ключ-значение. etcd предоставляет примитивы для группировки запросов в атомарные блоки (т.е. тогда/иначе), которые защищают выполнение (т.е. если) на основе содержимого хранилища ключ-значение. Транзакции можно использовать для обеспечения согласованности одновременных обновлений, для создания CAS и контроля параллелизма на уровне разработки.

Транзакции позволяют серверу etcd автоматически обрабатывать несколько внешних запросов в одном запросе. Для модификаций хранилища "ключ-значение" это означает, что версия этого репозитория увеличивается только один раз для транзакции, и все события, сгенерированные этой транзакцией, будут иметь одну и ту же версию. Важно отметить, что запрещается изменять один и тот же ключ несколько раз в рамках одной транзакции.

Каждое сравнение в транзакции проверяет один ключ в хранилище, подобно операции If, проверяя существование значения, сравнивая с заданным значением или проверяя версию или версию ключа. Два разных сравнения могут применяться к одному и тому же или к разным ключам. Все сравнения являются атомарными операциями. Если все сравнения истинны, транзакция успешна, и etcd применяет блок запроса then/success транзакции, в противном случае он считает неудачным и применяет блок запроса else/failure.

Относительно конкретной концепции дел вы можете поискать в интернете самостоятельно, в этой статье мы не будем подробно останавливаться на этой части.

2 Определение передачи

Метод Txn обрабатывает несколько запросов в одной транзакции. Запрос txn увеличивает версию хранилища ключей и значений и создает событие с одной и той же версией для каждого завершенного запроса. etcd не позволяет изменять один и тот же ключ несколько раз в txn.

rpc Txn(TxnRequest) returns (TxnResponse) {}

Следующий абзац взят из комментариев TxnRequest в прото-файле документа google paxosdb, объясняющего, как работают запросы Txn:

Наша реализация вращается вокруг мощного примитива, который мы называем MultiOp. Все операции с базой данных, кроме циклов, реализуются как один вызов MultiOp. MultiOp применяется атомарно и состоит из трех частей:

  • Список тестов, называемых охранниками. Каждый тест в Guard проверяет одну запись в базе данных. Он может проверять наличие или отсутствие значения или сравнивать его с заданным значением. К одному и тому же или к разным элементам базы данных могут применяться два разных теста защиты. Все тесты в Guard применяются, и MultiOp возвращает результат. Если все проверки верны, MultiOp выполняет операцию t (см. второй пункт ниже), в противном случае — операцию f (см. третий пункт ниже).
  • Список операций базы данных, известных как t операций. Каждая операция в списке является операцией вставки, удаления или поиска и применяется к одному элементу базы данных. Две разные операции в списке могут применяться к одному и тому же или к разным элементам в базе данных. Эти операции будут выполняться, если охрана оценивается как истина.
  • Список операций с базой данных, известных как f-операции. Аналогичен операции t, но выполняется, когда значение Guard равно false.

Тело сообщения TxnRequest запроса определяется следующим образом:

message TxnRequest {
  // compare 是断言列表,体现为条件的联合
  repeated Compare compare = 1;

  // 成功请求列表,当比较评估为 true 时将被应用。
  repeated RequestOp success = 2;

  // 失败请求列表,当比较评估为 false 时将被应用。
  repeated RequestOp failure = 3;
}

сравнение Если сравнение прошло успешно, успешные запросы будут обработаны по порядку, и ответы будут содержать соответствующие ответы по порядку; если сравнение не удалось, неудачные запросы будут обработаны по порядку, а ответы будут содержать соответствующие ответы по порядку. . Тело сообщения TxnResponse ответа определяется следующим образом:

message TxnResponse {
  ResponseHeader header = 1;

  // 如果比较评估为true则succeeded被设置为true,否则是false
  bool succeeded = 2;

  repeated ResponseOp responses = 3;
}

заголовок обозначает общие заголовки ответа. responses — список ответов. Если Successed равно true, это соответствует успешному запросу, а если Successed равно False, это соответствует неудачному запросу. Сравните тело сообщения:

message Compare {
  enum CompareResult {
    EQUAL = 0;
    GREATER = 1;
    LESS = 2;
    NOT_EQUAL = 3;
  }
  enum CompareTarget {
    VERSION = 0;
    CREATE = 1;
    MOD = 2;
    VALUE= 3;
  }

  CompareResult result = 1;

  CompareTarget target = 2;

  bytes key = 3;

  oneof target_union {
    // version 是给定 key 的版本
    int64 version = 4;

    // create_revision 是给定 key 的创建修订版本
    int64 create_revision = 5;

    // mod_revision 是给定 key 的最后修改修订版本
    int64 mod_revision = 6;

    // value 是给定 key 的值,以 bytes 的形式
    bytes value = 7;
  }
}

результат является логической операцией сравнения для этого сравнения. target — поле ключ-значение для сравнения. key — ключ субъекта, используемый для операций сравнения. Определение ключевого слова oneof, за которым следует имя oneof в .proto, установка поля oneof автоматически очистит все остальные члены поля oneof. В сгенерированном коде одно из полей имеет те же методы установки и получения, что и обычные поля.

Тело сообщения RequestOp определяется следующим образом:

message RequestOp {
  oneof request {
    RangeRequest request_range = 1;
    PutRequest request_put = 2;
    DeleteRangeRequest request_delete_range = 3;
  }
}

request — это объединение типов запросов, которые могут быть приняты транзакцией. Тело сообщения ResponseOp:

message ResponseOp {
  oneof response {
    RangeResponse response_range = 1;
    PutResponse response_put = 2;
    DeleteRangeResponse response_delete_range = 3;
  }
}

response — это набор типов ответов, возвращаемых транзакцией.

3 Резюме

В этой статье в основном представлено определение транзакции Txn, используемой в API Etcd.Метод Txn обрабатывает несколько запросов в одной транзакции, тем самым обеспечивая согласованность бизнес-процессов.

Подписывайтесь на свежие статьи, приглашаю обратить внимание на мой публичный номер

Рекомендуемое чтение

  1. Сравнение etcd с другими компонентами k-v, такими как Zookeeper и Consul
  2. Тщательно изучите серию статей etcd (1): первое знакомство с etcd
  3. Тщательно изучите серию статей etcd (2): различные положения установки etcd
  4. Тщательно изучите серию статей etcd (3): эксплуатация и обслуживание кластера etcd, развертывание.
  5. Тщательно изучите серию статей etcd (4): безопасность etcd
  6. Тщательно изучите серию статей etcd (5): использование etcdctl
  7. Тщательно изучите серию статей etcd (6): etcd core API v3
  8. [Знакомство со статьями из серии etcd (7): API сервиса etcd gRPC

](блюз доступен empty.com/2020/08/27/…)

Ссылаться на

etcd docs