Обновить
2K+
34

Пользователь

33
Подписчики
Отправить сообщение

Обработка 100 000 запросов с помощью виртуальных потоков Java и сравнение производительности с обычными потоками

Уровень сложностиПростой
Время на прочтение8 мин
Охват и читатели7.4K

Всем привет!

Сегодня хочу затронуть тему виртуальных потоков и выяснить на сколько они лучше (быстрее) и в каких случаях, чем обычные потоки операционной системы (или как еще их называют платформенные потоки).

Долгое время java полагалась только на потоки операционной системы для обработки параллельных операций. Это выглядело следующим образом, когда веб-сервер получал запрос, он обычно выделял один поток операционной системы для его обработки. Эта модель называется «поток на запрос». Она очень проста — мы просто пишем блокирующий код так, как если бы он был синхронный, а операционная система обрабатывает переключение контекста между потоками в рамках какого-то процесса.

Несмотря на свою простоту, эта модель имеет существенный недостаток: потоки операционной системы обходятся дорого. Каждый поток потребляет от 1 до 2 МБ памяти только на свой стек, а переключение между ними включает в себя переключение контекста на уровне операционной системы, что также является ресурсоемкой операцией.

Представьте, что есть задача по обработке 100 000 одновременных запросов с помощью этой модели. Это приведёт к потреблению десятков гигабайт памяти только под стеки потоков и, скорее всего, к аварийному завершению JVM задолго до достижения такого количества потоков, также будет тратиться время на переключение контекста между потоками. Пропускная способность системы резко упадет из-за накладных расходов.

Для решения этой проблемы разработчики прибегают к сложным асинхронным моделям программирования, к реактивному программированию, к управлению событиями. Хотя эти подходы и являются мощным инструментом, но они вносят значительную сложность, затрудняя чтение, отладку и сопровождение кода. Мы меняем простоту блокирующего кода на сложности, связанные с неблокирующими коллбэками и реактивными потоками.

Читать далее

Паттерн Transactional Outbox на примере двух микросервисов на java

Уровень сложностиПростой
Время на прочтение11 мин
Охват и читатели9.6K

Всем привет! В данной статье будет описан один из возможных вариантов реализации паттерна outbox transactional.

План данной статьи такой: вначале немного теории, а потом на примере двух микросервисов будет показала реализация данного паттерна с помощью postgresql, debezium и kafka.

Данная статья будет полезна для разработчиков, которые не встречались с данным паттерном.

Вначале теория и самый главный вопрос: зачем нужен данный паттерн и какую он решает задачу?

Паттерн Transactional Outbox используется в распределенных транзакциях, то есть в транзакциях, которые проходят и затрагивают несколько микровервисов, для обеспечения гарантированной доставки сообщения от одного микросервиса до другого. Данный паттерн используется там, где очень критично, чтобы сообщение не потерялось, даже при сбоях в системе. Outbox паттерн получил распространение именно в микросервисной архитектуре, где нет возможности с помощью одной аннотации обеспечить транзакционность какого-то конкретного метода.

Читать далее

Apache Kafka. Пишем простой producer и consumer и тестируем их

Уровень сложностиПростой
Время на прочтение15 мин
Охват и читатели117K

В данной статье будет описано, как создать простой kafka producer и kafka consumer, а затем протестировать их.

Читать далее

Spring Data JPA: замена нескольких запросов одним и почему это очень важно

Уровень сложностиПростой
Время на прочтение10 мин
Охват и читатели12K

Spring Data JPA: замена нескольких запросов одним и почему это очень важно.

Всем привет. В данной статье коснусь темы запросов к базе данных и как небольшие изменения в коде позволят значительно увеличить скорость работы нашего приложения, за счет увеличения производительности работы базы данных.

Читать далее

Пишем простой docker-compose.yml для контейнеризации приложения (React, Spring Boot, PostgreSQL, pgAdmin)

Уровень сложностиПростой
Время на прочтение21 мин
Охват и читатели84K

В данной статье описан простой пример написания docker-compose.yml файла на примере контейнеризации приложения с использованием Spring Boot на бэкенде, React на фронте, PostgreSQL в качестве базы данных и pgAdmin - для просмотра данных в базе.

Читать далее

Шаблон проектирования: Composite

Уровень сложностиПростой
Время на прочтение9 мин
Охват и читатели19K

Всем привет! В данной статье рассмотрим паттерн проектирования Composite («Компоновщик»).

Начнем немного с теории.

