Что, черт возьми, такое Протон?
1 января 2024 г.Эта серия статей доставила мне массу удовольствия, поскольку я узнал и исследовал новые технологии. Также интересно посмотреть, что приобрело популярность с тех пор, как я впервые это обнаружил. Моя последняя статья об Apache Paimon была невероятно популярна, к моему большому удивлению, но, похоже, я не был не единственный, кому интересно, что это было за херня. Благодаря этой статье я наткнулся на лицензионный проект Apache 2.0 с открытым исходным кодом, Proton, спонсируемый Timeplus. Это база данных SQL, в которой хранятся как исторические, так и потоковые данные. Написанное на C++ и работающее на платформе ClickHouse, основное внимание уделяется простоте и производительности. Благодаря одному исполняемому файлу установка проста.
Тенденция, которую я заметил, заключается в том, что создается все больше и больше приложений для анализа в реальном времени, но вы не хотите создавать их дважды. Один раз для потоковой передачи и один раз для исторической засыпки. Наличие единой платформы, которая могла бы выполнять запросы либо в пакетном, либо в потоковом режиме, либо даже в гибридном режиме, в котором вы объединяете исторические данные с потоком входящих данных, имело бы определенные преимущества. Похоже, Протон был создан именно для этого.
Обзор Протона
Коротко говоря, у нас есть база данных ClickHouse, а в Timeplus добавлена поддержка потоковых сервисов. Это должно дать вам механизм запросов, подобный Flink, и потоковое хранилище, подобное Kafka, с базой данных ClickHouse. Итак, как это выглядит?
Пунктирная линия показывает, где появляется Proton. Я предлагаю прочитать документацию по архитектуре, чтобы получить хорошее представление о том, что возможно.
Чтобы создать случайный поток данных и запросить его с помощью Proton, мы можем сделать что-то вроде этого:
-- Create a stream with random data.
CREATE RANDOM STREAM devices(device string default 'device'||to_string(rand()%4), temperature float default rand()%1000/10);
-- Run the long-running stream query.
SELECT device, count(*), min(temperature), max(temperature) FROM devices GROUP BY device;
┌─device──┬─count()─┬─min(temperature)─┬─max(temperature)─┐
│ device0 │ 2256 │ 0 │ 99.6 │
│ device1 │ 2260 │ 0.1 │ 99.7 │
│ device3 │ 2259 │ 0.3 │ 99.9 │
│ device2 │ 2225 │ 0.2 │ 99.8 │
└─────────┴─────────┴──────────────────┴──────────────────┘
Функции Протона
Протон имеет множество интересных функций; Меня сразу поразила возможность создавать материализованное представление для сохранения определенных событий в Proton. Воспользовавшись документацией, предположим, что у вас есть поток Kafka, сообщающий о веб-событиях, и вы хотите сохранить отчеты о неработающих ссылках, чтобы можно было запросить их позже, даже если Kafka отключен или события удалены. Это будет выглядеть примерно так:
create materialized view mv_broken_links as
select raw:requestedUrl as url,raw:method as method, raw:ipAddress as ip,
raw:response.statusCode as statusCode, domain(raw:headers.referrer)
as referrer
from frontend_events where raw:response.statusCode<>'200';
Затем, если вы хотите напрямую запросить материализованное представление и построить на основе данных гистограмму, это будет выглядеть так:
-- streaming query
select * from mv_broken_links;
-- historical query
select method, count() as cnt, bar(cnt,0,40,5) as bar from table(mv_broken_links)
group by method order by cnt desc;
┌─method─┬─cnt─┬─bar─┐
│ GET │ 25 │ ███ │
│ DELETE │ 20 │ ██▌ │
│ HEAD │ 17 │ ██ │
│ POST │ 17 │ ██ │
│ PUT │ 17 │ ██ │
│ PATCH │ 17 │ ██ │
└────────┴─────┴─────┘
Некоторые из этих функций напоминают мне Upsolver, компанию, в которой я работал несколько лет назад.
Драйверы для других языков доступны для Java, Go и Python. Использование Proton с чем-то вроде Redpanda потребует минимального объема потоковой передачи исторических данных.
Доступно множество других функций, но это не руководство. Хочу сделать легкое пояснение и обратить внимание на некоторые особенности. Документация краткая и в целом хорошо написанная, определенно лучше, чем во многих проектах с открытым исходным кодом.
Сводка
Хотя лично мне сейчас не нужна такая договоренность, я определенно бывал в местах и видел компании, где это было бы очень и очень здорово. Такой же крутой, как этот парень?
Наверное нет, но опять же ничего нет :). Если отбросить легкомыслие, команда Proton проделала отличную работу, документируя проект и максимально упрощая его установку и использование. Мне нравятся эти однобинарные проекты, которым не нужна обширная экосистема Java с множеством зависимостей. Однако не заблуждайтесь: у Timeplus есть коммерческая версия, которая дает вам больше возможностей, чем стандартная версия Proton. Однако они, похоже, очень поддерживают Протон и приветствуют сообщество.
Прочтите мои другие статьи «Что такое, черт возьми…» по ссылкам ниже:
- Что такое, черт возьми, DuckDB?
- Что, черт возьми, такое Маллой?
- Что такое, черт возьми, PRQL?
- Что, черт возьми, такое GlareDB?
- Что такое SeaTunnel?
- Что, черт возьми, такое LanceDB?
- Что такое, черт возьми, SDF?
- Что, черт возьми, такое Пеймон?
Оригинал