@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 — раз в квартал
Спасибо!