Pull to refresh

Comments 20

Отличное качество обзора! Технический пост, а не маркетинговый булшит от Сбертеха, как в этом блоге бывало. И что самое приятное — указали область применимости.
Присоединяюсь. Отличная статья. Подписался на блог)
Обзор неплохой, но на предложении о современном банке я конечно взоржал немножк:)
такие же чувства. Раз в месяц ручками в эксельке формирую список лицевых счётов. Выгрузка реестра платежей через человека — бесплатно, интеграция онлайн — за деньги.
Спасибо за статью! Продолжайте. Если возможно написать серию статей про установку и настройку, было бы интересно.
Отлично и достаточно подробно показана эволюция решений для массовой обработки данных, тем более в таких требовательных системах, как банки. Правда, CQRS это все же Command-Query Responsibility Segregation
Тоже резануло глаз :)
А в целом, за статью спасибо.
Очень полезно. Имхо, можно было бы разбить на несколько статьей.
Спасибо большое, поправили!
Я так и не понял, может пропустил, что или как победило дубликаты. Придется перечитать ещё разок, чтобы добраться до золотой сути. Может она даже где — то там и есть.

Вообще, проблема мне кажется в двух основных свойствах Кафка. Первое, это бесплатный продукт. Поэтому его commit это вещь совершенно эфемерная. То есть даже если в коде стоит «noop», то с точки зрения Кафка, это приемлемо. Ведь не секрет, что Американская фирма по производству батареек на заре своего существования укладывала в корпус батареек грунт со двора предприятия, и пользуясь колоссальной дешевизной исходного сырья продавала свои изделия за половину стоимости конкурентов.

По сей причине повторяющийся припев писателя, что мол «но ведь это не применимо, там, где речь идет о деньгах вкладчиков» слушается с юмором. Это конечно очень хорошо, что автор это понимает. Но как — то вот это самое понимание с действиями вместе не очень консистентно.

Вторая, если мое очень поверхностное знакомство с Кафкой я запомнил верно, у Кафка есть возможность воспользоваться разными носителями для хранения записей. По умолчанию она воспользуется файловой системой. И тут commit очень сильно зависит от файловой системы, и даже сборки машины, которая её обеспечивает. Но есть возможность и воспользоваться СУБД. Тем самым открывая доступ к хорошо проверенному механизму обеспечения операции commit. Но тогда КАФКА становится ни чем иным, как ширмой для СУБД.

Что касается скорости обработки пакетов, то простейшая extended procedure на с для Microsoft SQL Server с одним CPU Pentium 2.0 и 1 GB памяти поддерживал производительность 60,000 пакетов в секунду.

То есть в принципе статья конечно полезная, автору огромное спасибо. Но умудриться так долго говорить о дубликатах и производительности, не приведя ни одного эксперимента ( а для сравнения их нужно как минимум два ) получается двойственное ощущение богатого материала и отсутствия сути.
поддерживал производительность 60,000 пакетов в секунду.

Что такое пакеты?
Присоединяюсь к комментариям выше!!.. Статья понравилась. Подписываюсь на блог
система в бою уже? Сколько серверов в production у кафки и какой суммарный объем сообщений в секунду обрабатывается?
Три системы в стадии опытной эксплуатации.
Наиболее близкая по архитектуре, описанной в статье, система сейчас обрабатывает около 3000 сообщений в секунду. Размер сообщений единицы килобайт.
Планируем запускать потоки, которые увеличат нагрузку в 10 раз. Под эту нагрузку развернули кластер из 6 брокеров Kafka.

0) В мире open source есть зилиард различных messaging solutions и messaging midlleware (zeromq, activemq, rabbitmq) Хотя бы два слова, почему взгляд пал на Kafka?


1) Так из-за чего возникают дубликаты? Можете расписать по шагам в каком сценарии kafka пересылает сообщение consumer'у повторно? Честно говоря, не понял концепции партиций, групп и топиков и как они соотносятся друг с другом и consumer'ам. Что такое ребалансировка? Наверняка есть какая-то наглядная картинка в Kafka user guide. Был бы признателен за ссылку


3) Было бы интересно посмотреть на более подробное описание экспериментов на стенде с указанием использованного железа, сути экспериментов и полученных результатов (цифра 60000 событий/сек без деталей не говорит ни о чем)


4) Стримы и архитектура базирующаяся на событиях, достаточно старая тема. У Fawler'а она датируется 2005годом: https://martinfowler.com/eaaDev/EventSourcing.html

