Apache Kafka на Windows Server — Компьюпико.ком

Apache Kafka на Windows Server

Подробно расскажем что такое Apache Kafka, для чего нужен, как установить и использовать. В статье развернём Kafka на Windows Server, создадим топик, продюсер, отправим сообщение и прочитаем его при помощи консьюмера. Наладим сообщение между двумя георграфически удаленными серверами. И конечно же потеоретизируем где это чудо может быть применено. Заходи, будет интересно!

Что это такое и с чем его едят?

«More than 80% of all Fortune 100 companies trust, and use Kafka» (перевод — Более 80% крупных компаний доверяют и используют Кафка). Такая надпись красуется на главной странице проекта Apache Kafka. В каждой второй вакансии Apache Kafka фигурирует в списке must-have скилов.

Что же это за Кашфка такая? Apache Kafka — платформа для обработки потоков данных(сообщений) в реальном времени. Используется для передачи, хранения и обработки событий между системами. Проще говоря, ещё одна реализация передачи данных между системами/сервисами/программами наряду с файловым обменом, обменом через БД и т.д. В качестве достоинств по сравнению со своими собратьями отмечается скорость и производительность, Масштабируемость, Низкая задержка, Надёжность, Гибкость, Отделение отправителя и получателя.

Всё это сухая теория. Давайте опробуем Kafka на практике.

Установка Apache Kafka на Windows Server

Для экспериментов был развернут вот такой тестовый стенд (вам понадобится такой же или мощнее): Windows Server 2012 R2 (ENG), 1×3.4ГГц, 2Гб RAM, 50Гб HDD

Для успешной установки Apache Kafka, поданобятся следующие дистрибутивы:

