Franz-go: когда вам нужен полный контроль над Kafka на Go

29 May, 2026

Логотип franz-go

Знакомы с ситуацией, когда стандартные клиенты для Kafka не дают нужной гибкости или скорости? Или когда приходится жертвовать функциональностью ради производительности? Franz-go — это ответ на все подобные дилеммы.

Что это за зверь?

Franz-go — это нативный Go-клиент для Apache Kafka, который поддерживает все версии протокола от 0.8.0 до 4.0+. В отличие от многих аналогов, он:

  • Написан полностью на Go (никаких оберток над C-библиотеками)
  • Поддерживает абсолютно все фичи Kafka
  • В 2-4 раза быстрее популярных альтернатив
  • Имеет продуманный идиоматичный API

Кому это нужно? Всем, кто работает с Kafka на Go и хочет:

  • Максимальной производительности
  • Полного контроля над взаимодействием с брокерами
  • Современных возможностей вроде Exactly-Once Semantics

Топ-5 причин обратить внимание

1. Полная поддержка всех версий Kafka

От древнего 0.8.0 до свежего 4.0+ — franz-go понимает их все. Причем не просто «поддерживает», а реализует все KIP (Kafka Improvement Proposals), которых на момент написания более 100!

Реклама

2. Идиоматичный Go-интерфейс

Вот как выглядит базовый пример работы с клиентом:

seeds := []string{"localhost:9092"}
cl, err := kgo.NewClient(
    kgo.SeedBrokers(seeds...),
    kgo.ConsumerGroup("my-group"),
    kgo.ConsumeTopics("foo"),
)
// Обработка ошибок и т.д.

Контексты, variadic options, минимальное использование горутин там, где можно без них обойтись — все как мы любим в Go.

3. Транзакции и Exactly-Once Semantics

Полноценная поддержка транзакционных операций — то, чего часто не хватает в других клиентах:

// Начало транзакции
if err := cl.BeginTransaction(); err != nil {
    // Обработка ошибки
}

// Производим сообщения в транзакции
cl.Produce(ctx, &kgo.Record{Topic: "foo", Value: []byte("bar")}, nil)

// Фиксация
if err := cl.EndTransaction(ctx, kgo.TryCommit); err != nil {
    // Обработка ошибки
}

4. Гибкость администрирования

Встроенный административный клиент позволяет управлять кластером прямо из кода:

adm := kadm.NewClient(cl)
// Создаем топик
_, err := adm.CreateTopic(ctx, "new_topic", 3, 1)
// Получаем список топиков
topics, err := adm.ListTopics(ctx)

5. Сумасшедшая производительность

По тестам автора:

  • В 4 раза быстрее confluent-kafka-go при производстве сообщений
  • В 2.5 раза быстрее sarama
  • До 6 раз быстрее kafka-go от Segment при потреблении

Под капотом

Franz-go избегает излишнего использования горутин и каналов там, где можно обойтись без них. Это дает:

  • Меньшие накладные расходы
  • Более предсказуемое потребление памяти
  • Лучшую управляемость ресурсами

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

Кто уже использует?

Среди пользователей проекта:

  • Alpaca
  • Hilton
  • Unity Technologies
  • Zomato
  • Redpanda (используют в своем веб-интерфейсе)

Стоит ли пробовать?

Определенно да, если:

  1. Вам нужен максимально полный Kafka-клиент на Go
  2. Критична производительность
  3. Хотите использовать современные фичи вроде транзакций
  4. Работаете с разными версиями Kafka

Установка проста:

go get github.com/twmb/franz-go

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

Franz-go — это тот случай, когда проект сочетает в себе мощь, элегантность и внимание к деталям. Если вы работаете с Kafka на Go, это must-have в вашем инструментарии.