Java и etcd: потому что jetcd наконец собрался вместе

Java Программа перевода самородков

Надежное хранилище «ключ-значение» обеспечивает общую основу для последовательной настройки и координации распределенных систем.etcdОдной из таких систем является проект, хранилище ключей и значений с открытым исходным кодом, созданное CoreOS. это многоРаспределенные системы производственного уровняосновные компоненты иKubernetesЦентр хранения данных для других проектов.

Java зарекомендовала себя как популярный язык распределенных систем благодаря использованию в технологических стеках, включая экосистему Hadoop, хранилище данных Cassandra и облачную инфраструктуру. Кроме того, это все еще очень популярный язык. можно посмотретьGoogle Трендыстатистики, Java по-прежнему доминирует:

С точки зрения результатов поиска Google, Java по-прежнему более популярен, чем Microsoft .Net и даже языки JavaScript.

Столкнувшись с популярностью Java и ее широким использованием в распределенных системах, мы считаем, что etcd также следует использовать в качестве серверной основы для разработки Java. Появление jetcd, нового клиента etcd, переносит API etcd v3 на Java.

Используя jetcd, Java-приложения могут использовать собственную оболочку etcd.gRPCУмный API для протокола, взаимодействующий исключительно с etcd. Этот API предоставляет выразительные распределенные функции, доступные только на etcd. Что еще более важно, за счет непосредственной поддержки большего количества языков проще писать новые приложения для etcd с новыми шаблонами использования, помогая etcd стать более стабильным и надежным.

Новичок

Вы можете сделать это, создав и запустивjetcdctlизнебольшой пример программыДавайте попробуем jetcd, программа использует jetcd для доступа к etcd. Пример jetcdctl также является хорошей отправной точкой для дальнейших проектов jetcd. Чтобы продолжить обучение, вам также потребуются установленные Git и Java.

Сначала клонируйте репозиторий jetcd, чтобы получить исходный код jetcd, а затем используйте Maven для сборки.jetcd-simple-ctlБар:

$ git clone https://github.com/coreos/jetcd.git
$ cd jetcd/jetcd-examples/jetcd-simple-ctl
$ ./mvnw clean package

Построен и готов к запускуjetcdctlПосле этого загрузитедистрибутив etcdИ запустите службу etcd локально. (Примечание переводчика: если следующая команда «go get» не работает должным образом, вы можете обратиться кинформация здесь):

# build with “go get github.com/coreos/etcd/cmd/etcd”
$ etcd &

Далее используйтеjetcdctlбудет123написатьabc, для связи с локальным сервером etcd:

$ java -jar target/jetcdctl.jar put abc 123
21:39:06.126|INFO |CommandPut - OK

ты можешь читатьabcЧтобы подтвердить правильность команды put, записанной в etcd:

$ java -jar target/jetcdctl.jar get abc 21:41:00.265|INFO |CommandGet - abc 21:41:00.267|INFO |CommandGet - 123

Мы продемонстрировали базовую функциональность jetcd с помощью ключей get и put. Теперь давайте подробнее рассмотрим, как использовать jetcd в нашем коде.

Улучшенные функции часов (наблюдение)

API jetcd может легко управлять базовым etcd.gRPCпротокол. Примером может служить событие потокового ключа, когда клиент наблюдает за ключом, а сервер etcd постоянно отправляет клиенту обновления. Клиент jetcd управляет низкоуровневым потоком gRPC, который корректно обрабатывает отключения и представляет пользователю непрерывный поток событий.

Если приложение jetcd желает получать все обновления для ключа, оно будет использоватьwatchAPI для созданияWatcher:

Watcher watch(ByteSequence key)

WatcherизlistenМетод для чтения из EtCDWatchResponseИнформация. каждыйWatchResponseСодержит последнюю последовательность событий на отслеживаемом ключе. Если событий нет, тоlistenЗаблокирован до обновления.listenМетод надежен, он не сбрасывает никаких событий между вызовами, даже при отключении:

