HTTP/2 через TCP против HTTP/3 через QUIC
▪️ HTTP/2
▪️ HTTP/3
👉 Java Portal
Мультиплексирование на уровне HTTP, сериализация на уровне TCP
Общий порядок доставки и контроль перегрузки (TCP)
Одна TCP-сессия
HTTP/2 фреймы (мультиплексированные)
* HEADERS (поток 1)
* HEADERS (поток 3)
* HEADERS (поток 2)
* DATA (поток 1)
* DATA (поток 3)
* DATA (поток 2)
TCP-пакеты: P1, P2, P3, P4, P5
TCP-пакеты смешивают данные из разных потоков
HoL-блокировка в TCP (Head-of-Line): потеря одного пакета блокирует все потоки
Клиент -> Сервер
Мультиплексирование на транспортном уровне (QUIC)
* Независимые потоки
* Независимый порядок доставки и восстановление
QUIC-соединение (поверх UDP)
QUIC Stream 1: QUIC Packet, QUIC Packet, QUIC Packet
QUIC Stream 2: QUIC Packet, QUIC Packet
QUIC Stream 3: QUIC Packet, QUIC Packet
Нет HoL-блокировки: потеря пакета влияет только на один поток
Клиент -> Сервер
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
Java tip: для точных расчетов времени используй Duration и Instant.
✅ Instant представляет конкретный момент времени в UTC с точностью до наносекунд. Получить можно так:
✅ Duration показывает временной интервал между двумя
Вот пример:
👉 Java Portal
Instant.now(). Instant (в секундах, миллисекундах, наносекундах). Вот пример:
Instant start = Instant.now();
...
Instant end = Instant.now();
Duration elapsed = Duration.between(start, end);
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Изучение Spring Boot у новичков часто вызывает перегруз 😵💫
Поэтому автор сделал Spring Boot Self Learning Guide: короткий гайд с упором на примеры, который покрывает самые часто используемые фичи Spring Boot.
👉 Java Portal
Поэтому автор сделал Spring Boot Self Learning Guide: короткий гайд с упором на примеры, который покрывает самые часто используемые фичи Spring Boot.
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - sivaprasadreddy/spring-boot-self-learning-guide: Spring Boot Self Learning Guide
Spring Boot Self Learning Guide. Contribute to sivaprasadreddy/spring-boot-self-learning-guide development by creating an account on GitHub.
👍8❤6🔥4🌚1
Java: с
👉 Java Portal
CompletableFuture.allOf(...) можно дождаться завершения сразу нескольких асинхронных задач, без ручной возни с join() по каждой.Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Осознанная стоимость абстракций: Autoboxing в современной Java
👉 Java Portal
Мы живём во времена, когда на оперативной памяти для heap Java-приложений почти не экономят, а архитектурные решения, которые ещё недавно можно было назвать расточительными, всё чаще воспринимаются как best practices.
Но не все коту масленица. Благодаря AI-буму, облачным вычислениям и микросервисной архитектуре с сотнями одновременно работающих инстансов, мы можем воочию наблюдать неукротимый рост стоимости оперативной памяти, что обязывает вернуться к рассмотрению принципов её экономии.
В этих условиях привычные абстракции требуют переоценки.
Сегодня я хочу напомнить об одной из самых распространенных в Java — autoboxing — механизме автоматической упаковки примитивных типов в соответствующие объекты-обертки.
Приглашаю вас посмотреть на знакомый Java-код не глазами разработчика, а глазами JVM, сборщика мусора и процессора, и разобраться, как незаметные на уровне синтаксиса решения превращаются в аллокации, давление на GC и раздувание heap.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Совет по Java: используйте List.copyOf(list), чтобы сделать безопасную, неизменяемую копию и избежать случайных изменений.
👉 Java Portal
// До Java 10, чтобы получить независимую неизменяемую копию, приходилось писать так:
List<String> copy = Collections.unmodifiableList(new ArrayList<>(originalList));
// Начиная с Java 10 это можно сделать короче:
List<String> copy = List.copyOf(originalList);
// Любая попытка добавить/удалить элемент выбросит UnsupportedOperationException:
List<String> original = new ArrayList<>();
original.add("A");
original.add("B");
List<String> copy = List.copyOf(original);
copy.add("C"); // UnsupportedOperationException
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍2
В Spring Boot лучше заменять
▪️ Когда ты используешь
▪️
Разница по сути такая:
▪️ С
▪️ С
Плюсы:
▪️ автокомплит в IDE
▪️ валидация
▪️ проще тестировать
▪️ чище структура кода
В тестах можно просто замокать объект с настройками, вместо того чтобы возиться с отдельными
👉 Java Portal
@Value на @ConfigurationProperties, если хочешь больше контроля и нормальную тестируемость.@Value для кучи параметров, конфиг расползается по проекту: настройки оказываются разбросаны по разным классам, их сложнее поддерживать и тестировать.@ConfigurationProperties собирает связанные параметры в один класс, позволяет навесить валидацию и делает структуру кода аккуратнее.Разница по сути такая:
@Value это строковая инъекция свойств без валидации.@ConfigurationProperties это type-safe конфиг с возможностью валидации.Плюсы:
В тестах можно просто замокать объект с настройками, вместо того чтобы возиться с отдельными
@Value аннотациями на каждом поле.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍2❤1