Apache Kafka — популярная распределенная потоковая платформа, которая позволяет публиковать потоки записей и подписываться на них в режиме реального времени. Одной из ключевых особенностей Kafka является ее способность поддерживать мультитенантность, которая позволяет нескольким независимым приложениям или арендаторам совместно использовать один кластер Kafka, обеспечивая при этом изоляцию данных и распределение ресурсов. В этой статье мы углубимся в концепцию мультитенантности в Apache Kafka и рассмотрим различные методы ее реализации, дополненные примерами кода.
Содержание:
- Понимание мультитенантности в Apache Kafka
- Метод 1: мультитенантность на основе тем
- Метод 2: мультитенантность на основе разделов
- Метод 3: мультитенантность на основе ACL (списка управления доступом).
- Метод 4. Виртуальные кластеры
- Метод 5: Kafka Connect и многопользовательская среда
- Заключение
Понимание мультитенантности в Apache Kafka.
Мультиарендность в Apache Kafka означает возможность сосуществования нескольких изолированных сред или арендаторов в одном кластере Kafka. Каждый арендатор может иметь свой собственный набор тем, производителей, потребителей и средства управления доступом, одновременно используя общую базовую инфраструктуру. Это позволяет эффективно использовать ресурсы и экономить средства.
Метод 1: мультитенантность на основе тем.
При этом подходе каждому арендатору назначается набор выделенных тем. Арендаторы могут создавать и потреблять сообщения только в/из своих соответствующих тем. Этот метод обеспечивает надежную изоляцию данных, но может потребовать дополнительного администрирования для управления созданием тем и контролем доступа.
Пример кода:
// Creating a new Kafka topic for a tenant
AdminClient adminClient = AdminClient.create(properties);
NewTopic newTopic = new NewTopic("tenant1_topic", 1, (short) 1);
adminClient.createTopics(Collections.singletonList(newTopic)).all().get();
// Producing messages to a tenant-specific topic
Properties producerProps = new Properties();
producerProps.put("bootstrap.servers", "kafka-cluster:9092");
producerProps.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
producerProps.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
KafkaProducer<String, String> producer = new KafkaProducer<>(producerProps);
ProducerRecord<String, String> record = new ProducerRecord<>("tenant1_topic", "key", "value");
producer.send(record);
Метод 2: мультитенантность на основе разделов.
В этом методе каждому арендатору назначается подмножество разделов внутри темы. Арендаторы могут создавать и потреблять сообщения только из выделенных им разделов. Такой подход обеспечивает детальный контроль над распределением ресурсов и обеспечивает лучший параллелизм.
Пример кода:
// Assigning partitions to a tenant
Map<TopicPartition, List<PartitionInfo>> partitions = adminClient.describeTopics(Collections.singleton("shared_topic")).all().get();
List<TopicPartition> assignedPartitions = new ArrayList<>();
for (TopicPartition partition : partitions.keySet()) {
if (partition.partition() % numTenants == tenantId) {
assignedPartitions.add(partition);
}
}
consumer.assign(assignedPartitions);
// Consuming messages from assigned partitions
ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
for (ConsumerRecord<String, String> record : records) {
System.out.println("Received message: " + record.value());
}
Метод 3. Мультитенантность на основе ACL (списка управления доступом):
Этот подход использует встроенный механизм ACL Kafka для управления доступом к темам на основе ролей и разрешений пользователей. Каждому арендатору присваивается уникальный идентификатор пользователя, и он может получить доступ только к тем темам, к которым ему предоставлен доступ.
Пример кода:
# Creating a new user for a tenant
bin/kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:tenant1 --operation Read --topic tenant1_topic
# Producing messages as a tenant
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic tenant1_topic --producer.config client.properties
# Consuming messages as a tenant
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic tenant1_topic --consumer.config client.properties
Метод 4. Виртуальные кластеры.
Виртуальные кластеры позволяют логически разделить арендаторов внутри одного физического кластера Kafka. Каждый виртуальный кластер имеет собственный набор ресурсов, таких как брокеры, темы и списки управления доступом, что обеспечивает полную изоляцию между арендаторами.
Пример кода:
Конфигурация виртуального кластера может различаться в зависимости от используемого средства распространения или развертывания Kafka. Инструкции по настройке виртуальных кластеров см. в документации, относящейся к вашему развертыванию.
Метод 5: Kafka Connect и многопользовательская среда:
Apache Kafka Connect позволяет интегрировать внешние системы с Kafka. Используя многопользовательскую архитектуру Connect, вы можете настроить соединители для подключения источников данных разных арендаторов к Kafka, сохраняя при этом изоляцию данных и управление ресурсами.
Пример кода:
Конфигурация Kafka Connect для мультитенантности включает настройку отдельных конфигураций соединителя для каждого арендатора с указанием необходимых параметров аутентификации и авторизации.