Эта неделя в мире Java (13 ноября)
Записи будут выкладываться по мере того, как их разрешают выкладывать организаторы, а я их успеваю редачить и заливать на YouTube.
Java Digest #6 / @evertimes x TINKOFF. Отличный дайджест со ссылками на видео и статьи. Вообще никак не пересекается с этим.
Присматриваемся к Kafka tiered storage / @mikeGolovanov. Эпохального размера гайд. В нем подробно рассказывается, что такое tiered storage и зачем это Кафке (в том числе то, что она не является полнофункциональной). Показана архитектура и основные компоненты. Дальше следует пример, в котором разворачивается однонодовая Кафка, поднимается Remote Storage Manager для работы с локальной файловой системой, и настраивается миллиард файлов конфигурации. Дальше создаем топик, тыкаем в него палочкой и осторожно наблюдаем работу tiered storage. Судя по «итогам», это была только присказка, а сказка будет впереди, в следующем мега гайде.
Инициализация WebSocket-клиента в автотестах на Java cо Spring Boot Starter WebSocket / @valeryvasilyev. Автор рассказывает свой опыт прикручивания библиотеки Spring Boot Starter Websocket к проекту автотестов на Java.
Введение в Apache Flink: осваиваем фреймворк на реальных примерах / @appp_master x МТС. Это начало цикла статей от Александра Бобрякова — техлида в команде МТС Аналитики, которая занимается Real-Time обработкой данных. Подробно рассказывается архитектура Flink, основы high availability и чекпоинтинга, совместимость состояний. Это может быть полезно любому Spring-разработчику, а для Flink-джунов естьпримеры стандартных ошибок и пути их решения.
Решение задач Yandex Cup 2023 на Java, часть 1 и часть 2 @AndanteMQQ. В первой части статьи была обширная дискуссия. Вторая статья оказалась просто заминусованной. Возможно, потому, что решение в ней оказалось неправильным. Но это по данным единственного комментария. Можно заглянуть внутрь и восстановить справедливость.
Helidon 4 вышел, а никто и не заметил / @olegchir/javawatch x AxiomJDK. Вышел самый быстрый на свете Java-фреймворк, который может составить конкуренцию Spring Boot, а никто и не заметил. А между прочим, его не последние люди делали, годами. Нужно исправлять эту ситуацию и рассказывать про Helidon больше. Эта статья построена на офциальном анонсе и исследовании перформанса от Мити Александрова.
Гайд по авторизации в Micronaut / @jz36 x X5Tech. Это продолжение предыдущей статьи про процесс аутентификации в Micronaut. Аутентификация без авторизации мертва, и в этом гайде нам рассказывают, что же делать. Коротко, по делу, с примерами. Бери и делай.
Пишем минимальный ActivityPub-сервер с нуля / @grishkaa. Что вообще такое ActivityPub, что должен уметь сервер для участия в федивёрсе, и как всё это реализовать (море JSON-ов и ссылок на дополнительное чтение и готовые проекты).
Цикл постов про Keycloak. Часть вторая: Контроль доступа на уровне приложения / @MGalaktionov. Супер короткое продолжение первой части. Заканчивается всё шок-контентом: видосом и плачущими кошаками и заметкой, что в конечном итоге было принято решение оставить ABAC на стороне приложения, а Keycloak использовать только для Identity пользователей.
Ускоряем запуск Spring Boot-приложений в контейнере / @MaxRokatansky x OTUS. Это рассказ про то, как вместе с Java и Spring Boot использовать технологию Linux Checkpoint/Restore in Userspace (CRIU), позволяющую во время выполнения делать снапшоты состояния процесса. Кстати, у нас в Axiom JDK тоже есть реализация CRaC (Coordinated Restore at Checkpoint), но мы пока не делали громких анонсов. Когда-нибудь напишу про это отдельно.
Предыдущий дайджест за 3 ноября. Как видите, я уложился в неделю! Учусь вести себя дисциплинированно и писать каждую неделю, но это очень, очень, очень сложно. Ради написания этого поста (и нескольких других вперед на неделю) я пропустил первый день конференции PiterPy… и кажется, это того стоило.
[panama] JEP 460: Vector API (Seventh Incubator): перешел в статус targeted для JDK 22. Раньше MemorySegments работали только поверх массива байтов, теперь — поверх массива любого примитивного типа. То есть, они до-реализовывают те функции, которые были временно убраны на предыдущей итерации.
[abmer] Новый кандидат JEP: 463: Implicit Classes and Instance Main Methods (Second Preview).
void main() {
System.out.println("Hello, World!");
}
Изменения:
Решили отказаться от хитрой инструментации кода, и сказать на уровне языка, что файл без определения класса внутри него является объявлением неявного класса. Имя такого класса выбирается системой (компилятором/рантаймом).
В предыдущей версии пропозала, предлагалось выбирать правильный main-метод сложным способом. Новый алгоритм проще: если есть метод
main
с аргументом типаString[]
, то вызывается он. Иначе вызываетсяmain
без аргументов. Это позволяет решить неоднозначности: класс не может одновременно иметь статический метод и метод экземпляра с одним и тем же именем и набором аргументов.
Ссылка на JEP.
Обсуждение
[abmer] JEP 459: String Templates (Second Preview): перешел в статус proposed to target для JDK 22.
[abmer] Ответ Гёца, почему в String Templates используются обратные слеши (\{...}
) вместо нормальных ${...}
. Вкратце, им так проще: в джаве уже есть механизм эскейпинга через \
, и зачем придумывать еще один? Тем более, что в Swift этот прием сработал.
[abmer] Интересный случай боксинга switch + null:
Byte y = null;
try {
switch (y) {
case byte x: System.out.println("converted");
default: System.out.println("not converted");
}
} catch (NullPointerException ex) {
System.out.println("Threw exception");
}
Здесь вылетит ошибка «threw exception», а почему — отвечает Гёц.
[loom] Обсуждение производительности поллера. Poller используется только для поллинга событий и парковки-распарковки виртуальных тредов. Но чтение и запись в буфер делаются через сами виртуальные треды, которые могут выполняться любым платформенным тредом. Возникает вопрос, не просаживает ли это преформанс, потому что теряется локальность данных. Нельзя ли делать все сетевые операции внутри платформенного треда, а в виртуальных тредах выполнять только пользовательский код (когда все данные для него уже готовы).
[leyden] Пулл-риквест прототипа AOT API для CDS.