Основные концепции в Kafka которые нужно знать:
🟡 Топики (Topics): Kafka организует сообщения в топики, которые выступают в роли категорий сообщений.
🟡 Разделы (Partitions): Каждый топик разделяется на несколько разделов, что позволяет обрабатывать данные параллельно.
🟡 Продюсеры (Producers): Отправляют сообщения в топики Kafka.
🟡 Потребители (Consumers): Читают сообщения из топиков, обычно в составе групп потребителей для параллельной обработки.
🟡 Брокеры (Brokers): Сервера Kafka, которые хранят и передают сообщения.
🟡 Zookeeper: Управляет метаданными и выбором лидера для разделов.
👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Свободный и мощный PDF-движок
Если вам нужен Java-инструмент для работы с PDF без привязки к проприетарным библиотекам, OpenPDF – отличный выбор.
Это форк iText 4, который предлагает все ключевые функции для создания, редактирования и подписи PDF-документов. Полностью open-source и распространяется под LGPL/MPL лицензиями.
⏩ Генерация и модификация PDF
⏩ Шифрование и цифровые подписи
⏩ Поддержка форм и аннотаций
⏩ Совместимость с Java-приложениями
Используете OpenPDF?🤔
👉 Java Portal
Если вам нужен Java-инструмент для работы с PDF без привязки к проприетарным библиотекам, OpenPDF – отличный выбор.
Это форк iText 4, который предлагает все ключевые функции для создания, редактирования и подписи PDF-документов. Полностью open-source и распространяется под LGPL/MPL лицензиями.
Используете OpenPDF?
Please open Telegram to view this post
VIEW IN TELEGRAM
Java: Почему индустрия возвращается к JDBC вместо JPA?
Этот сдвиг набирает популярность в различных отраслях, особенно в высокопроизводительных приложениях.
Для ресурсоемких приложений вручную написанные SQL-запросы часто работают быстрее, чем сгенерированные JPA, обеспечивая лучшую эффективность и удобство сопровождения.
Означает ли это, что JPA мертв?🩸
Не обязательно. JPA по-прежнему полезен для приложений, где:
🟡 Быстрое развитие важнее, чем точная оптимизация производительности.
🟡 Доменная модель тесно соответствует реляционной структуре данных.
🟡 Взаимодействие с базой данных сосредоточено на CRUD-операциях с минимальным количеством сложных запросов.
Однако в приложениях, требующих высокой пропускной способности, сложного SQL и оптимального использования ресурсов, JDBC становится предпочтительным выбором.
👉 Java Portal
Этот сдвиг набирает популярность в различных отраслях, особенно в высокопроизводительных приложениях.
Для ресурсоемких приложений вручную написанные SQL-запросы часто работают быстрее, чем сгенерированные JPA, обеспечивая лучшую эффективность и удобство сопровождения.
Означает ли это, что JPA мертв?
Не обязательно. JPA по-прежнему полезен для приложений, где:
Однако в приложениях, требующих высокой пропускной способности, сложного SQL и оптимального использования ресурсов, JDBC становится предпочтительным выбором.
Please open Telegram to view this post
VIEW IN TELEGRAM
Java Optional - orElse(), orElseGet() и orElseThrow()
Если вы используете Optional.isPresent(), а затем Optional.get(), то вы используете его неправильно.😕
Вместо этого рекомендуется использовать цепочку Optional (Optional Chaining) с методами:
⏩
⏩
⏩
Использование Optional в функциональном стиле делает код более читаемым, лаконичным и менее подверженным ошибкам.
👉 Java Portal
Если вы используете Optional.isPresent(), а затем Optional.get(), то вы используете его неправильно.
Вместо этого рекомендуется использовать цепочку Optional (Optional Chaining) с методами:
orElse(value)
– если значение присутствует, оно возвращается, иначе возвращается указанное значение.orElseGet(Supplier)
– если значение присутствует, оно возвращается, иначе вызывается переданный метод (лямбда-функция).orElseThrow(Supplier<Exception>)
– если значение отсутствует, выбрасывается исключение.Использование Optional в функциональном стиле делает код более читаемым, лаконичным и менее подверженным ошибкам.
Please open Telegram to view this post
VIEW IN TELEGRAM
50 бесплатных вопросов для подготовки к сертификации Spring Professional Certification
⏩ Читать подробнее
👉 Java Portal | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
Семантика доставки в Kafka
⏩ At-Least-Once («Как минимум один раз») – гарантирует доставку, но возможны дубликаты.
⏩ At-Most-Once («Не более одного раза») – сообщения не дублируются, но возможны потери.
⏩ Exactly-Once («Ровно один раз») – гарантирует, что каждое сообщение будет обработано ровно один раз, без потерь и дубликатов.
👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Создание простого HTTP-сервера в Java
🟡 Настройка и обзор проекта.
🟡 Управление конфигурацией.
🟡 Использование серверных сокетов.
🟡 Обработка нескольких подключений с помощью потоков.
🟡 Разбор HTTP-запросов.
и тд.
Это пошаговое руководство, которое поможет разобраться в основах создания веб-сервера с нуля на Java.
📲 Cмотреть источник: тут
👉 Java Portal | #видео
и тд.
Это пошаговое руководство, которое поможет разобраться в основах создания веб-сервера с нуля на Java.
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое Внедрение Зависимостей (Dependency Injection)?
Внедрение зависимостей — это шаблон проектирования, при котором объекты получают свои зависимости из внешнего источника, а не создают их внутри себя.
Преимущества внедрения зависимостей👇
- Слабая связность: Компоненты взаимодействуют через определённые интерфейсы, что повышает гибкость.
- Упрощённое тестирование: Легче проводить модульное тестирование с использованием мок-объектов.
- Повторное использование кода: Способствует модульному дизайну, улучшая переиспользование кода.
- Простая конфигурация: Автоконфигурация Spring Boot минимизирует необходимость ручного связывания зависимостей.
- Лучшая поддерживаемость: Изменения в одном компоненте не оказывают прямого влияния на другие.
👉 Java Portal
Внедрение зависимостей — это шаблон проектирования, при котором объекты получают свои зависимости из внешнего источника, а не создают их внутри себя.
Преимущества внедрения зависимостей
- Слабая связность: Компоненты взаимодействуют через определённые интерфейсы, что повышает гибкость.
- Упрощённое тестирование: Легче проводить модульное тестирование с использованием мок-объектов.
- Повторное использование кода: Способствует модульному дизайну, улучшая переиспользование кода.
- Простая конфигурация: Автоконфигурация Spring Boot минимизирует необходимость ручного связывания зависимостей.
- Лучшая поддерживаемость: Изменения в одном компоненте не оказывают прямого влияния на другие.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Разница между Interceptor и Filter в Spring Boot
Что такое Filter? Filter — это часть Servlet API, работающая на низком уровне, обрабатывающая все входящие запросы до того, как они достигнут диспетчера Spring.
Когда использовать Filter?
🟡 Логирование
🟡 Сжатие GZIP
🟡 Проверки безопасности: реализация брандмауэров, ограничение скорости, контроль доступа
🟡 Модификация запросов/ответов: изменение HTTP-данных (например, упаковка, очистка, кэширование)
Что такое Interceptor? Interceptor — это часть Spring MVC, работающая внутри фреймворка Spring. Он позволяет модифицировать запросы и ответы, особенно для контроллеров.
Когда использовать Interceptor?
🟡 Проверка учетных данных и прав доступа для контроллеров
🟡 Логирование времени выполнения
🟡 Изменение модели или представления перед отправкой ответа клиенту
👉 Java Portal
Что такое Filter? Filter — это часть Servlet API, работающая на низком уровне, обрабатывающая все входящие запросы до того, как они достигнут диспетчера Spring.
Когда использовать Filter?
Что такое Interceptor? Interceptor — это часть Spring MVC, работающая внутри фреймворка Spring. Он позволяет модифицировать запросы и ответы, особенно для контроллеров.
Когда использовать Interceptor?
Please open Telegram to view this post
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Интеграция потоков данных для микросервисов с Kafka и Kafka Connect
Автор делится опытом выбора Kafka для реального времени получения информации о стоках товаров через API, а также описывает процесс интеграции реляционных баз данных, выбор и настройку коннекторов Kafka, использование базы данных Tarantool для хранения данных и выбор инструментов для мониторинга, таких как Dynatrace, Prometheus и Burrow. В результате была создана система, обрабатывающая данные за 5-10 секунд.
📲 Cмотреть источник: тут
👉 Java Portal | #видео
Автор делится опытом выбора Kafka для реального времени получения информации о стоках товаров через API, а также описывает процесс интеграции реляционных баз данных, выбор и настройку коннекторов Kafka, использование базы данных Tarantool для хранения данных и выбор инструментов для мониторинга, таких как Dynatrace, Prometheus и Burrow. В результате была создана система, обрабатывающая данные за 5-10 секунд.
Please open Telegram to view this post
VIEW IN TELEGRAM
Если ты когда-нибудь работал с Java Streams, то знаешь, как полезно отслеживать промежуточные данные.
Но что, если ты не хочешь изменять элементы, а просто вывести их для отладки?🤔
Вот тут в игру вступает👇
Зачем это нужно?
☑ Отладка: подглядывай за данными без изменения потока.
☑ Чистота кода: нет побочных эффектов, как с forEach().
👉 Java Portal
Но что, если ты не хочешь изменять элементы, а просто вывести их для отладки?
Вот тут в игру вступает
peek()
— метод, который позволяет подсматривать элементы потока, не изменяя их. Это удобно для логирования или проверки данных на лету. List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> result = numbers.stream()
.filter(n -> n % 2 == 0)
.peek(n -> System.out.println("Filtered value: " + n))
.map(n -> n * 2)
.collect(Collectors.toList());
Зачем это нужно?
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Забыли про ExecutorService и вечные потоки?
Дайте шанс
Пример:👇
Преимущества:
🟡 Параллельные операции без блокировок.
🟡 Чистый и понятный код.
🟡 Гибкость при работе с результатами.
👉 Java Portal
Дайте шанс
CompletableFuture
! Это идеальный способ выполнять несколько операций параллельно, при этом сохраняя чистый код.Пример:
CompletableFuture.supplyAsync(() -> {
// Долгая операция
return "Hello, ";
}).thenCombine(
CompletableFuture.supplyAsync(() -> {
// Ещё одна операция
return "World!";
}),
(greeting, name) -> greeting + name
).thenAccept(System.out::println); // Выведет "Hello, World!"
Преимущества:
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Как работает перехватчик (Interceptor) в Spring Boot?
Когда клиент делает запрос:
⏩
⏩ Затем
⏩ Перед тем как запрос достигнет Controller, он проходит через все настроенные перехватчики (Interceptors) и выполняет их метод preHandle().
⏩ Если все методы
⏩ Controller выполняет запрос. После этого запрос проходит через метод postHandle() всех перехватчиков.
⏩ Наконец, если все прошло успешно и методы
👉 Java Portal
Когда клиент делает запрос:
DispatcherServlet
первым получает запрос.DispatcherServlet
использует HandlerMappings, чтобы найти соответствующий Controller.
preHandle()
возвращают true, запрос передается в Controller.
postHandle()
вернули true
, вызывается метод afterCompletion()
у всех перехватчиков.Please open Telegram to view this post
VIEW IN TELEGRAM
Гонки потоков любят конкуренцию — но Kafka не дает им выиграть.
Single Writer Pattern, но для распределенных систем.
Все, кто работал с потоковыми данными, знают, насколько болезненно получать события не в том порядке. Одна ошибка — и состояние системы рушится.
Что такое Single Writer Pattern?🤔
Этот паттерн гарантирует, что только один процесс записывает или обрабатывает данные в любой момент времени, избегая конфликтов и сохраняя консистентность.
⏩ Kafka использует этот принцип на уровне партиций:
⏩ Каждую партицию в момент времени обрабатывает только один потребитель.
⏩ Никаких гонок, путаницы или несогласованных данных — только чистая и упорядоченная обработка.
Как Kafka реализует это?
🟡 Топики разделены на партиции.
🟡 Каждая партиция закреплена только за одним потребителем.
🟡 Один consumer читает сообщения в правильном порядке, предотвращая гонки потоков.
Реальный пример: события заказов в e-commerce
Представьте, что маркетплейс получает такие события:
☑ OrderPlaced
☑ OrderConfirmed
☑ OrderShipped
Все события по одному заказу направляются в одну и ту же партицию, гарантируя их последовательную обработку. Это значит, что заказ не отправится раньше, чем будет подтвержден.
🔄 Отказоустойчивость без потери порядка
Если потребитель выходит из строя, Kafka перераспределяет его партиции.
🔄 Новый consumer продолжает обработку с того же места, сохраняя порядок событий.
Основные выводы:
☑ Kafka применяет Single Writer Pattern на уровне партиций.
☑ Это гарантирует упорядоченную и безопасную обработку без гонок потоков.
☑ Отказоустойчивость реализована без дублирования данных.
Перестаньте бороться с конкуренцией — проектируйте с учетом ее особенностей.
Последовательность событий — не просто удобство, а основа корректности в распределенных системах.
💬 Как вы решаете эту задачу в продакшене?
👉 Java Portal
Single Writer Pattern, но для распределенных систем.
Все, кто работал с потоковыми данными, знают, насколько болезненно получать события не в том порядке. Одна ошибка — и состояние системы рушится.
Что такое Single Writer Pattern?
Этот паттерн гарантирует, что только один процесс записывает или обрабатывает данные в любой момент времени, избегая конфликтов и сохраняя консистентность.
Как Kafka реализует это?
Реальный пример: события заказов в e-commerce
Представьте, что маркетплейс получает такие события:
Все события по одному заказу направляются в одну и ту же партицию, гарантируя их последовательную обработку. Это значит, что заказ не отправится раньше, чем будет подтвержден.
Если потребитель выходит из строя, Kafka перераспределяет его партиции.
Основные выводы:
Перестаньте бороться с конкуренцией — проектируйте с учетом ее особенностей.
Последовательность событий — не просто удобство, а основа корректности в распределенных системах.
Please open Telegram to view this post
VIEW IN TELEGRAM
Как Java-приложение подключается к базе данных через JDBC?
При разработке Java-приложений часто требуется работать с базой данных. Для этого используется JDBC (Java Database Connectivity) — технология, которая позволяет Java-программе отправлять SQL-запросы и получать данные
Давайте разберемся, как это работает шаг за шагом:
🍩 Java-приложение
Программа пишет SQL-запрос, который нужно выполнить (например, SELECT * FROM users).
🍩 JDBC API
Этот запрос передается через JDBC API, который является стандартным интерфейсом взаимодействия с базами данных в Java.
🍩 Driver Manager (Менеджер драйверов)
JDBC API отправляет запрос в Driver Manager. Этот компонент выбирает правильный драйвер для нужной базы данных.
🍩 Database Driver (Драйвер базы данных)
Найденный драйвер переводит запрос в понятный для базы данных формат и отправляет его в СУБД.
🍩 Database (База данных)
База данных выполняет запрос и возвращает результат обратно через все уровни:
Database → Database Driver → Driver Manager → JDBC API → Java-приложение.
👉 Java Portal
При разработке Java-приложений часто требуется работать с базой данных. Для этого используется JDBC (Java Database Connectivity) — технология, которая позволяет Java-программе отправлять SQL-запросы и получать данные
Давайте разберемся, как это работает шаг за шагом:
Программа пишет SQL-запрос, который нужно выполнить (например, SELECT * FROM users).
Этот запрос передается через JDBC API, который является стандартным интерфейсом взаимодействия с базами данных в Java.
JDBC API отправляет запрос в Driver Manager. Этот компонент выбирает правильный драйвер для нужной базы данных.
Найденный драйвер переводит запрос в понятный для базы данных формат и отправляет его в СУБД.
База данных выполняет запрос и возвращает результат обратно через все уровни:
Database → Database Driver → Driver Manager → JDBC API → Java-приложение.
Please open Telegram to view this post
VIEW IN TELEGRAM