Работа с Kafka в Swift (iOS/macOS): библиотеки, клиенты и примеры
Apache Kafka — это распределённая платформа для потоковой передачи данных, которая широко используется для построения event-driven архитектур, сбора логов, обработки аналитики и работы с микросервисами. В экосистеме Swift (iOS/macOS) Kafka не является нативной технологией, но существуют несколько зрелых библиотек, которые позволяют интегрировать Swift-приложения с брокерами Kafka. В этой статье мы разберём основные инструменты, их установку и напишем простого продюсера и консьюмера на Swift.
Зачем нужен Kafka в Swift-приложении?
Хотя Kafka чаще всего ассоциируется с серверным бэкендом, мобильные и десктопные приложения на Swift могут использовать Kafka для:
- Получения push-уведомлений в реальном времени через WebSocket + Kafka;
- Отправки событий пользовательского поведения на аналитический сервер;
- Синхронизации данных между несколькими устройствами в реальном времени;
- Логирования на стороне клиента с последующей отправкой в централизованную систему.
Основные библиотеки для работы с Kafka в Swift
На данный момент существует три основных подхода к интеграции Kafka в Swift-проекты:
1. Confluent Swift Client (рекомендуемый)
Confluent Swift Client — это официальная обёртка над librdkafka от компании Confluent. Библиотека поддерживает полный набор функций: продюсеры, консьюмеры, администрирование топиков, SSL, SASL-аутентификацию. Работает на iOS и macOS.
Установка через Swift Package Manager:
// Package.swift
dependencies: [
.package(url: "https://github.com/confluentinc/confluent-kafka-swift.git", from: "0.1.0")
]
Пример продюсера (Producer) на Swift
Создадим простого продюсера, который отправляет строку в топик test-topic:
import ConfluentKafka
let config = KafkaConfig()
config["bootstrap.servers"] = "localhost:9092"
config["client.id"] = "swift-producer"
let producer = try KafkaProducer(config: config)
let message = "Привет из Swift!"
let record = KafkaProducerRecord(topic: "test-topic", value: message.data(using: .utf8)!)
try producer.send(record: record) { error, deliveryReport in
if let error = error {
print("Ошибка отправки: \(error)")
} else {
print("Сообщение отправлено в partition \(deliveryReport?.partition ?? -1)")
}
}
producer.flush()
Пример консьюмера (Consumer) на Swift
import ConfluentKafka
let config = KafkaConfig()
config["bootstrap.servers"] = "localhost:9092"
config["group.id"] = "swift-consumer-group"
config["auto.offset.reset"] = "earliest"
let consumer = try KafkaConsumer(config: config)
try consumer.subscribe(topics: ["test-topic"])
while true {
let records = try consumer.poll(timeout: 1.0)
for record in records {
if let value = record.value {
let message = String(data: value, encoding: .utf8) ?? "не удалось декодировать"
print("Получено: \(message)")
}
}
}
2. KafkaSwift (легковесная альтернатива)
KafkaSwift — это минималистичная библиотека, написанная на чистом Swift без зависимостей от C-библиотек. Подходит для простых сценариев, но не поддерживает продвинутые функции (SSL, SASL, партиционирование).
Установка: через CocoaPods: pod 'KafkaSwift'.
Пример отправки:
import KafkaSwift
let kafka = try Kafka(host: "localhost", port: 9092)
try kafka.send(message: "Тестовое сообщение", topic: "test-topic")
3. Perfect-Kafka (для серверного Swift)
Perfect-Kafka — часть фреймворка Perfect, ориентированная на серверные приложения на Swift (macOS, Linux). Использует librdkafka и предоставляет асинхронный API.
Пример продюсера:
import PerfectKafka
let producer = try Kafka.Producer(brokers: "localhost:9092")
try producer.send(topic: "test-topic", message: "Hello from Perfect")
Сравнение библиотек
- Confluent Swift — полный функционал, поддержка iOS, macOS, SSL, SASL, активно обновляется.
- KafkaSwift — лёгкая, без зависимостей, но без поддержки безопасности и сложной маршрутизации.
- Perfect