Введение в Apache Pulsar

Введение в Apache Pulsar

1. Вступление

Apache Pulsar is a distributed open source Publication/Subscription based messaging system developed at Yahoo.

Он был создан для поддержки важных приложений Yahoo, таких как Yahoo Mail, Yahoo Finance, Yahoo Sports и т. Д. Затем, в 2016 году, он был открыт с помощью Apache Software Foundation.

2. Архитектура

Pulsar is a multi-tenant, high-performance solution for server-to-server messaging. Он состоит из набора брокеров и букмекеров, а также встроенногоApache ZooKeeper для настройки и управления. Букмекеры изApache BookKeeper обеспечивают хранение сообщений до их использования.

В кластере у нас будет:

  • Несколько кластерных брокеров для обработки входящего сообщения от производителей и отправки сообщения потребителям

  • Apache BookKeeper для поддержки сохранения сообщений

  • Apache ZooKeeper для хранения конфигурации кластера

Чтобы лучше понять это, давайте взглянем на диаграмму архитектуры изdocumentation:

image

3. Ключевая особенность

Давайте начнем с краткого обзора некоторых основных функций:

  • Встроенная поддержка нескольких кластеров

  • Поддержка гео-репликации сообщений в нескольких кластерах

  • Несколько режимов подписки

  • Масштабируется до миллионов тем

  • Использует Apache BookKeeper для гарантии доставки сообщений.

  • Низкая задержка

Теперь давайте подробно обсудим некоторые ключевые особенности.

3.1. Модель обмена сообщениями

Структура обеспечивает гибкую модель обмена сообщениями. В общем случае архитектуры обмена сообщениями имеют две модели обмена сообщениями, т.е. Очередь и издатель / подписчик. Publisher/Subscriber is a broadcast messaging system in which the message is sent to all consumers. С другой стороны, организация очередей является связью точка-точка.

Pulsar combines both concepts in one generalized API. Издатель публикует сообщения на разные темы. Затем эти сообщения транслируются на все подписки.

Потребители подписываются на получение сообщений. Библиотека позволяет потребителям выбирать различные способы использования сообщений в одной и той же подписке, включая эксклюзивные, общие и аварийные переключения. Мы подробно обсудим эти типы подписок в следующих разделах.

3.2. Режимы развертывания

Pulsar has inbuilt support for deployment in different environments. Это означает, что мы можем использовать его на стандартных локальных компьютерах или развернуть в кластере Kubernetes, Google или в облаке AWS.

Он может быть выполнен как единый узел для целей разработки и тестирования. В этом случае все компоненты (брокер, BookKeeper и ZooKeeper) выполняются в одном процессе.

3.3. Гео-репликации

The library provides out of the box support for geo-replication of data. Мы можем включить репликацию сообщений между несколькими кластерами, настроив разные географические регионы.

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

The geo-replication feature also allows the organization to deploy Pulsar across different cloud providers and replicate the data. Это помогает им избежать использования собственных API-интерфейсов провайдера облака.

3.4. неизменность

After Pulsar reads and acknowledges the data, it guarantees no data loss. Надежность данных связана с количеством дисков, сконфигурированных для хранения данных.

Pulsar обеспечивает долговечность благодаря использованию букмекеров (экземпляр Apache BookKeeper), работающих в узлах хранения. Всякий раз, когда букмекер получает сообщение, он сохраняет копию в памяти, а также записывает данные в WAL (журнал записи вперед). Этот журнал работает так же, как база данных WAL. Букмекеры работают по принципу транзакций базы данных и гарантируют, что данные не будут потеряны даже в случае сбоя компьютера.

Помимо вышесказанного, Pulsar также может противостоять отказам нескольких узлов. Библиотека реплицирует данные в несколько книг, а затем отправляет сообщение-подтверждение производителю. Этот механизм гарантирует нулевую потерю данных даже в случае нескольких аппаратных сбоев.

4. Настройка одного узла

Теперь давайте посмотрим, как настроить одноузловой кластер Apache Pulsar.

Apache also provides a simple client API with bindings for Java, Python, and C++. Позже мы создадим простой пример производителя Java и подписки.

4.1. Монтаж

Apache Pulsar доступен в виде бинарного дистрибутива. Начнем со загрузки:

wget https://archive.apache.org/dist/incubator/pulsar/pulsar-2.1.1-incubating/apache-pulsar-2.1.1-incubating-bin.tar.gz

Когда загрузка будет завершена, мы можем разархивировать zip-файл. Неархивированный дистрибутив будет содержать папкуbin, conf, example, licenses иlib.

После этого нам нужно скачать встроенные разъемы. Теперь они поставляются в виде отдельного пакета:

wget https://archive.apache.org/dist/incubator/pulsar/pulsar-2.1.1-incubating/apache-pulsar-io-connectors-2.1.1-incubating-bin.tar.gz

Разархивируем коннекторы и скопируем папкуConnectors  в папку Pulsar.

4.2. Запуск экземпляра

Чтобы запустить автономный экземпляр, мы можем выполнить:

bin/pulsar standalone

5. Java-клиент

Теперь мы создадим Java-проект для создания и использования сообщений. Мы также создадим примеры для разных типов подписок.

5.1. Настройка проекта

Начнем с добавления в наш проект зависимостиpulsar-client:


    org.apache.pulsar
    pulsar-client
    2.1.1-incubating

5.2. Режиссер

Давайте продолжим создание примераProducer. Здесь мы создадим тему и продюсера.

First, we need to create a PulsarClient which will connect to a Pulsar service on a specific host and port, подозревает собственный протокол. Многие производители и потребители могут совместно использовать один объект клиента.

Теперь мы создадимProducer с конкретным названием темы:

private static final String SERVICE_URL = "pulsar://localhost:6650";
private static final String TOPIC_NAME = "test-topic";
PulsarClient client = PulsarClient.builder()
  .serviceUrl(SERVICE_URL)
  .build();

Producer producer = client.newProducer()
  .topic(TOPIC_NAME)
  .compressionType(CompressionType.LZ4)
  .create();

Производитель отправит 5 сообщений:

IntStream.range(1, 5).forEach(i -> {
    String content = String.format("hi-pulsar-%d", i);

    Message msg = MessageBuilder.create()
      .setContent(content.getBytes())
      .build();
    MessageId msgId = producer.send(msg);
});

5.3. потребитель

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

Consumer consumer = client.newConsumer()
  .topic(TOPIC_NAME)
  .subscriptionType(SubscriptionType.Shared)
  .subscriptionName(SUBSCRIPTION_NAME)
  .subscribe();

Здесь мы создали клиента с типом подпискиShared, что позволяет нескольким потребителям присоединяться к одной подписке и получать сообщения.

5.4. Типы подписок для потребителей

В приведенном выше примере потребителяwe have created a subscription with shared type. We can also create exclusive and failover subscriptions.

Подпискаexclusive позволяет подписаться только одному потребителю.

С другой стороны, failover subscription позволяет пользователю определить резервного потребителя на случай отказа одного потребителя, как показано на этой диаграмме Apache:

image

6. Заключение

В этой статье мы осветили особенности системы обмена сообщениями Pulsar, такие как модель обмена сообщениями, георепликация и надежные гарантии надежности.

Мы также узнали, как настроить отдельный узел и как использовать клиент Java.

Как всегда, полную реализацию этого руководства можно найти вover on Github.