Какую новую технологию или инструмент вы изучили недавно?

Ответ

Недавно углубился в изучение Spring WebFlux — реактивного стека фреймворка Spring для построения неблокирующих, асинхронных приложений.

Ключевые концепции и преимущества:

  • Неблокирующий I/O: Позволяет обрабатывать больше одновременных соединений с меньшим количеством потоков, что повышает масштабируемость.
  • Реактивные типы: Работа строится вокруг Mono (0 или 1 элемент) и Flux (0..N элементов) из Project Reactor.
  • Backpressure: Механизм, позволяющий потребителю контролировать скорость потока данных от производителя.

Пример простого реактивного REST-контроллера:

@RestController
@RequestMapping("/users")
public class ReactiveUserController {
    private final ReactiveUserRepository userRepository;

    @GetMapping
    public Flux<User> getAllUsers() {
        return userRepository.findAll();
    }

    @GetMapping("/{id}")
    public Mono<User> getUserById(@PathVariable String id) {
        return userRepository.findById(id);
    }
}

Когда использовать: Для высоконагруженных, событийно-ориентированных сервисов с большим количеством одновременных соединений (чаты, стриминг). Сложности: Требует смены парадигмы с императивного на реактивный стиль, усложняет дебаггинг и не все библиотеки имеют реактивные драйверы.

Ответ 18+ 🔞

Ну, вот сидишь ты такой, думаешь: "А не поизучать ли мне что-нибудь модное, реактивное, чтобы все ахнули?" И лезешь в этот ваш Spring WebFlux. А там, блядь, ёперный театр, всё с ног на голову!

Слушай сюда, в чём суть-то, если по-простому. Раньше было как? Пришёл запрос — поток из пула взяли, и он тупо ждёт, пока база или ещё какая штука ответит. Поток-то, сука, дорогой! Их не овердохуища. А тут подходят и говорят: "А давайте не будем ждать, как лохи!". Вот и вся философия.

Что там внутри за плюшки:

  • Неблокирующий I/O: Это когда твой поток не впадает в спячку, пока данные идут по проводам. Он взял запрос, отдал его на обработку какой-нибудь асинхронной штуке, а сам пошёл другие запросы принимать. Получается, одним потоком можно обслуживать хуеву тучу соединений одновременно. Масштабируемость, блядь, зашкаливает!
  • Реактивные типы Mono и Flux: Это, сука, основа основ. Забудь про List и Optional на время. Mono — это как обещание, что тебе может быть прилетит один элемент или пустота. Flux — это уже поток, обещание кучи элементов. Они не данные, они — описания будущих данных! Пока на них не подпишешься (subscribe()), нихуя не произойдёт.
  • Backpressure: А это вообще хитрая жопа! Представь, производитель данных (например, какой-нибудь стрим) пиздит их со скоростью света, а потребитель (твой сервис) не успевает переваривать. Так вот backpressure — это механизм, чтобы потребитель мог сказать: "Охуел, что ли? Притормози, дай перевести дух!". Без этого на высокой нагрузке можно просто взорваться.

Вот смотри, как это выглядит в коде, почти как обычный Spring, только везде эти Flux/Mono:

@RestController
@RequestMapping("/users")
public class ReactiveUserController {
    private final ReactiveUserRepository userRepository; // И репозиторий тоже должен быть реактивный, блядь!

    @GetMapping
    public Flux<User> getAllUsers() {
        return userRepository.findAll(); // Возвращаем не список, а поток!
    }

    @GetMapping("/{id}")
    public Mono<User> getUserById(@PathVariable String id) {
        return userRepository.findById(id); // И тут не Optional, а Mono.
    }
}

Так когда же эту дичь применять? Да когда нагрузка пиздец какая, тысячи соединений одновременно, и всё должно летать — чаты, стриминги, уведомления. Если у тебя простой CRUD на 100 пользователей в день, то не еби себе мозг, честно.

А сложности где? Да везде, блядь! Во-первых, голова сломается, когда будешь перестраиваться с императивного "сделай раз, сделай два" на этот реактивный поток обещаний. Дебаггинг — это отдельный ад, трассировка стека выглядит так, словно её составлял шизофреник. И главное — не всякая библиотека умеет в реактивность. Найдёшь нужный драйвер для базы, а там — хуй! Только блокирующий клиент. И всё, пиши пропало, вся архитектура к ебеням.

Короче, инструмент мощный, но если не понимаешь, зачем он — лучше не лезь, а то сам от себя охуеешь.