Паттерн Composite, исходя уже с самого названия, позволяет скомпоновать объекты в структуры по типу «дерева», для предоставления иерархии от частного к целому, а также позволяя клиентам единообразно трактовать отдельные и составные объекты этого дерева. Данный паттерн используется для группировки мелких компонентов в более крупные, которые в свою очередь, могут стать основой для еще более крупных структур.

Читать далее

Шаблон проектирования: Chain of Responsibility

Время на прочтение7 мин
Охват и читатели27K

Всем привет.

Данная статья будет полезна начинающим Java разработчиком понять зачем нужен шаблон проектирования «Цепочка ответственности» и как его можно использовать на примерах.

Итак начнем с самого начала. Основная суть данного шаблона: связывание объектов‑получателей в цепочку и передача запроса по ней.

Читать далее

Пишем простой Telegram bot на java, который показывает официальный курс по отношению к иностранным валютам

Время на прочтение5 мин
Охват и читатели86K

Всем привет! Да-да тема не очень актуальна и на просторах habr-a есть очень много статей про то, как написать простейшего telegram bota, но я все-таки рискну написать еще одну. Может кому-то она будет интересна и полезна.

Для написания бота нужен аккаунт в telegram.

И так начнем: наш бот будет "ходить" на официальную страницу национального банка и выдавать текущий официальный курс к запрашиваемой валюте.

Создадим проект, я это сделаю с помощью https://start.spring.io/

Читать далее

Проблема N+1 и как её решить с помощью EntityGraph

Время на прочтение6 мин
Охват и читатели57K

Всем привет! В данной статье попробуем разобраться с проблемой N+1 (или может правильнее 1+N?) и как ее решить с помощью использования EntityGraph.

Проблема N+1 возникает, когда мы генерируем запрос на получение одной сущности из базы данных, но у данной сущности есть свои связанные сущности, которые мы тоже хотим получить и hibernate генерирует вначале один (1) запрос к базе данных, чтобы получить интересующую нас сущность, а потом N запросов, чтобы достать из базы данных связанные сущности. Данная проблема отражается отрицательно на производительности работы базы данных из-за большого числа обращений к ней.

Создадим проект и подключим следующие зависимости:

Читать далее

Простой пример написания Dockerfile. Использование многоэтапной сборки

Время на прочтение5 мин
Охват и читатели125K

Всем привет! В данной статье хочу показать простой пример написания Dockerfile, объяснить как это все работает, а также показать на примере использование многоэтапной сборки.

Для понимания данной статьи необходимы минимальные знания Docker, а также для использования примеров - установленный Docker Desktop локально на компьютере.

Вначале немного теории.

Dockerfile - это файл, который содержит инструкции для сборки образа. На основании образа создается и запускается контейнер.

Обратимся к официальной документации https://docs.docker.com/get-started/overview/

Читать далее

English Tenses — моё представление времён в английском языке

Время на прочтение3 мин
Охват и читатели14K

Всем привет! Сегодня я хочу представить своё виденье времен в английском языке, а также представить свою диаграмму по изучению и применению на практике данных времен.

Сразу хочу отметить, что я не являюсь педагогом и у меня вообще нет никакого ни лингвистического, ни педагогического образования. Данной статьей я просто хочу поделиться своей диаграммой по изучению времен, возможно кому-то она будет полезной и поможет в понимании времен и того, как и когда использовать, то или иное время. Данная диаграмма будет поверхностной и не будет углубляться во все подробности языка (и так она получилась огромной), она не охватывает все многообразие времен и конструкций в английском. Уровень данной диаграммы А2-В1.

И сразу начну с диаграммы:

Читать далее

Пакетная операция JDBC — команда batchUpdate

Время на прочтение5 мин
Охват и читатели17K

Всем привет! Данная статья будет полезна начинающим разработчикам на Java, для понимания работы пакетных операции и команды batchUpdate и на сколько она эффективнее по производительности в сравнении с update. Поехали!

Вначале немного теории:

С официальной документации:

Читать далее

Практические примеры использования Stream API

Время на прочтение9 мин
Охват и читатели23K

Всем привет! Решил написать статью с практическими примерами использования Stream API. В данной статье не будет теории - только хардкор и практические примеры. Поехали!

В качестве "подопытного кролика" буду использовать проект, который можете найти здесь.

Для тестирования буду использовать Postman.

В проекте есть три сущности с которыми мы будем работать: Client, Product и Booking. Связи между ними можно посмотреть на следующей картинке.

Читать далее

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность

Специализация

Специалист
Java