В мире open source есть зилиард различных messaging solutions и messaging midlleware (zeromq, activemq, rabbitmq) Хотя бы два слова, почему взгляд пал на Kafka?

Классический messaging не обеспечивает возможности replay потока сообщений.
Одно время мы смотрели на RabbitMQ и AMQP аналоги, но в результате Кафка победила за счет персистентности с хорошими показателями производительности и масштабируемости. Спектр open source потоковых решений по передаче информации сводится к Apache Kafka, nats.io, Apache Pulsar. Их, увы, не так много как messaging solutions. Причем последние два решения появились недавно.


Так из-за чего возникают дубликаты?

Концепции топика, партиции и пр. подробно описаны в штатной документации Apache Kafka https://kafka.apache.org/documentation/
Дубли сообщений возникают после ребаланса consumer group при наличии сообщений, для которых не был выполнен commit.
Рекомендую почитать тут https://www.confluent.io/blog/exactly-once-semantics-are-possible-heres-how-apache-kafka-does-it/


Было бы интересно посмотреть на более подробное описание экспериментов на стенде

Согласны, что нюансов много. Публиковать детальные результаты с анализом и рекомендациями по оптимизации производительности пока не можем :) В составе Apache Kafka есть штатные скрипты проверки производительности. Запустите на своем оборудовании и посмотрите результаты.


4) Стримы и архитектура базирующаяся на событиях, достаточно старая тема. У Fawler'а она датируется 2005годом: https://martinfowler.com/eaaDev/EventSourcing.html

На уровне идей тема дискутируется довольно давно. Event Sourcing начинал использовать в 2008. Думаю, что явно не первым (и даже не вторым) в мире и России.
Но вот готовые движки с реализацией stateful stream processing появились не так давно.

Как вы решили проблему event sourcing. Как я понял держать данные навсегда не получается, то есть retention time как то ограничено. Все данные нужно перенести в hadoop или nosql а если
replay то опять назад? Возможно не актуальная тема, но всё же, если данные оставить в кафке, то как достичь GDPR / right to forget. CRUD не возможен.


Какие отзывы от Ops? Кафка довольно сложнa в управлении.


Какой у вас опыт по resharding? То есть если уже пару терабайтов, то просто не получается.


Как выглядит audit и encryption?


Возможно NoSQL СУБД с change data capture был бы проще и архитектура выгледела не такой комплексной?

Как я понял держать данные навсегда не получается, то есть retention time как то ограничено.

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


Возможно не актуальная тема, но всё же, если данные оставить в кафке, то как достичь GDPR / right to forget.

С помощью topic retention


Какие отзывы от Ops? Кафка довольно сложнa в управлении.

Эксплуатируем, особых сложностей не заметили. Можете уточнить вопрос?


Какой у вас опыт по resharding?

Избегаем всеми силами. Операция дорогая по вычислительным ресурсам.


Как выглядит audit и encryption?

В кафке из коробки этого нет. Делали простые решения с помощью interceptors Кафки. Но если нет контроля за машинами где развернуты producers и consumers, толку от этого мало, так как interceptors могут быть отключены или подменены. Хорошо бы иметь interceptors на стороне брокера, но пока в ближайших планах у Confluent таких доработок не видел.


Возможно NoSQL СУБД с change data capture был бы проще и архитектура выгледела не такой комплексной?

Вомможно. Но придется решать задачи запуска map-reduce агрегаций для аналитических задач. Не уверен, что архитектура получится проще.

С помощью topic retention
Имеете ввиду compaction? Было такое размышление, но compaction даёт возможность иметь только distinct values by unique key. Тоесть клиент id 4711 дважды не может быть в topic. Поэтому отказались от compaction. Хотя закинув key 4711: value null, тогда GDPR-right to forget сработал бы.

Какие отзывы от Ops? Кафка довольно сложнa в управлении.
Эксплуатируем, особых сложностей не заметили. Можете уточнить вопрос?

Кафка это не только брокер, а также Zookeeper и следующие компоненты, REST proxy, schema etc. Продукт не даёт ощущения, что был сконструирован для enterprise и из за своей комплексности не прост в Ops. Нужно имеет очень хорошую и опытную команду Ops. На рынке open source есть примеры, как продукты могут быть просты в обращение в production.

Вомможно. Но придется решать задачи запуска map-reduce агрегаций для аналитических задач. Не уверен, что архитектура получится проще.