1. JDK (Мы использовали дистрибутив Amazon Coretto https://aws.amazon.com/corretto). Для примера использовался пакет amazon-corretto-17-x64-windows-jdk.msi для Windows x64 (https://docs.aws.amazon.com/corretto/latest/corretto-17-ug/downloads-list.html)

Скачайте дистрибутив, запустите установщик. После установки, проверьте, что Java корректно установился в системе. Для этого откройте окно Power Shell и выполните команду

java -version

Если всё хорошо, ответ будет таким.

Java Power Shell

2. Apache Kafka Binary download (https://kafka.apache.org/downloads) Мы использовали пакет kafka_2.13-4.0.0.tgz 

Скачайте архив и разархивируйте в папку C:\kafka, в результате на диске C:\ должна появится папка C:\kafka\kafka_2.13-4.0.0 со следующим содержимым

Kafka Windows folder

Настройка Apache Kafka на Windows Server

#Все операции в Power Shell связанные с настройкой и запуском Kafka рекомендуется выполнять от имени Администратора. В противном случае могут возникать ошибки связанные с доступом к файловой системе.

  1. Найдите и отредактируйте файл C:\kafka\kafka_2.13-4.0.0\config\server.properties
controller.quorum.bootstrap.servers=localhost:9093
Меняем на controller.quorum.voters=1@localhost:9093

listeners=PLAINTEXT://:9092,CONTROLLER://:9093
Меняем на listeners=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093 

advertised.listeners=PLAINTEXT://localhost:9092,CONTROLLER://localhost:9093
Меняем на advertised.listeners=PLAINTEXT://ip вашего сервера:9092,CONTROLLER://ip вашего сервера:9093

log.dirs=/tmp/kraft-combined-logs
Меняем на log.dirs=C:/kafka/kraft-combined-logs

2. Откройте Power Shell и перейдите в дирректорию C:\kafka\kafka_2.13-4.0.0 для этого введите команду

cd C:\kafka\kafka_2.13-4.0.0

3. Выполните команду

bin\windows\kafka-storage.bat random-uuid

4. Полученный uuid используем в следующем запросе

bin\windows\kafka-storage.bat format -t uuid -c config\server.properties

5. Откройте порт 9092 для того, чтобы к серверу Kafka можно было подключаться извне

New-NetFirewallRule -DisplayName "Kafka Port 9092" -Direction Inbound -LocalPort 9092 -Protocol TCP -Action Allow

Запуск Apache Kafka на Windows Server

Теперь запустим сервер Apache Kafka используя команду PowerShell

bin\windows\kafka-server-start.bat config\server.properties

В результате выполнения команды Power Shell выдаст большой инфолог, в коце инфолога, как правило, должна быть надпись «Server started» или что-то подобное.

ВАЖНО. После запуска сервера Kafka нельзя закрывать окно Power Shell. Сервер работает, пока окно Power Shell открыто (не спрашивайте почему)

После запуска проверим, слушается ли порт. Для этого выполним команду PowerShell

netstat -an | findstr :9092

Если всё хорошо, увидим вот такое сообщение

Kafka Listener

Создаём Топик MyFirstTopic в Apache Kafka на Windows Server

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

bin\windows\kafka-topics.bat --create --topic MyFirstTopic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1

Поздравляю! Наш первый топик успешно создан.

Kafka Topic

Создаём producer и посылаем сообщение в Топик MyFirstTopic

В этом же окне PowerShell напишем команду (не забываем, что сервер kafka должен быть запущен и открыт в отдельном окне PowerShell)

bin\windows\kafka-console-producer.bat --topic MyFirstTopic --bootstrap-server localhost:9092

Если в результате выполнения скрипта PowerShell вывел строку ввода, то всё сделано правильно

Kafka Producer

Давайте отправим наше первое сообщение! Просто введите Hello и нажмите Enter

Создаём consumer и принимаем сообщение из Топика MyFirstTopic

Открываем новое окно PowerShell и выполняем команду

bin\windows\kafka-console-consumer.bat --topic MyFirstTopic --from-beginning --bootstrap-server localhost:9092

В результате в одном окне PowerShell у нас будет работать producer, который посылает сообщения в топик, а во втором окне будет работать consumer

Kafka producer consumer

Как прочитать сообщение на другом сервере?

Выше мы рассмотрели общий принцип работы брокера сообщений Apache Kafka. В рамках одного сервера мы развернули сервер kafka, создали топик, запустлии producer для отправки сообщений и consumer для чтения.

Усложним задачу. Давайте теперь отправим сообщение на одном сервере, а прочитаем на другом. Для этого нам понадобится

  1. Второй Windows Server
  2. JDK
  3. Apache Kafka Binary download

С одним важным исключением. На этот раз настраивать Apache Kafka не нужно и запускать сервер тоже не нужно. Просто устанавливаем JDK и разархивируем apache в знакомую папку C:\kafka\kafka_2.13-4.0.0

Теперь, чтобы прочитать сообщения посланные с другого сервера, достаточно выполнить следующую команду PowerShell

bin\windows\kafka-console-consumer.bat --topic MyFirstTopic --bootstrap-server ip_удаленного_сервера:9092 --from-beginning

В результате сообщение отправленное с Server 1 успешно отображается на Server 2

Kafka Windows Server

Практическое применение

Теория — это хорошо, но как насчёт практического использования? Я вижу как минимум такие варианты:

  1. Написать PowerShell скрипты, которые будут запускаться по расписанию, читать топики и что-то длать с полученной информацией (записывать в файл для последующей обработки прикладными программами, обрабатывать и отправлять ответ);
  2. Использовать сторонние библиотеки для работы с Apache Kafka, чтобы интегрировать функционал в различные системы (ERP, CRM, .Net, Мобильные приложения и т.д.);
  3. Вызвать методы Apache Kafka стандартными Windows методами, прочитать данные и обработать внутри прикладной программы (например, .Net C#).

Давайте рассмотрим третий вариант. Чтобы понять как потенциал Kafka может быть раскрыт, давайте напишем простую программу на C# (.Net Console application), которая будет:

  • Слушать топик MyFirstTopic
  • Читать сообщения и выводить их на экран
  • При получении сообщения <important>Важное сообщение</important> будет логировать его в файл important_messages.log

Листинг программы приведен ниже. Для сборки используйте VisualStudio 2019 и выше, .Net Framework 4 и выше.

using System;
using System.Diagnostics;
using System.IO;
using System.Text.RegularExpressions;

namespace KafkaTest
{
    class Program
    {
        static string ExtractImportantMessage(string input)
        {
            var match = Regex.Match(input, "<important>(.*?)</important>");
            return match.Success ? match.Groups[1].Value : string.Empty;
        }


        static void Main(string[] args)
        {
            string kafkaPath = @"C:\kafka\kafka_2.13-4.0.0\bin\windows\kafka-console-consumer.bat";
            string arguments = "--topic MyFirstTopic --from-beginning --bootstrap-server localhost:9092";


            var process = new Process
            {
                StartInfo = new ProcessStartInfo
                {
                    FileName = "cmd.exe",
                    Arguments = $"/C \"{kafkaPath}\" {arguments}",
                    RedirectStandardOutput = true,
                    UseShellExecute = false,
                    CreateNoWindow = true
                }
            };

            process.OutputDataReceived += (sender, e) =>
            {
                if (!string.IsNullOrEmpty(e.Data))
                {
                    Console.WriteLine($"Kafka сообщение: {e.Data}");

                    if (e.Data.Contains("<important>"))
                    {
                        var extracted = ExtractImportantMessage(e.Data);
                        if (!string.IsNullOrEmpty(extracted))
                        {
                            File.AppendAllText("important_messages.log", $"{DateTime.Now}: {extracted}{Environment.NewLine}");
                        }
                    }
                }
            };

            process.Start();
            process.BeginOutputReadLine();

            Console.WriteLine("Нажмите Enter для выхода...");
            Console.ReadLine();

            process.Kill(); 
        }
    }
}

Результат выполнения программы

Kafka .Net Consumer Tutorial
Слева PowerShell окно с Procucer-ом, справа .Net(C#) консольное приложение-consumer, и текстовый файл куда сохранены сообщения <important>

Потребление памяти

Стоит так же обратить внимание на прожорливость Apache Kafka. На слабых серверах с ограниченным количеством оперативной памяти он так и норовит упасть в ошибку. На нашем тестомов сервере с 2GB оперативной памяти нам пришлось поменять конфигурационные файлы.

В файле kafka-console-consumer.bat пришлось изменить параметры памяти на
set KAFKA_HEAP_OPTS=-Xms64m -Xmx128m

В файле kafka-server-start.bat изменили параметры памяти на
rem 64-bit OS
set KAFKA_HEAP_OPTS=-Xms512m -Xmx512m

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *