@inponomarev
Иван Пономарёв, КУРС/МФТИ
![]() |
|
![]() |
| ![]() |

Добавляем данные в конец
Записанное не можем изменить
Читаем последовательно

— Лог!
| товар | ячейка | кол-во |
|---|---|---|
X | A | 8 |
X | B | 2 |
Y | B | 1 |

|
| ![]() |

![]() |
|
![]() |
|
![]() |
|
| дата | товар | ячейка | кол-во | описание |
|---|---|---|---|---|
02.04.2020 | X | A | 10 | начальный остаток |
02.04.2020 | X | B | 2 | начальный остаток |
02.04.2020 | Y | B | 1 | начальный остаток |
| дата | товар | ячейка | кол-во | описание |
|---|---|---|---|---|
02.04.2020 | X | A | 10 | начальный остаток |
02.04.2020 | X | B | 2 | начальный остаток |
02.04.2020 | Y | B | 1 | начальный остаток |
09.04.2020 | X | A | -2 | Василий по заданию №1 |
| дата | товар | ячейка | кол-во | описание |
|---|---|---|---|---|
02.04.2020 | X | A | 10 | начальный остаток |
02.04.2020 | X | B | 2 | начальный остаток |
02.04.2020 | Y | B | 1 | начальный остаток |
09.04.2020 | X | A | -2 | Василий по заданию №1 |
09.04.2020 | X | B | 2 | Василий по заданию №1 |
| дата | товар | ячейка | кол-во | описание |
|---|---|---|---|---|
9.04.2020 | X | A | -2 | Василий по заданию №1 |
9.04.2020 | X | B | 2 | Василий по заданию №1 |
9.04.2020 | X | A | 2 | Сторно задания №1 |
9.04.2020 | X | B | -2 | Сторно задания №1 |
Сколько у нас всего на складе товара Y?
Что лежит в ячейке B?
Сколько товаров переместил Василий 9 апреля?
Какие корректировки вносились в систему?
9 апреля Василий должен был положить товар из A в В.
Давайте посмотрим, что лежит в A?
Давайте спросим Василия?
Нагрузка на полку лимитирована 100 кг
— Добавляем поле "вес" в Ledger!
Нужно посчитать зарплату работников склада
— Даже добавлять ничего не надо.

Наличие лога позволяет
Добавлять новую функциональность
Искать корелляции событий, выявлять и расследовать мошенническое поведение
Исправлять алгоритмические ошибки и пересчитывать данные
Наша жизнь — это append-only log
![]() |
| ![]() |
![]() |
| ![]() |
|
![]() |
|
![]() |
|
![]() |
| ![]() |










![]() |
| ![]() |


// hash the keyBytes to choose a partition
return Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions;batch.size and linger.ms
![]() | ![]() |
acks = 0

acks = 1

acks = -1
min.insync.replicas

![]() |
| ![]() |











![]() |
| ![]() |








![]() |
| ![]() |




KStream<String, String> stream = streamsBuilder.stream(
SRC_TOPIC, Consumed.with(Serdes.String(), Serdes.String());
KStream<String, String> upperCasedStream =
stream.mapValues(String::toUpperCase);
upperCasedStream.to(SINK_TOPIC,
Produced.with(Serdes.String(), Serdes.String());Больше сообщений в секунду? — больше машин с одинаковым application.id!













Соединять источники!



CREATE STREAM pageviews_enriched AS
SELECT pv.viewtime,
pv.userid AS userid,
pv.pageid,
pv.timestring,
u.gender,
u.regionid,
u.interests,
u.contactinfo
FROM pageviews_transformed pv
LEFT JOIN users_5part u ON pv.userid = u.userid
EMIT CHANGES;CREATE TABLE pageviews_per_region_per_30secs AS
SELECT regionid,
count(*)
FROM pageviews_enriched
WINDOW TUMBLING (SIZE 30 SECONDS)
WHERE UCASE(gender)='FEMALE' AND LCASE(regionid)='region_6'
GROUP BY regionid
EMIT CHANGES;Мониторинг! Логи!
Отслеживание действий пользователей
Выявление аномалий (в т. ч. попыток мошенничества)

При изменении схемы данных миграция не похожа на RDBMS.
Once-only delivery:
В обычном режиме, сбой в KStreams приводит к повторному чтению данных.
В режиме once-only delivery — чтение и запись между топиками Kafka.
Лямбда-архитектура
![]() | Никита Сальников-Тарновский //https://2019.jokerconf.com/2019/talks/2qw2ljhlfoeiipjf0gfzzb/[Потоковое приложение — это не только код, но и 3-4 года поддержки в проде] |
![]() |
| ![]() |



Лидер по звёздам и количеству использований
Чистая JavaScript-реализация
Умеет не всё.

Github-метрики проигрывают kafka-node
JavaScript/C++
Обёртка вокруг librdkafka — очень зрелого проекта
Умеет работать с Confluent Cloud

![]() |
|

![]() |
| ![]() |
kafkacat — лучший CLI инструмент

Conduktor — лучший GUI инструмент

![]() | Григорий Кошелев |
![]() |
|
Kafka Summit Conference: https://kafka-summit.org/

Грефневая Кафка
Moscow Apache Kafka® Meetup by Confluent — раз в квартал
![]() |
Спасибо!