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
Что такое Spring Boot и чем он отличается от традиционного Spring Framework? 🤔
Spring Boot — это упрощённый и удобный фреймворк, построенный на основе Spring Framework. Он значительно облегчает разработку самодостаточных и готовых к продакшену Spring-приложений благодаря следующим особенностям:
⏩ Автоконфигурация – автоматически настраивает Spring и сторонние библиотеки в зависимости от присутствующих зависимостей в classpath.
⏩ Starter POMs – предоставляет готовые зависимости (starter'ы), упрощая конфигурацию сборки.
⏩ Встроенные серверы – включает встроенные сервера, такие как Tomcat и Jetty, устраняя необходимость в сторонних серверных контейнерах.
⏩ Без XML-конфигурации – активно использует аннотации, уменьшая количество шаблонного (boilerplate) кода.
📌 Основное отличие от традиционного Spring Framework в том, что Spring Boot автоматизирует настройку, тогда как обычный Spring требует много ручной конфигурации.
👉 Java Portal
Spring Boot — это упрощённый и удобный фреймворк, построенный на основе Spring Framework. Он значительно облегчает разработку самодостаточных и готовых к продакшену Spring-приложений благодаря следующим особенностям:
Please open Telegram to view this post
VIEW IN TELEGRAM
Архитектура JVM
У Java Virtual Machine (JVM) есть 3 основных компонента:
⏩ Загрузчик классов (Classloader)
⏩ Область данных (Data Area)
⏩ Исполняющий механизм (Execution Engine)
Процесс загрузки классов включает 3 этапа:
🍩 Загрузка (Loading)
🍩 Связывание (Linking)
🍩 Инициализация (Initialization)
В области данных, создаваемой JVM, есть 5 компонентов:
🟡 Область методов (Method Area)
🟡 Куча (Heap Area)
🟡 Стек (Stack Area)
🟡 Регистр счётчика команд (PC Register)
🟡 Стек нативных методов (Native Method Stack)
👉 Java Portal
У Java Virtual Machine (JVM) есть 3 основных компонента:
Процесс загрузки классов включает 3 этапа:
В области данных, создаваемой JVM, есть 5 компонентов:
Please open Telegram to view this post
VIEW IN TELEGRAM
Паттерн Singleton — это такой паттерн, который заставляет класс иметь только один экземпляр и предоставляет доступ к нему для всего приложения.
Когда его использовать?
⏩ Когда нужно, чтобы по всему приложению был один и тот же объект (например, конфиг или логгер).
⏩ Если создание объекта сильно грузит систему, и лишние экземпляры будут только мешать.
Как работает?
⏩ В классе с этим паттерном создается всего один экземпляр.
⏩ Экземпляр можно получить через специальный метод, который проверяет, существует ли уже объект. Если нет — создает его.
Плюсы:
☑ Экономит память, создавая только один объект.
☑ Легко внедряется, если нужно иметь один объект для всех.
Минусы:
❌ Сложнее тестировать, потому что жесткая зависимость от единственного объекта.
❌ Могут быть проблемы при многозадачности, если не учесть блокировки.
Когда тебе нужен один и тот же объект для всего приложения — это то, что надо
👉 Java Portal
Когда его использовать?
Как работает?
Плюсы:
Минусы:
Когда тебе нужен один и тот же объект для всего приложения — это то, что надо
Please open Telegram to view this post
VIEW IN TELEGRAM
Зачем мы используем дженерики в Java? 🤔
⏩ Типовая безопасность: Предотвращает возникновение ошибки ClassCastException во время выполнения.
⏩ Повторное использование кода: Позволяет писать универсальные алгоритмы, которые работают с различными типами.
⏩ Проверка на этапе компиляции: Обнаруживает ошибки на этапе компиляции, а не во время выполнения.
👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Параллелизм в Java
Параллельность (Concurrency) включает в себя управление несколькими потоками для одновременного выполнения задач, что критически важно для высокопроизводительных приложений
Как это работает?🤔
🍩 Инициализируем потоки.
🍩 Проверяем, готовы ли они.
🍩 Запускаем задачи одновременно.
🍩 Дожидаемся завершения и закрываем потоки
👉 Java Portal
Параллельность (Concurrency) включает в себя управление несколькими потоками для одновременного выполнения задач, что критически важно для высокопроизводительных приложений
Как это работает?
Please open Telegram to view this post
VIEW IN TELEGRAM
Общие вопросы для собеседования на Java Spring Boot с ответами
🍩 Какие типы внедрения зависимостей бывают?
⏩ Field Injection
⏩ Setter Injection
⏩ Constructor Injection
🍩 Разница между
🍩 Чем отличаются
🍩 Что такое Spring Bean?
Spring Bean – это обычный Java-объект, созданный Spring-контейнером.
🍩 Разница между
🍩 Разница между
🍩 Зачем нужен
Используется для конфигурации приложения: настройки БД, логирование и т. д.
Сохрани себе, чтобы не забыть!
👉 Java Portal
BeanFactory
и ApplicationContext
BeanFactory
использует ленивую инициализацию (создает бины при вызове getBean()).ApplicationContext
использует раннюю инициализацию (бины создаются при старте приложения).@Component, @Repository, @Service
и @Controller
?@Component
– общий стереотип для любого Spring-управляемого компонента.@Repository
– используется для DAO-слоя (работа с БД).@Service
– для сервисного слоя.@Controller
– для MVC-контроллеров.Spring Bean – это обычный Java-объект, созданный Spring-контейнером.
Singleton
и Prototype Bean
Singleton
– создается один экземпляр на все приложение.Prototype
– новый экземпляр создается при каждом запросе. @Component
и @Bean
@Component
– аннотация на уровне класса.@Bean
– аннотация на уровне метода, название метода = имя бина.application.properties
?Используется для конфигурации приложения: настройки БД, логирование и т. д.
Сохрани себе, чтобы не забыть!
Please open Telegram to view this post
VIEW IN TELEGRAM
GIT Workflow
Хотите разобраться, как работает Git? Тогда держите наглядный гайд!
🍩
🍩
🍩 Создание нового файла – добавляем что-то новое в проект
🍩
🍩
🍩
👉 Java Portal
Хотите разобраться, как работает Git? Тогда держите наглядный гайд!
Initial State
– начальное состояние проектаgit clone
– клонируем удаленный репозиторийgit add
. – отправляем изменения в staging areagit commit
– фиксируем изменения локальноgit push
– отправляем изменения на удаленный серверPlease open Telegram to view this post
VIEW IN TELEGRAM
Что такое
Это мощная функция, представленная в Java 8 (в пакете
Она предоставляет гибкий способ написания неблокирующего, асинхронного кода с использованием функциональных конструкций.
⏩ задачи выполняются независимо, не блокируя основной поток.
⏩ поддерживает метод chaining через
⏩ объединяет несколько CompletableFuture с помощью .thenCompose(), .thenCombine().
⏩ встроенные механизмы обработки ошибок через .exceptionally() и .handle().
⏩ поддерживает выполнение нескольких задач параллельно с
👉 Java Portal
CompletableFuture
в Java?Это мощная функция, представленная в Java 8 (в пакете
java.util.concurrent
), которая представляет собой будущий результат асинхронного вычисления.Она предоставляет гибкий способ написания неблокирующего, асинхронного кода с использованием функциональных конструкций.
.thenApply(), .thenAccept()
и другие. .allOf()
и .anyOf().
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Большая актуальная базу бесплатных API, которая обновляется ежедневно
Тут собрано аж 363 бесплатных API на все случаи жизни: от игр и погоды до финансов и здоровья.
Алгоритмы присваивают рейтинг каждому API на основе надежности, частоты ошибок и времени отклика
Если API перестает работать или становится платным, он теряет рейтинг и удаляется с сайта
Переходите и смотрите сами: https://www.freepublicapis.com/
👉 Java Portal
Тут собрано аж 363 бесплатных API на все случаи жизни: от игр и погоды до финансов и здоровья.
Алгоритмы присваивают рейтинг каждому API на основе надежности, частоты ошибок и времени отклика
Если API перестает работать или становится платным, он теряет рейтинг и удаляется с сайта
Переходите и смотрите сами: https://www.freepublicapis.com/
Please open Telegram to view this post
VIEW IN TELEGRAM
Есть один отличный фреймворк — Javalin
Если нужно быстро запустить сервер или сделать небольшое приложение — самое то
Он позволяет настроить сервер легко и без лишних зависимостей. Все, что нужно для REST API или WebSocket — уже встроено.
ℹ️ Идеально для пет-проектов, микросервисов и прототипов
👉 Java Portal
Если нужно быстро запустить сервер или сделать небольшое приложение — самое то
Он позволяет настроить сервер легко и без лишних зависимостей. Все, что нужно для REST API или WebSocket — уже встроено.
Please open Telegram to view this post
VIEW IN TELEGRAM