8 концепций проектирования систем, объясненных в одной диаграмме
👉 Java Portal
1. Availability with Load Balancers
Использование балансировщиков (Layer 7) для распределения трафика между несколькими экземплярами сервисов (например, Comment Service, Post Service).
Повышает отказоустойчивость и доступность.
2. Latency with CDNs
CDN кэширует контент ближе к пользователю, уменьшая задержки.
Первый запрос идёт на origin-сервер, второй — уже из кэша CDN.
3. Scalability with Replication
Данные реплицируются между несколькими узлами.
Увеличивает доступность и масштабируемость систем.
4. Durability with Transaction Logs
Система сохраняет изменения в журнал транзакций перед применением.
В случае сбоя состояние может быть восстановлено из лога.
5. Consistency with Eventual Consistency
Записи и чтения могут идти в разные источники.
Система приходит к согласованному состоянию со временем (eventually).
6. Modularity with Loose Coupling and High Cohesion
Модули имеют чёткие границы и хорошо организованы внутри.
Улучшает читаемость, повторное использование и сопровождение кода.
7. Configurability with Configuration-as-Code
Инфраструктура управляется через код (например, Terraform, Ansible).
Контроль версий, автоматизация и повторяемость.
8. Resiliency with Message Queues
Задания помещаются в очередь, откуда обрабатываются несколькими потребителями.
Улучшает отказоустойчивость и масштабируемость обработки.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤4
Метод
Если тебе нужно выполнить сложную выборку (например, последнюю запись на дату) — не бойся использовать
⏩ Читать подробнее
👉 Java Portal | #cтатья
createNativeQuery
из JPA EntityManager
Если тебе нужно выполнить сложную выборку (например, последнюю запись на дату) — не бойся использовать
createNativeQuery
. Нативный SQL в JPA — это мощный инструмент, особенно когда JPQL ограниченPlease open Telegram to view this post
VIEW IN TELEGRAM
👍7👀2
Виртуальные потоки с Project Loom
Традиционные потоки в Java мощный, но тяжёлый механизм, который ограничивает масштабируемость в высоконагруженных многопоточных приложениях.
С появлением Project Loom вводится концепция виртуальных потоков т.е. лёгких потоков, управляемых самой JVM, которые упрощают работу с конкурентностью и делают её более эффективной.
Виртуальные потоки позволяют запускать тысячи параллельных задач с минимальными накладными расходами, при этом сохраняя простой, блокирующий стиль написания кода без ущерба для производительности.😇
👉 Java Portal
Традиционные потоки в Java мощный, но тяжёлый механизм, который ограничивает масштабируемость в высоконагруженных многопоточных приложениях.
С появлением Project Loom вводится концепция виртуальных потоков т.е. лёгких потоков, управляемых самой JVM, которые упрощают работу с конкурентностью и делают её более эффективной.
Виртуальные потоки позволяют запускать тысячи параллельных задач с минимальными накладными расходами, при этом сохраняя простой, блокирующий стиль написания кода без ущерба для производительности.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8
Гайд как откатить последний коммит в Git (пошагово)
① Если ещё не делал
Оставить изменения в
Полностью удалить изменения:
Отредактировать последний коммит (сообщение или содержимое):
② Если уже сделал
Используй
(Если возникнут конфликты — их придётся разрулить вручную.)
Получи хеш нужного коммита с помощью:
★ Уровень «эксперт»:
Используй
Можно менять порядок, объединять, править или удалять коммиты.
После изменений —
Важно: Делай
или вся команда согласована и не против переписывания истории.
👉 Java Portal
① Если ещё не делал
push
:Оставить изменения в
staging
(индексе):git reset --soft HEAD~1
Полностью удалить изменения:
git reset --hard HEAD~1
Отредактировать последний коммит (сообщение или содержимое):
git commit --amend -m "Исправленное сообщение"
② Если уже сделал
push
:Используй
git revert <хеш>
, чтобы создать новый коммит, отменяющий изменения предыдущего.(Если возникнут конфликты — их придётся разрулить вручную.)
Получи хеш нужного коммита с помощью:
git log
★ Уровень «эксперт»:
Используй
git rebase -i
для редактирования локального коммит-истории:Можно менять порядок, объединять, править или удалять коммиты.
После изменений —
git push --force-with-lease
Важно: Делай
rebase
и push --force-with-lease
только если ты один работаешь в веткеили вся команда согласована и не против переписывания истории.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍4
Пример проекта, демонстрирующий, как использовать GraphQL вместе с Spring Boot.
В репозитории показано:
🔸 как настроить GraphQL в Spring-приложении,
🔸 как описывать схемы, резолверы и DTO,
🔸 как работать с базой данных (MongoDB),
🔸 и как совмещать GraphQL с REST-контроллерами.
Подойдёт, если ты хочешь разобраться, как устроен GraphQL в экосистеме Spring или ищешь базу для своего pet-проекта.
👉 Java Portal
В репозитории показано:
Подойдёт, если ты хочешь разобраться, как устроен GraphQL в экосистеме Spring или ищешь базу для своего pet-проекта.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍3
Как выдержать нагрузку в 10 000 одновременных пользователей
1. Поставь балансировщик нагрузки (Load Balancer) спереди
- Распределяй трафик между несколькими backend-серверами.
- Инструменты:
2. Масштабируй горизонтально
- Один мощный сервер — нет.
- Используй несколько небольших stateless-серверов за LB.
3. Пиши stateless-сервисы
- Не храни сессии или состояние в оперативке.
- Используй
4. Используй connection pooling
- Базы «захлебываются» от 10 000 одновременных подключений.
- Ограничь число подключений к БД с каждого сервера через пул (например,
5. Активно кэшируй
Кешировать можно:
- Static files → CDN
- DB-запросы → Redis
- HTML-фрагменты → Edge cache
6. Используй read-replicas
- Разделяй чтение и запись, чтобы масштабировать чтение из базы.
7. Async и очереди (Queued Workloads)
- Переноси тяжёлые задачи (почта, видео и т.д.) в background jobs.
- Используй очереди:
8. Включи авто-масштабирование
- Используй инфраструктуру, способную масштабироваться под нагрузку:
9. WebSocket / Реалтайм? Используй gateway-сервисы
- Запускай WebSocket-шлюзы (например,
- Масштабируй через sticky-сессии или pub/sub (
10. Мониторь всё
- Отслеживай
- Инструменты:
👉 Java Portal
1. Поставь балансировщик нагрузки (Load Balancer) спереди
- Распределяй трафик между несколькими backend-серверами.
- Инструменты:
NGINX
, HAProxy
, AWS ELB
.2. Масштабируй горизонтально
- Один мощный сервер — нет.
- Используй несколько небольших stateless-серверов за LB.
3. Пиши stateless-сервисы
- Не храни сессии или состояние в оперативке.
- Используй
Redis
/ Memcached
или JWT
для сессий и авторизации.4. Используй connection pooling
- Базы «захлебываются» от 10 000 одновременных подключений.
- Ограничь число подключений к БД с каждого сервера через пул (например,
HikariCP
).5. Активно кэшируй
Кешировать можно:
- Static files → CDN
- DB-запросы → Redis
- HTML-фрагменты → Edge cache
6. Используй read-replicas
- Разделяй чтение и запись, чтобы масштабировать чтение из базы.
7. Async и очереди (Queued Workloads)
- Переноси тяжёлые задачи (почта, видео и т.д.) в background jobs.
- Используй очереди:
SQS
, RabbitMQ
, Kafka
.8. Включи авто-масштабирование
- Используй инфраструктуру, способную масштабироваться под нагрузку:
AWS EC2 + ASG
, GCP GKE
и т.д.9. WebSocket / Реалтайм? Используй gateway-сервисы
- Запускай WebSocket-шлюзы (например,
Socket.io
за LB). - Масштабируй через sticky-сессии или pub/sub (
Redis
, Kafka
).10. Мониторь всё
- Отслеживай
CPU
, память
, задержки
, глубину очередей
. - Инструменты:
Prometheus + Grafana
, Datadog
, New Relic
.Please open Telegram to view this post
VIEW IN TELEGRAM
❤8🔥7👍2👀1
Выделение памяти в Java
В Java память по умолчанию выделяется в куче с помощью new.
Это просто, управляется сборщиком мусора и подходит для большинства приложений.
Но если нужны высокая производительность или низкие задержки, можно использовать off-heap память через
Такой подход выделяет память вне кучи, снижает нагрузку на GC и повышает эффективность при работе с большими или долго живущими данными.
Off-heap даёт больше контроля и производительности,
но требует аккуратного управления ресурсами,
так как такая память не очищается автоматически, в отличие от памяти в куче.
👉 Java Portal
В Java память по умолчанию выделяется в куче с помощью new.
Это просто, управляется сборщиком мусора и подходит для большинства приложений.
Но если нужны высокая производительность или низкие задержки, можно использовать off-heap память через
ByteBuffer.allocateDirect()
. Такой подход выделяет память вне кучи, снижает нагрузку на GC и повышает эффективность при работе с большими или долго живущими данными.
Off-heap даёт больше контроля и производительности,
но требует аккуратного управления ресурсами,
так как такая память не очищается автоматически, в отличие от памяти в куче.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2🔥2
Вопросы на собеседование по Spring Boot
1. Как Spring Boot определяет, какие бины создавать при автоконфигурации?
2. Для чего используется аннотация
3. Как реализовать пользовательскую валидацию в Spring Boot с помощью аннотаций?
4. Как
5. В чём разница между
6. Как вынести конфигурацию Spring Boot для разных окружений (environments)?
7. Что такое
👉 Java Portal
1. Как Spring Boot определяет, какие бины создавать при автоконфигурации?
2. Для чего используется аннотация
@ConditionalOnProperty
?3. Как реализовать пользовательскую валидацию в Spring Boot с помощью аннотаций?
4. Как
@Transactional
обрабатывает вложенные транзакции?5. В чём разница между
application.properties
и application.yml
в Spring Boot?6. Как вынести конфигурацию Spring Boot для разных окружений (environments)?
7. Что такое
WebClient
в Spring Boot и чем он отличается от RestTemplate
?Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥1
Сохраняем себе: Jimmer
это иммутабельный ORM, заточенный под работу с графами объектов, а не отдельными сущностями.
🔹 Авто-генерация DTO
🔹 Без N+1 (batch fetch из коробки)
🔹 Умные SQL без лишних JOIN'ов
🔹 DSL с type-safety
🔹 GraphQL + TypeScript-генерация
🔹 Кеширование (включая Redis)
🔹 Работает через APT/KSP
⇢ https://github.com/babyfish-ct/jimmer
👉 Java Portal
это иммутабельный ORM, заточенный под работу с графами объектов, а не отдельными сущностями.
⇢ https://github.com/babyfish-ct/jimmer
Please open Telegram to view this post
VIEW IN TELEGRAM
👀5❤3
Слышал когда-нибудь про объект, который отказывается умирать?
В Java можно «воскресить» объект во время сборки мусора с помощью метода finalize(). Но это — рискованная практика, и сам метод уже помечен как устаревший.
Этот код демонстрирует поведение метода
👉 Java Portal
В Java можно «воскресить» объект во время сборки мусора с помощью метода finalize(). Но это — рискованная практика, и сам метод уже помечен как устаревший.
Этот код демонстрирует поведение метода
finalize()
в Java — он вызывается только один раз перед удалением объекта сборщиком мусора. В первой попытке объект «воскрешается» внутри finalize
, но при повторной попытке finalize
уже не вызывается, и объект действительно удаляется.Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🤔5❤3
Java API (не из Spring Boot), которые стоит знать
1. Java Streams API
🔸 API для функциональной работы с коллекциями — фильтрация, преобразование, агрегация и пр.
2. Files & NIO.2 (
🔸 Мощное и современное API для работы с файлами и директориями.
3.
🔸 Новая система работы с датой и временем (введена в Java 8) — безопаснее и удобнее, чем Date/Calendar.
4. JUnit 5
Фреймворк для модульного тестирования с расширенными возможностями и гибкой архитектурой.
5.
🔸 API для реализации многопоточности, синхронизации и конкурентных структур данных.
6.
🔸 Стандартный HTTP-клиент для отправки запросов и получения ответов (введён в Java 11).
7. Process API (
🔸 Позволяет управлять и отслеживать системные процессы: получать PID, статус, время запуска и пр.
👉 Java Portal
1. Java Streams API
2. Files & NIO.2 (
java.nio.file
) 3.
java.time
(Date and Time API) 4. JUnit 5
Фреймворк для модульного тестирования с расширенными возможностями и гибкой архитектурой.
5.
java.util.concurrent
(Concurrency API) 6.
java.net.http
(HTTP Client API) 7. Process API (
java.lang.ProcessHandle
) Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
This media is not supported in your browser
VIEW IN TELEGRAM
Если ты изучаешь Java или хочешь прокачать навыки, обрати внимание на JBook — это интерактивная книга по Java, доступная прямо на GitHub.
Что внутри:
🔸 Подробное объяснение основ языка Java;
🔸 Примеры кода с пояснениями;
🔸 Упражнения для закрепления знаний;
🔸 Поддержка Jupyter Notebook + Java (IJava kernel) — можно запускать код прямо в браузере
GitHub: https://github.com/qcha/JBook
👉 Java Portal
Что внутри:
GitHub: https://github.com/qcha/JBook
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤4👍4
Топ 20 команд Git, которые нужно знать
1. git init — Создать новый репозиторий в текущей директории.
🔸 Пример:
2. git branch — Создать локальную ветку.
🔸 Пример:
3. git checkout — Переключиться на другую ветку.
🔸 Пример:
4. git add — Добавить файлы в индекс (staging area) для коммита.
🔸 Пример:
5. git commit — Зафиксировать добавленные изменения.
🔸 Пример:
6. git pull — Обновить локальную ветку с удалённого репозитория.
🔸 Пример:
7. git push — Отправить локальные коммиты в удалённый репозиторий.
🔸 Пример:
8. git status — Показать состояние файлов (изменённые, добавленные, удалённые и т.д.).
🔸 Пример:
9. git diff — Показать разницу между версиями.
🔸 Пример:
10. git log — Посмотреть историю коммитов.
🔸 Пример:
11. git clone — Скопировать удалённый репозиторий локально.
🔸 Пример:
12. git merge — Объединить ветки.
🔸 Пример:
13. git rebase — Перенести коммиты на другую базу (ветку).
🔸 Пример:
14. git stash — Временно сохранить изменения, не готовые к коммиту.
🔸 Пример:
15. git fetch — Скачивать объекты из удалённого репозитория без слияния.
🔸 Пример:
16. git reset — Переместить HEAD или убрать файлы из индекса.
🔸 Пример:
17. git revert — Создать новый коммит, отменяющий предыдущие изменения.
🔸 Пример:
18. git cherry-pick — Применить конкретный коммит на текущую ветку.
🔸 Пример:
19. git remote — Управление удалёнными репозиториями.
🔸 Пример:
20. git tag — Пометить контрольные точки релизов.
🔸 Пример:
👉 Java Portal
1. git init — Создать новый репозиторий в текущей директории.
git init my-new-project
2. git branch — Создать локальную ветку.
git branch feature/login
3. git checkout — Переключиться на другую ветку.
git checkout feature/login
4. git add — Добавить файлы в индекс (staging area) для коммита.
git add file.js
5. git commit — Зафиксировать добавленные изменения.
git commit -m "Fix navigation bug"
6. git pull — Обновить локальную ветку с удалённого репозитория.
git pull origin main
7. git push — Отправить локальные коммиты в удалённый репозиторий.
git push origin main
8. git status — Показать состояние файлов (изменённые, добавленные, удалённые и т.д.).
git status
9. git diff — Показать разницу между версиями.
git diff HEAD~1 HEAD
10. git log — Посмотреть историю коммитов.
git log --oneline --graph
11. git clone — Скопировать удалённый репозиторий локально.
git clone https://github.com/user/repo.git
12. git merge — Объединить ветки.
git merge feature/login
13. git rebase — Перенести коммиты на другую базу (ветку).
git rebase main
14. git stash — Временно сохранить изменения, не готовые к коммиту.
git stash push -m "WIP login"
15. git fetch — Скачивать объекты из удалённого репозитория без слияния.
git fetch origin
16. git reset — Переместить HEAD или убрать файлы из индекса.
git reset --hard HEAD~1
17. git revert — Создать новый коммит, отменяющий предыдущие изменения.
git revert 1a2b3c4
18. git cherry-pick — Применить конкретный коммит на текущую ветку.
git cherry-pick 1a2b3c4
19. git remote — Управление удалёнными репозиториями.
git remote add origin git@github.com:user/repo.git
20. git tag — Пометить контрольные точки релизов.
git tag -a v1.0 -m "Initial release"
Please open Telegram to view this post
VIEW IN TELEGRAM
❤15👍8
Модель памяти в Java
Java управляет памятью в двух основных областях:
- Stack (стековая память) — хранит фреймы вызова методов и локальные переменные. Работает быстро и автоматически очищается при выходе из метода.
- Heap (куча) — используется для хранения объектов, созданных через
➡️ Объекты всегда размещаются в куче (heap).
➡️ Ссылки на эти объекты (например, локальные переменные) хранятся в стеке (stack).
➡️ Неправильное управление созданием объектов или удержание ссылок дольше, чем нужно, может привести к утечкам памяти (memory leaks).
👉 Java Portal
Java управляет памятью в двух основных областях:
- Stack (стековая память) — хранит фреймы вызова методов и локальные переменные. Работает быстро и автоматически очищается при выходе из метода.
- Heap (куча) — используется для хранения объектов, созданных через
new
. Управляется сборщиком мусора (Garbage Collector), работает медленнее, но даёт больше гибкости.public class MemoryDemo {
public static void main(String[] args) {
int x = 10; // Хранится в стеке
Person p = new Person("Alice"); // 'p' находится в стеке, объект — в куче
p.sayHello(); // Вызов метода создаёт новый стек-фрейм
}
}
class Person {
String name; // Поле хранится в куче вместе с объектом
Person(String name) {
this.name = name;
}
void sayHello() {
System.out.println("Hello, " + name);
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍2🔥2
Стратегии ветвления в Git
При управлении кодом в разработке ПО выбор правильной стратегии ветвления напрямую влияет на командную работу, интеграцию и процесс деплоя.
Вот основные стратегии ветвления в Git:
1. Feature Branching (ветки под фичи)
Создаётся отдельная ветка для каждой фичи или багфикса. Разработчики работают с этими ветками независимо, а после завершения и ревью — вливают изменения в основную ветку (обычно
Подходит для команд, где важен строгий код-ревью и фичи разрабатываются изолированно.
2. Gitflow
Модель ветвления с чётким процессом управления релизами. Используются ветки
Лучше всего подходит для крупных проектов с запланированными циклами релизов.
3. GitLab Flow
Комбинирует идеи Feature Branching и Gitflow, но делает их проще. С акцентом на деплой и интеграцию с issue-трекингом и CI/CD.
Стратегия включает основную ветку (
Подходит для команд, использующих GitLab и практики непрерывной поставки (CD).
4. GitHub Flow
Лёгкий и понятный процесс на основе веток, отлично подходит под continuous deployment. Ветка
Хороший выбор для небольших команд и проектов с постоянными поставками.
5. Trunk-Based Development
Все разработчики коммитят напрямую в основную ветку (
Подходит для команд, практикующих CI/CD, и проектов, где приоритет — скорость разработки.
Если ты только начинаешь работать с Git — начни с простой стратегии вроде GitHub Flow и эволюционируй по мере роста команды и сложности проекта.
Для больших команд или сложных процессов лучше использовать более структурированные подходы, такие как Gitflow или GitLab Flow.
Независимо от выбранной стратегии ветвления, важно:
- Настроить автоматическое тестирование, чтобы быстрее ловить баги.
- Согласовать стандарты по commit-сообщениям, нейминг веток и процессам слияния.
👉 Java Portal
При управлении кодом в разработке ПО выбор правильной стратегии ветвления напрямую влияет на командную работу, интеграцию и процесс деплоя.
Вот основные стратегии ветвления в Git:
1. Feature Branching (ветки под фичи)
Создаётся отдельная ветка для каждой фичи или багфикса. Разработчики работают с этими ветками независимо, а после завершения и ревью — вливают изменения в основную ветку (обычно
main
или develop
).Подходит для команд, где важен строгий код-ревью и фичи разрабатываются изолированно.
2. Gitflow
Модель ветвления с чётким процессом управления релизами. Используются ветки
develop
, release
, hotfix
, feature
— каждая со своей ролью в процессе разработки.Лучше всего подходит для крупных проектов с запланированными циклами релизов.
3. GitLab Flow
Комбинирует идеи Feature Branching и Gitflow, но делает их проще. С акцентом на деплой и интеграцию с issue-трекингом и CI/CD.
Стратегия включает основную ветку (
main
), которая отражает продакшен-код, и при необходимости — отдельные ветки под окружения (например, staging
, production
и т.д.).Подходит для команд, использующих GitLab и практики непрерывной поставки (CD).
4. GitHub Flow
Лёгкий и понятный процесс на основе веток, отлично подходит под continuous deployment. Ветка
main
всегда должна быть в деплойном состоянии. Фичи разрабатываются в отдельных ветках от main
, изменения проходят через pull request.Хороший выбор для небольших команд и проектов с постоянными поставками.
5. Trunk-Based Development
Все разработчики коммитят напрямую в основную ветку (
trunk
). Фичевые ветки либо очень короткоживущие, либо не используются вовсе.Подходит для команд, практикующих CI/CD, и проектов, где приоритет — скорость разработки.
Если ты только начинаешь работать с Git — начни с простой стратегии вроде GitHub Flow и эволюционируй по мере роста команды и сложности проекта.
Для больших команд или сложных процессов лучше использовать более структурированные подходы, такие как Gitflow или GitLab Flow.
Независимо от выбранной стратегии ветвления, важно:
- Настроить автоматическое тестирование, чтобы быстрее ловить баги.
- Согласовать стандарты по commit-сообщениям, нейминг веток и процессам слияния.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍2🤔1
Загрузка Java-модуля во время выполнения
Можно загрузить Java-модуль во время выполнения, создав экземпляр
Один из возможных кейсов — реализация плагин-системы в приложении.
Другой кейс — запуск всего приложения через начальный загрузчик, выполняя:
Иными словами, файл
🔸 Загружает все необходимые JAR-файлы приложения.
🔸 Загружает основной модуль приложения и запускает само приложение.
Это базовая идея, лежащая в основе Objectos Start.
👉 Java Portal
Можно загрузить Java-модуль во время выполнения, создав экземпляр
ModuleLayer
:// /tmp/ModuleLoad.java
void main() throws Exception {
Path h2 = Path.of("/tmp/h2-2.3.232.jar");
ModuleFinder before = ModuleFinder.of(h2);
ModuleFinder after = ModuleFinder.of();
Set<String> roots = Set.of("com.h2database");
ModuleLayer parentLayer = ModuleLayer.boot();
Configuration parentConf = parentLayer.configuration();
Configuration conf = parentConf.resolve(before, after, roots);
ClassLoader scl = ClassLoader.getSystemClassLoader();
ModuleLayer layer = parentLayer.defineModulesWithOneLoader(conf, scl);
ClassLoader cl = layer.findLoader("com.h2database");
Class<?> c = cl.loadClass("org.h2.tools.Shell");
Method main = c.getMethod("main", String[].class);
Object args = new String[0];
main.invoke(null, args);
}
Один из возможных кейсов — реализация плагин-системы в приложении.
Другой кейс — запуск всего приложения через начальный загрузчик, выполняя:
java Way.java
Иными словами, файл
Way.java
выступает в роли скрипта, который:Это базовая идея, лежащая в основе Objectos Start.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9
Вредные советы Java
Автор показывает соблазн простого распараллеливания задач на Java через
Однако такой подход использует
(
Если в процессе одна из задач выбрасывает
даже после возврата ошибки.
Параллельные стримы группируют задачи по частям коллекции, и минимальной единицей
может быть блок из нескольких элементов, это может привести к «неравномерной» нагрузке и даже ухудшению производительности по сравнению с ручным управлением через
Блокирующие операции внутри задач могут полностью "забить"
Читать подробнее<...>
👉 Java Portal
Автор показывает соблазн простого распараллеливания задач на Java через
Stream API
и .parallel()
вместо явных ExecutorService
, Future
, invokeAll
и ручной обработки InterruptedException
Однако такой подход использует
common ForkJoinPool
, и его поведение не всегда предсказуемо, результаты могут отличаться между запусками, особенно при исключениях в задачах (
callsCounter
может сильно варьироваться)Если в процессе одна из задач выбрасывает
Exception
, выполнение остальных может продолжаться даже после возврата ошибки.
Параллельные стримы группируют задачи по частям коллекции, и минимальной единицей
может быть блок из нескольких элементов, это может привести к «неравномерной» нагрузке и даже ухудшению производительности по сравнению с ручным управлением через
ExecutorService
. Блокирующие операции внутри задач могут полностью "забить"
common ForkJoinPool
, что повлияет и на выполнение CompletableFuture.thenApplyAsync()
, если вы не указали свой Executor
Читать подробнее<...>
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9❤4
Пишем асинхронный Java-код как синхронный
Разрабатываешь на Java и устал от коллбэков,
Загляни в ea-async от Electronic Arts
ea-async — это библиотека, которая позволяет писать асинхронный код в стиле обычного синхронного Java-кода, используя
Под капотом — bytecode instrumentation и
👉 Java Portal
Разрабатываешь на Java и устал от коллбэков,
.thenApply(), .handle()
и всей этой цепочки с CompletableFuture
?Загляни в ea-async от Electronic Arts
ea-async — это библиотека, которая позволяет писать асинхронный код в стиле обычного синхронного Java-кода, используя
await()
прямо как в JavaScript/TypeScript.Под капотом — bytecode instrumentation и
CompletableFuture
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤2🔥1