Java / Spring
IntelliJ IDEA Blog
Project Loom in IntelliJ IDEA: Virtual Threads, Scoped Values, and Structured Concurrency
Открыть оригинал ↗ Перевод заголовка: Project Loom в IntelliJ IDEA: виртуальные потоки,Scoped Values и структурированная конкуренция
Нововведения Project Loom в IntelliJ IDEA решают ключевые проблемы Java-конкурентности: избыточные ресурсы, сложность передачи контекста и трудности в управлении потоками. Виртуальные потоки, Scoped Values и структурированная конкуренция работают вместе, обеспечивая масштабируемость, безопасность и читаемость кода.
- Виртуальные потоки (JEP 444) позволяют запускать миллионы потоков без перегрузки ОС, так как они не связаны с операционными потоками и не требуют управления пулями.
- Scoped Values (JEP 506) заменяют ThreadLocal — они обеспечивают безопасную, неизменяемую передачу контекста (например, ID пользователя), автоматически удаляя данные при завершении области.
- Структурированная конкуренция (JEP 533) вводит явную иерархию потоков с родительскими и дочерними задачами, что упрощает отмену, обработку ошибок и отслеживание выполнения.
Когда пригодится:
— При работе с асинхронными запросами (например, загрузка профиля из нескольких сервисов).
— При необходимости передавать контекст (логин, транзакция) между потоками без риска утечек памяти.
— В сервисах с высокой нагрузкой, где важно избежать утечек потоков и быстрого отклика на сбои.
var scope = StructuredTaskScope.open(
Joiner.awaitAllSuccessfulOrThrow(),
config -> config.withName("customer-profile").withTimeout(Duration.ofSeconds(2))
);
return ScopedValue.where(CUSTOMER_ID, customerId).call(() -> {
try (var scope = StructuredTaskScope.open(...)) {
var orderTask = scope.fork(() -> orderServiceClient.getOrders(CUSTOMER_ID.get()));
var recTask = scope.fork(() -> recommendationServiceClient.getRecommendations(CUSTOMER_ID.get()));
scope.join();
return new CustomerProfile(customerId, orderTask.get(), recTask.get());
} catch (ExecutionException e) {
switch (e.getCause()) {
case StructuredTaskScope.CancelledByTimeoutException -> throw new TimeoutException("Request timed out");
case OrderServiceException ose -> throw ose;
default -> throw new RuntimeException(e.getCause());
}
}
});
System Design
Confluent
Hemut: Building the Internet of Freight on Real-Time Data
Открыть оригинал ↗ Перевод заголовка: Hemut: создание Интернета грузовых перевозок на основе реального времени данных
Hemut разрабатывает AI-ориентированную операционную систему для грузоперевозок, позволяющую автоматизировать процессы и сократить издержки. Платформа объединяет ERP и TMS, обеспечивая непрерывную синхронизацию данных в реальном времени, что позволяет избежать задержек и ошибок. Ключевые функции включают 24/7 работу голосовых агентов, автоматизацию бухгалтерских и логистических операций, а также прямое взаимодействие с системами брокеров и грузоотправителей.
Когда пригодится:
— При работе с грузоперевозками, где важна скорость реакции и точность данных.
— Для малых и средних перевозчиков, стремящихся к автоматизации без больших инвестиций.
— При необходимости внедрения AI-решений на основе непрерывного потока данных.
— В условиях, где критична оперативность принятия решений (например, в маршрутизации, техническом обслуживании).
# Пример команды для подключения к Confluent Cloud
confluent-cli topics list --bootstrap-server bootstrap.confluent.io:9092
# Проверка потока событий от телематики
kafka-console-consumer.sh --bootstrap-server bootstrap.confluent.io:9092 \
--topic truck-telematics \
--from-beginning
DesignGurus
Serverless System Design Fundamentals: A Practical Guide for Developers
Открыть оригинал ↗ Перевод заголовка: Основы проектирования систем на основе серверного подхода: практическое руководство для разработчиков
Серверный подход — это не отсутствие серверов, а их автоматическое управление: облачный провайдер сам настраивает, масштабирует и отключает ресурсы. Разработчики должны понимать, что функции в этом контексте не работают в виртуальных машинах, а в контейнерах, где может возникать задержка из-за «холодного старта».
Ключевые практические тезисы:
- Функции (FaaS) запускаются при событии (HTTP-запрос, изменение базы данных и т.д.), и работают только при активации — без нагрузки они не потребляют ресурсов.
- Время выполнения и объём памяти определяют стоимость в гигабайт-секундах (GB-s), что делает модель ценовой эффективной для редких запросов.
- Холодный старт может добавлять задержку от сотен миллисекунд до секунд — критичен для пользовательских API, но не для фоновых задач.
- Функции не хранят состояние — требуется внешнее хранилище (например, базы данных или кэширование).
- Важно понимать ограничения: длительность выполнения, отсутствие поддержки долгих задач, риск зависимости от провайдера.
Когда пригодится:
— При обработке редких событий (например, обновления файлов или уведомлений).
— При создании API-эндпоинтов с низкой задержкой и минимальным расходом ресурсов.
— Когда не требуется постоянное выполнение кода или управление инфраструктурой.