🍷 Потоковая обработка данных в реальном времени: архитектура на базе Kafka, Flink и Pinot
|
Системы для потоковой обработки данных обеспечивают непрерывный прием, обработку и анализ информации по мере ее поступления. Их главная цель – предоставление аналитических выводов и принятие решений практически в режиме реального времени. Такие системы используются, к примеру, для мгновенной персонализации рекламы, анализа поведения пользователей и обнаружения мошеннических действий. Требования к системам очень высоки: |
- Низкая задержка – максимально быстрая обработка данных с минимальным временем ожидания.
- Высокая пропускная способность – для обработки больших объемов данных.
- Отказоустойчивость – система должна продолжать работу даже при возникновении сбоев.
|
Для реализации эффективной системы нужно решить множество серьезных проблем, которые возникают на каждом этапе обработки данных: Прием данных
|
- Необходимо работать с разными источниками данных, форматами и структурами.
- Надо поддерживать высокую пропускную способность даже при резких всплесках объема данных.
|
- Каждую запись нужно обработать только один раз.
- Надо реализовать работу со сложными сценариями (вычисления с сохранением состояния; обработку событий, поступивших не по порядку; обработку данных, прибывших с задержкой).
- Все это должно выполняться масштабируемо и отказоустойчиво!
|
Аналитика в реальном времени Надо обеспечить:
|
- Быстрые ответы на запросы к свежим данным.
- Непрерывный прием и обработку данных из потоковых источников.
- Сохранение полноты и согласованности данных.
|
Пока что не существует одного инструмента, способного выполнять все эти действия. Поэтому архитектуры потоковой обработки в реальном времени обычно состоят из нескольких специализированных инструментов от Apache, работающих вместе: |
- Kafka отвечает за надежный прием и передачу данных.
- Flink обеспечивает мощную обработку потоков данных.
- Pinot предоставляет возможности для быстрой аналитики.
|
Архитектура системы потоковой обработки на основе Kafka, Flink и Pinot |
На основе этих инструментов можно создать комплексное, гибкое и масштабируемое решение, способное справиться со всеми проблемами, связанными с обработкой данных в реальном времени. Подробнее – в этой публикации. |
🐘 PostgreSQL: продвинутые возможности
|
PostgreSQL располагает несколькими продвинутыми фичами, которые позволяют ей справляться с разными задачами, выходящими за рамки возможностей традиционных реляционных баз данные. Среди прочего эта СУБД: |
- Поддерживает самые современные возможности SQL – общие табличные выражения (CTE), рекурсивные запросы и оконные функции. Эти функции позволяют выполнять сложные запросы более эффективно и лаконично.
- Работает с JSON – позволяет хранить и запрашивать JSON-данные напрямую в базе данных.
- Предоставляет возможности полнотекстового поиска, которые выходят за рамки простого поиска по точному совпадению. Эта функция учитывает лингвистические компоненты, такие как основы слов и синонимы, а также ранжирует результаты по релевантности.
- Имеет богатую экосистему расширений, которые добавляют новые функциональные возможности. Одним из таких расширений является pgvector, который превращает PostgreSQL в векторную базу данных. Это позволяет выполнять поиск по векторной схожести, что необходимо для приложений, использующих машинное обучение и обработку естественного языка.
|
👅 Как создать компилятор для собственного языка программирования
|
Компилятор обычно состоит из трех основных частей: фронтенда, оптимизатора и бэкенда. Фронтенд – это часть компилятора, которая непосредственно работает с исходным кодом на языке программирования. Его задачи:
|
- Проверить, правильно ли написана программа с точки зрения синтаксиса и семантики языка.
- Найти все ошибки в коде и сообщить о них разработчику.
- Преобразовать правильный код в промежуточное представление (IR), которое будет использоваться дальше.
|
Оптимизатор получает промежуточное представление от фронтенда и пытается улучшить код. Он выполняет ряд преобразований, чтобы сделать программу более эффективной. Например, может удалить ненужный код, упростить вычисления или перестроить структуру программы для более быстрого выполнения. Бэкенд берет оптимизированное промежуточное представление и превращает его в набор инструкций, которые может выполнить конкретный компьютер или устройство. Важно отметить, что процесс работы бэкенда может отличаться в зависимости от целевой платформы: |
- Для процессоров, работающих с регистрами (например, x86, ARM или RISC-V), бэкенд создает инструкции, которые активно используют эти регистры.
- Для платформ, основанных на стеке (например, WebAssembly или байт-код Java Virtual Machine), бэкенд создает инструкции, которые в основном работают со стеком данных.
|
Таким образом, компилятор проводит программу через несколько этапов преобразования, от исходного кода через промежуточное представление к машинным инструкциям, попутно проверяя корректность и улучшая эффективность. Это объемное практическое руководство покажет, как разработать свой ЯП с нуля и создать для него компилятор (с помощью LLVM). Код готового проекта доступен на GitHub. В руководстве шаг за шагом разобраны все основные аспекты создания ЯП: |
- Определение цели и концепции языка. Прежде всего нужно определиться, для чего именно предназначен язык – для системного программирования (как Rust), создания бэкенда веб-приложений (как Ruby и PHP), какой-то специфической области, например, разработки ИИ (как Mojo), или просто – для прикола.
- Разработка синтаксиса. В базовый синтаксис входят ключевые слова, операторы и основные конструкции (функции, циклы, условные операторы). Важно сделать синтаксис интуитивно понятным для разработчиков, знакомых с другими языками.
- Реализация лексического анализатора (лексера). Лексический анализ – первый этап в работе компилятора. Лексер разбивает исходный код на небольшие элементы, называемые токенами. Токены – это базовые элементы языка: ключевые слова, идентификаторы, числа, операторы. Например, строка кода "int x = 5;" может быть разбита на токены: [ТИП_ДАННЫХ: "int", ИДЕНТИФИКАТОР: "x", ОПЕРАТОР: "=", ЧИСЛО: "5", РАЗДЕЛИТЕЛЬ: ";"].
- Создание синтаксического анализатора (парсера). Парсер берет токены, созданные лексером, и строит абстрактное синтаксическое дерево (AST). AST представляет структуру программы в виде дерева, где каждый узел соответствует конструкции в исходном коде. Это позволяет компилятору понять структуру и иерархию элементов в программе.
- Реализация семантического анализатора. Здесь происходит проверка семантических ошибок и обеспечивается соответствие программы правилам языка и его системе типов. Например, проверяется, объявлены ли все используемые переменные, соответствуют ли типы в выражениях, правильно ли используются функции и т. д.
- Разработка системы типов. На этом этапе нужно определить, какие типы данных будут в языке, и реализовать правила преобразования и проверки типов.
- Реализация промежуточного представления. После анализа и проверки структуры программы компилятор генерирует промежуточное представление LLVM. Это низкоуровневый, но платформонезависимый код, который можно оптимизировать и преобразовать в машинный код для различных платформ.
- Оптимизация. Оптимизатор работает с промежуточным представлением для повышения эффективности программы. Здесь применяются различные алгоритмы оптимизации – удаление мертвого кода, свертка констант, оптимизация циклов и другие.
- Создание компилятора и генерация кода. На этом этапе все компоненты объединяются в единый инструмент. Для компилируемых языков оптимизированное промежуточное представление преобразуется в машинные инструкции, специфичные для целевой платформы (например, x86, ARM, RISC-V). Результатом является компилятор, который преобразует исходный код в исполняемый файл. Для интерпретируемых языков создается интерпретатор, который выполняет код напрямую.
|
🦴 APIDog – альтернатива Postman
|
Хотя Postman долгое время был незаменимым инструментом для разработки и тестирования API, несколько факторов заставляют разработчиков искать альтернативы: |
- Увеличение сложности. Postman эволюционировал из простого клиента в комплексную платформу для разработки API. За счет этой трансформации появилось множество дополнительных функций, но она также сделала инструмент более сложным и требовательным к ресурсам.
- Проблемы с производительностью. По мере развития Postman стало очевидным увеличение потребления ресурсов и снижение производительности, особенно при работе с большими коллекциями или сложными средами.
- Смена акцента на облачную модель. Облачные функции и инструменты для совместной работы полезны, но не подходят тем, кто предпочитает локальную разработку и беспокоится о конфиденциальности. Недавнее решение о прекращении поддержки функции Scratch Pad, которая позволяла работать в автономном режиме, попросту вынуждает пользователей работать в облаке.
- Изменения в ценообразовании. Некоторые функции, которые ранее были доступны в бесплатных или дешевых планах, теперь требуют более дорогих подписок.
|
Одной из лучших альтернатив испортившегося Postman называют APIDog. Главное преимущество APIDog – бесшовная интеграция множества функций, которые обычно требуют нескольких отдельных инструментов: он включает в себя мощный визуальный редактор для проектирования и отладки API, автоматизацию тестирования API с генерацией тестов из спецификаций API, встроенную валидацию ответов и интеграцию с CI/CD. |
APIDog работает на macOS, Windows, Linux, в браузере, в IDE и пока что имеет щедрый бесплатный тариф |
TooLong – CLI-приложение, предназначенное для работы с лог-файлами, в особенности очень длинными. Это удобная альтернатива стандартным инструментам Unix – tail, less и grep: |
- Открывает файлы любого размера очень быстро, даже если они весят несколько гигабайт.
- Может следить за изменениями в лог-файлах на лету, подобно команде tail.
- Умеет объединять несколько лог-файлов в один вид, автоматически определяя временные метки.
- Предоставляет функции поиска по содержимому лог-файлов.
- Автоматически подсвечивает распространенные форматы веб-серверных логов для удобства чтения.
- Поддерживает просмотр файлов в формате JSONL (JSON Lines), красиво форматируя каждую строку.
- Может автоматически открывать файлы, сжатые форматами .bz и .bz2.
|
TooLong упрощает просмотр и анализ лог-файлов |
textual-pandas – упрощает визуализацию табличных данных из Pandas в терминальных приложениях, созданных с помощью Textual. |
textual-pandas позволяет отображать данные Pandas в интерфейсе Textual |
Визуализация регулярного выражения |
Klama – ИИ-ассистент DevOps-инженера. Помогает диагностировать и устранять проблемы и неполадки в среде Kubernetes. |
Tabby – локальный ИИ-ассистент разработчика, опенсорсная альтернатива GitHub Copilot. |
Pyxel – игровой движок для Python. Предоставляет все необходимые инструменты для создания полноценных 2D-игр в стиле пиксель-арт. |
Pyxel имеет удобный редактор для создания спрайтов, тайлмапов, звуков и музыки |
CubeCL – позволяет программировать GPU на Rust. |
Чтобы функции выполнялись на GPU, нужно просто аннотировать их атрибутом cube |
WAT – мощный инструмент для исследования Python-объектов во время выполнения программы. Особенно полезен, когда вы смотрите в вывод интерпретатора, чувствуете себя потерянным и задаетесь вопросом: «Что это такое?!» |
WAT позволяет исследовать все – модули, атрибуты, функции, регулярные выражения |
Patchwork автоматизирует рутинные задачи разработки (проверку запросов на слияние, исправление ошибок, установку патчей безопасности и многое другое), используя любую локально установленную LLM. |
|
|
Понравилась ли вам эта рассылка? |
|
|
Вы получили это письмо, потому что подписались на нашу рассылку. Если вы больше не хотите получать наши письма, нажмите здесь.
|
|
|
|