WatchResponse listen() throws InterruptedException

Короче говоря, клиент создаетWatcher, затем используйтеlistenждать события. Ниже находится ключabcКод, который делает наблюдение выше, печатает наблюдаемый ключ и значение до тех пор, покаlistenВыдает исключение: Короче говоря, клиент создаетWatcher, затем используйтеlistenждать события. Ниже приведен ключ наблюденияabcкод, который печатает ключ и значение, покаlistenВыбросить исключение:

Client client = Client.builder().endpoints(“http://127.0.0.1:2379).build();
Watcher watcher = client.getWatchClient().watch(ByteSequence.fromString("abc"));
while (true) {
    for (WatchEvent event : watcher.listen().getEvents()) {
        KeyValue kv = event.getKeyValue();
        System.out.println(event.getEventType());
        System.out.println(kv.getKey().toStringUtf8());
        System.out.println(kv.getValue().toStringUtf8());
    }
}

Совместите эту функцию с аналогом etcd Apache Foundation.ZooKeeperСравнивать. Начиная с ZooKeeper 3.4.10,часы - это уже одноразовый триггер, что означает, что после получения события наблюдения вы должны установить новое наблюдение, чтобы получать уведомления об изменениях в будущем. Для передачи ключевых событий он должен обращаться к кластеру для регистрации нового наблюдателя для каждого нового события.

Чтобы постоянно печатать содержимое ключа по мере его обновления, приложение ZooKeeper сначала создаетWatcherслушатьWatchedEventИнформация. Наблюдатель реализует метод обратного вызова события.process, который вызывается при изменении ключа. Чтобы зарегистрировать интерес к событию, необходимо добавить наблюдателя вexistsметод, который получает метаданные ключа (если есть). При изменении ключа наблюдательprocessметод будет вызыватьсяgetDataчтобы получить значение ключа, а затем снова зарегистрировать того же наблюдателя, чтобы получать будущие изменения следующим образом:

key = “/abc”;
Watcher w = new Watcher() {
  public void process(WatchedEvent event) {
    try {
      System.out.println(event.getType());
      System.out.println(event.getPath());
      if (event.getType() != EventType.NodeDeleted) {
        System.out.println(new String(zk.getData(event.getPath(), false, null)));
      }
      zk.exists(key, this);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
};
zk.exists(key, w);

В отличие от примера с jetcd, код ZooKeeperНет гарантии, что он соблюдает все изменения, так как существует задержка между получением события наблюдателем и отправкой запроса на получение новых часов. Например, при выполненииprocessи позвониexistsПроизошло событие между регистрацией нового сторожевого таймера. Поскольку наблюдатели не зарегистрированы, событие никогда не запускается и теряется.

Даже если предположить, что все события сработали, код все равно может прервать поток событий. Не предоставлено etcdМноговерсионный контроль параллелизма, исторический ключ недоступен. Если значение ключа изменится между получением события и получением данных, код выведет последнее значение вместо значения, связанного с событием наблюдения. Что еще хуже, к событию не прикреплена информация о ревизии; невозможно определить, был ли получен ключ из события или из будущего возврата.

Версия v0.0.1 и планы на будущее

Начиная с версии 0.0.1, jetcd поддерживает хранилища ключей и значений, необходимые большинству приложений. Эти примитивы можно использовать в качестве строительных блоков для сложных шаблонов, таких как распределенные очереди, барьеры и т. д. В будущем jetcd сможет использовать локальные блокировки etcd и RPC для выбора лидера для стандартизированной распределенной координации в масштабах всего кластера.

jetcd спроектирован таким образом, чтобы его было легко использовать, но в то же время он использует расширенные функции etcd. Он с открытым исходным кодом и находится в активной разработке, поэтому приветствуются вклады и отзывы сообщества. Мы можем найти его на GitHub по адресуGitHub.com/core OS/jet C….

Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.


Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из ИнтернетаНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.