не в целях рекламы — MongoDB; aggregation framework + change streams, всё в одном?

В целом, спасибо за статью и ответы!
в Kafka все унифицировано, и разницы между Point-to-point и Publish-subscribe нет, в том числе и в API для программиста

Вот именно, поэтому режима ptp там нет в принципе (и более того, его очень сложно реализовать если вам нужны именно классические очереди с гарантированной доставкой и прочими ништяками, смотреть тут softwaremill.com/using-kafka-as-a-message-queue), а управление тем, кто и как получает сообщение, как раз и осуществляется посредством API программиста, а конкретно — через consumer groups, как вы ВНЕЗАПНО и узнаете ниже в статье :).

Так в топике можно сделать много партиций и посадить много читателей.

Число партишенов при этом должно быть не меньше числа консюмеров, иначе у вас будет consumer starvation.

В этот момент мы поняли: Kafka — это не совсем очередь.

А точнее, совсем не очередь ;).

Происходит ребаланс, и в течение некоторого времени брокер не отдает читателям никаких сообщений, пока ребаланс не произойдет.

Дело даже не в дублировании. Ребаланс — очень дорогая операция и примерно половина всех оптимизаций консюминга заключается в том чтобы его избежать, что выливается в шаманство с членством в группах и конфигурацией топиков. Самый простой способ, который вам надо было изначально применять — программное уравнивание. Создаете топик с N партишенов и при инициации консюминга создаете группу с N консюмерами. При этом, самый фан начинается когда вы топики и консюмеров в рантайме создаете, динамически. В сложных топологиях такого рода (напр. для построения микросервисных мешей) ребаланс в любом месте моментально убьет всю систему и окажется что группы из более чем 1 консюмера вообще надо применять очень аккуратно и в очень специфичных случаях.

События распределяются по ним в соответствии с ключами, которые мы событиям присваиваем… События внутри одной партиции упорядочены по времени… Второй подход — партиционирование потока при чтении.

Это ж называется CBR, или я чего-то не понял? Коллективный разум считает CBR антипаттерном Кафки и намекает, что если вам потребовалось его реализовать, то вы что-то не так делаете, т.к. кафка себя всегда позиционировала как быстрый транспорт, без этих ваших JMSов. Ну и да, термин «корреляция» в статье замечен не был, хотя обязан был быть.

Но есть такой класс задач — алгоритмы аналитики — где результатом обработки потока являются агрегаты событий… Как это реализовать?

Подключением к топику дополнительной группы консюмеров, выполняющих аналитику (имеется ввиду же онлайн-аналитика?). Потоковые вычисления, в т.ч. и аккумуляционные, испокон веков применялись в DSP и если честно я совсем не понял, зачем вам потребовалась наркомания с плавающими окнами на едином потоке.

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

Для RDBMS — на самом деле никак, пока не появятся реактивные драйвера для БД (Напр., ADBA для Oracle). JDBC является синхронным и блокирует все что нужно блокировать, поэтому в реактивных архитектурах их и не используют, либо реализуют волшебный CQRS и неблокирующие костыли.

***

От себя добавлю что термин «потоковая архитектура» правильно называется сейчас в источниках «reactive architecture» и строится на основе спецификации reactive streams.

В целом, есть у меня подозрение что если вы проведете бенчмарки одной и той же сложной бизнес-задачи на том решении что вы реализовали на базе Кафки и например на ActiveMQ (который еще с 2007 года поддерживает pub/sub, корреляцию и CBR чуть более чем полностью из коробки, в отличие от сатанинского MQ и чуть более кошерного Rabbit), то результаты у вас получатся примерно схожие, без учета кластеризации конечно, Кафка здесь вне конкуренции.

Почему? Потому что вы в статье использовали Кафку как аналог JMS-провайдера, накрутив поверх кучу поделок, компенсирующих напрочь отсутствующие в Кафке фичи спецификации. Кафку нельзя использовать как замену JMS, весь ее великий смысл — максимально быстро и эффективно передать много-много данных от продюсера к консюмеру. Что это за данные, какая у них семантика и тем более корреляция, как их лучше или хуже консюмить — это все вопросы приклада.

Кроме того, при безграничном масштабировании ВНЕЗАПНО окажется что больше 1-2к топиков на кластер Кафки делать совсем-совсем не рекомендуется и надо будет переосмысливать топологию (см. мои комментарии выше). Это выльется в фееричную боль, потому что переделывать надо будет вообще все.
Sign up to leave a comment.