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

Открыть оригинал ↗ Перевод заголовка: Основы проектирования систем на основе серверного подхода: практическое руководство для разработчиков

Серверный подход — это не отсутствие серверов, а их автоматическое управление: облачный провайдер сам настраивает, масштабирует и отключает ресурсы. Разработчики должны понимать, что функции в этом контексте не работают в виртуальных машинах, а в контейнерах, где может возникать задержка из-за «холодного старта».

Ключевые практические тезисы:

  1. Функции (FaaS) запускаются при событии (HTTP-запрос, изменение базы данных и т.д.), и работают только при активации — без нагрузки они не потребляют ресурсов.
  2. Время выполнения и объём памяти определяют стоимость в гигабайт-секундах (GB-s), что делает модель ценовой эффективной для редких запросов.
  3. Холодный старт может добавлять задержку от сотен миллисекунд до секунд — критичен для пользовательских API, но не для фоновых задач.
  4. Функции не хранят состояние — требуется внешнее хранилище (например, базы данных или кэширование).
  5. Важно понимать ограничения: длительность выполнения, отсутствие поддержки долгих задач, риск зависимости от провайдера.

Когда пригодится:
— При обработке редких событий (например, обновления файлов или уведомлений).
— При создании API-эндпоинтов с низкой задержкой и минимальным расходом ресурсов.
— Когда не требуется постоянное выполнение кода или управление инфраструктурой.