Не все данные обрабатываются одинаково. Понимание, когда подходит batch, а когда stream, решает, получится ли у тебя нормальная архитектура или скрытый тормоз внутри.
Batch Processing собирает данные и обрабатывает их пачками.
Подходит, когда нет требований к моментальной реакции: ежедневные отчеты, бухзакрытия, историческая аналитика.
Он проще, нормально тянет большие объемы и дешевле по деньгам,
но появляется задержка. Событие уже случилось, а ты обрабатываешь его потом.
Stream Processing работает с данными прямо в потоке.
Отлично для мониторинга, антифрода, рекомендаций в реальном времени.
Скорость выше, но инфраструктура сложнее и поддержка дороже.
Часто косячат: ставят stream там, где батча за глаза, или наоборот, лепят batch туда, где важна минимальная задержка.
Фишка не в том, чтобы выбрать самое модное, а в том, чтобы попасть в реальный ритм бизнеса и решить конкретную задачу.
А если ресурсы сильно ограничены, скорее всего, batch уже закрывает потребности.
👉 Java Portal
Batch Processing собирает данные и обрабатывает их пачками.
Подходит, когда нет требований к моментальной реакции: ежедневные отчеты, бухзакрытия, историческая аналитика.
Он проще, нормально тянет большие объемы и дешевле по деньгам,
но появляется задержка. Событие уже случилось, а ты обрабатываешь его потом.
Stream Processing работает с данными прямо в потоке.
Отлично для мониторинга, антифрода, рекомендаций в реальном времени.
Скорость выше, но инфраструктура сложнее и поддержка дороже.
Часто косячат: ставят stream там, где батча за глаза, или наоборот, лепят batch туда, где важна минимальная задержка.
Фишка не в том, чтобы выбрать самое модное, а в том, чтобы попасть в реальный ритм бизнеса и решить конкретную задачу.
А если ресурсы сильно ограничены, скорее всего, batch уже закрывает потребности.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Совет по Java: начиная с Java 8 можно легко убирать null значения с помощью
👉 Java Portal
list.removeIf(Objects::isNull)Please open Telegram to view this post
VIEW IN TELEGRAM
❤15
Совет по Docker
Как понять, что раздувает образ
Любой Docker-образ состоит из слоев.
Каждая строка в Dockerfile добавляет новый слой.
По этим слоям можно понять, почему образ получается большим, долго собирается или плохо кешируется.
Вот как посмотреть слои и узнать, что именно менялось в каждом из них.
Используй утилиту dive.
Она показывает наглядно:
- какие слои созданы
- какие файлы добавлены или изменены
- сколько места занимает каждый слой
Когда начинаешь изучать слои образа, можно быстро выяснить:
• какая команда в Dockerfile добавляет лишний вес
• как оптимизировать сборку, чтобы образ был меньше и собирался быстрее
Dive также дает оценку «эффективности» образа. Она показывает, насколько много данных дублируется или просто впустую занимает место в слоях.
👉 Java Portal
Как понять, что раздувает образ
Любой Docker-образ состоит из слоев.
Каждая строка в Dockerfile добавляет новый слой.
По этим слоям можно понять, почему образ получается большим, долго собирается или плохо кешируется.
Вот как посмотреть слои и узнать, что именно менялось в каждом из них.
Используй утилиту dive.
Она показывает наглядно:
- какие слои созданы
- какие файлы добавлены или изменены
- сколько места занимает каждый слой
Когда начинаешь изучать слои образа, можно быстро выяснить:
• какая команда в Dockerfile добавляет лишний вес
• как оптимизировать сборку, чтобы образ был меньше и собирался быстрее
Dive также дает оценку «эффективности» образа. Она показывает, насколько много данных дублируется или просто впустую занимает место в слоях.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤5
Java/Backend. Интервью. Сценарный вопрос про распределенный лок:
У тебя есть критичный сервис, допустим обработка заказов, который крутится на нескольких инстансах в Kubernetes. Чтобы избежать гонки, когда два инстанса одновременно берут один и тот же заказ, ты ставишь распределенный лок через Redis setnx с TTL 10 секунд.
Какой критичный кейс все равно возможен, если один из инстансов словит Full GC паузу длиной 15 секунд сразу после получения лока? Опиши ситуацию split-brain и к чему она приведет по данным.
Как это разруливать на интервью:
→ сначала важно отметить, что простой Redis-лок с TTL помогает, если сервис просто упал, но создает новую, куда более опасную проблему
→ баг в том, что длинная пауза, например Full GC, может быть дольше, чем TTL лока
→ и вот что ломается (Split-Brain):
Service A берет лок,
и тут же уходит в GC на 15 секунд
Через 10 секунд Redis удаляет лок по TTL
Service B спокойно берет тот же лок,
и начинает обрабатывать заказ
Через 15 секунд Service A просыпается
все еще уверенный, что лок у него
и тоже обрабатывает этот же заказ
→ итог: два сервиса одновременно трогают один и тот же заказ. Данные ломаются. Например клиенту списывают деньги дважды.
→ реальное решение (меняем дизайн): вообще избавиться от лока
Кладем заказы в очередь сообщений,
например Kafka или RabbitMQ
Consumer group с несколькими инстансами читает этот топик
Брокер гарантирует, что каждое сообщение (заказ) уходит только одному инстансу из группы
👉 Java Portal
У тебя есть критичный сервис, допустим обработка заказов, который крутится на нескольких инстансах в Kubernetes. Чтобы избежать гонки, когда два инстанса одновременно берут один и тот же заказ, ты ставишь распределенный лок через Redis setnx с TTL 10 секунд.
Какой критичный кейс все равно возможен, если один из инстансов словит Full GC паузу длиной 15 секунд сразу после получения лока? Опиши ситуацию split-brain и к чему она приведет по данным.
Как это разруливать на интервью:
→ сначала важно отметить, что простой Redis-лок с TTL помогает, если сервис просто упал, но создает новую, куда более опасную проблему
→ баг в том, что длинная пауза, например Full GC, может быть дольше, чем TTL лока
→ и вот что ломается (Split-Brain):
Service A берет лок,
и тут же уходит в GC на 15 секунд
Через 10 секунд Redis удаляет лок по TTL
Service B спокойно берет тот же лок,
и начинает обрабатывать заказ
Через 15 секунд Service A просыпается
все еще уверенный, что лок у него
и тоже обрабатывает этот же заказ
→ итог: два сервиса одновременно трогают один и тот же заказ. Данные ломаются. Например клиенту списывают деньги дважды.
→ реальное решение (меняем дизайн): вообще избавиться от лока
Кладем заказы в очередь сообщений,
например Kafka или RabbitMQ
Consumer group с несколькими инстансами читает этот топик
Брокер гарантирует, что каждое сообщение (заказ) уходит только одному инстансу из группы
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍3
Учебник по Java от Андрея Иванцова теперь доступен онлайн на GitBook. В нём собрано всё, что нужно новичку: от простых типов данных и строк до исключений и коллекций. Материал подан по делу, с примерами кода и понятными объяснениями.
Ссылка для тех, кто хочет прокачаться: andrey-ivantsov.gitbook.io/java
👉 Java Portal
Ссылка для тех, кто хочет прокачаться: andrey-ivantsov.gitbook.io/java
Please open Telegram to view this post
VIEW IN TELEGRAM
👀7
Совет по Spring Boot 4. В Jackson 3 теперь в приоритете JsonMapper для работы с JSON. Обрати внимание на новый import. ObjectMapper из com.fasterxml больше не нужен. JsonMapper теперь основной инструмент для JSON в современных Spring-приложениях.
👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8
Spring Framework 7 добавил встроенный механизм ретраев. Больше не нужно подключать внешнюю зависимость spring-retry. Если надо больше контроля, чем даёт
👉 Java Portal
@Retryable, используй RetryTemplatePlease open Telegram to view this post
VIEW IN TELEGRAM
👍8
Spring Boot 4 делает настройку HTTP-интерфейсов гораздо чище
Больше никакого ручного создания прокси и шаблонного кода. Просто используй
Было 5+ строк конфигурации на каждый клиент → стала одна аннотация
👉 Java Portal
Больше никакого ручного создания прокси и шаблонного кода. Просто используй
@ImportHttpServices и готово.Было 5+ строк конфигурации на каждый клиент → стала одна аннотация
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7
kill -15 даёт ядру возможность завершить процесс аккуратно, чтобы тот успел всё почистить и закрыть как положено.
kill -9 — это уже жёсткий килл, без шансов на «прощальную речь». Процесс просто вырубается, не успев освободить ресурсы или записать данные.
Вот пример с node http-server: при обычном завершении (-15) он корректно закрывает соединения, а при -9 просто падает без возможности что-то доработать.
Короче, будь готов к -9, но надейся на -15.
👉 Java PortalМ
kill -9 — это уже жёсткий килл, без шансов на «прощальную речь». Процесс просто вырубается, не успев освободить ресурсы или записать данные.
Вот пример с node http-server: при обычном завершении (-15) он корректно закрывает соединения, а при -9 просто падает без возможности что-то доработать.
Короче, будь готов к -9, но надейся на -15.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤2
Дерево зависимостей Spring Boot 4, где в деле видно Jackson 3
Обрати внимание на новые пакеты tools.jackson.* (ядро Jackson 3), идущие вместе с com.fasterxml.jackson.annotations:2.20. Это не ошибка — Jackson 3 специально использует те же аннотации, что и в версии 2, ради совместимости
👉 Java Portal
Обрати внимание на новые пакеты tools.jackson.* (ядро Jackson 3), идущие вместе с com.fasterxml.jackson.annotations:2.20. Это не ошибка — Jackson 3 специально использует те же аннотации, что и в версии 2, ради совместимости
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8