Java Digest # 13: Null-types in Java, AWS Deprecates, Kafka 3.8

🙋 Алоха, друзі!

Перший тиждень серпня був особливо гарячим на фондовому ринку, де доволі сильно обвалило технологічний сектор.

Ось CEO Intel вирішив, що молитва в такій ситуації — найкраще, що він може зробити.

Але ми якось пропетляємо, вйо до новин!

Попередній дайджест можна прочитати тут.

Але пам’ятайте, що це стало можливим винятково завдяки ЗСУ, і читати ви його зараз можете теж завдяки їм.

Тому швидесенько перед прочитанням пішли міняти долари та кидати гривні на допомогу нашим Захисникам.

JDK Enhancement Proposals (JEP) часто згадуються в нашому дайджесті, і в цьому випуску ми хотіли б поділитися відео від Nicolai Parlog, де він детально розповідає, чим вони є, як їх правильно читати та що може з ними відбуватися на різних етапах.

Також Nicolai випустив відео про таку важливу властивість Java-платформи, як цілісність, яка все ще залишається мало висвітленою. У відео він пояснює, що розуміється під поняттям «цілісність» в екосистемі Java, основні операції, які порушують цілісність, та розглядає пропозиції, як планується досягти цілісності за замовчуванням.

Alan Bateman провів доповідь, де розповів про одну зі змін Project Loom, над якою вони зараз працюють — Structured Concurrency. У відео він детально розповідає про поточний стан проєкту та їхні цілі.

У своїй статті Thomas Schatzl розглядає зміни збирачів сміття G1, Parallel та Serial, які слід очікувати в Java 23. Ознайомитися з ними можна за цим посиланням.

Рекомендуємо ознайомитися з новим блогом від інженерів Netflix, в якому вони діляться своїм досвідом роботи з віртуальними потоками. У ньому вони описують свій шлях розслідування проблем, пов’язаних з періодичними тайм-аутами та зависанням серверів після, з якими вони стикнулися.

Команда Project Leyden подала свій перший JEP, який стосується попереднього завантаження та зв’язування класів (Ahead-of-Time Class Loading & Linking). Основна мета цього JEP — покращити час запуску застосунків.

Також з’явився новий драфт JEP, який пропонує додати підтримку null маркерів для типів Java, щоб дозволити відхиляти або свідомо допускати null значення. Поділіться в коментарях, що ви думаєте з цього приводу.

Chris Newland випустив нову статтю, в якій розповідає про новий параметр VM, який слід очікувати в OpenJDK 24, а саме PrintMemoryMapAtExit. Цей параметр допоможе в ситуаціях, коли отримання інформації про розмітку памʼяті за допомогою інструментів, таких як jcmd System.map, неможливо через завершення процесу до того, як ці інструменти можуть бути використані.

Muaath Bin Ali написав статтю про важливість ефективного логування та надав 14 рекомендацій щодо ефективного використання SLF4J та Logback.

У своїй статті Lee Sheinberg розповідає про 9 найкращих Java профайлерів, які її команда знайшла.

Spring Framework 6.2 отримав одразу дві версії Spring Framework 6.2.0-M5 та Spring Framework 6.2.0-M6. Детальніше про зміни можна прочитати за цими посиланнями: М5 та М6. З цікавого хотілося б відзначити такі зміни:

  • Значно покращено підтримку AOT завдяки двом новим анотаціям: @RegisterReflection та @ReflectionScan.
  • Інтеграцію з Jetty було перероблено, у ній позбулися сервлетних абстракцій. Тепер вона побудована безпосередньо на Jetty API.
  • З’явилася попередня підтримка рендерингу HTML-сторінок за допомогою кількох фрагментів, що відрізняється від стандартного підходу Spring MVC.
  • Представлено новий SmartHttpMessageConverter, головною метою якого є вирішення деяких обмежень GenericHttpMessageConverter.

Spring Boot 3.4.0-M1 містить 118 покращень, поліпшення документації, оновлення залежностей та виправлення помилок. З цікавого можна виділити таке:

  • Представлено підтримку структурованого логування. У цій версії додано вбудовану підтримку форматів Elastic Common Schema та Logstash.
  • Додано низку нових параметрів для покращення моніторингу.
  • Зʼявилася підтримка AssertJ для MockMvc з автоматичною конфігурацією MockMvcTester.
  • Розширена підтримка Docker Compose. Нові параметри spring.docker.compose.start.arguments та spring.docker.compose.stop.arguments дозволяють задавати додаткові аргументи командного рядка, які передаються Docker Compose під час запуску та зупинки сервісів.

Spring for Apache Kafka 3.3.0-M1 вносить низку нових змін, з якими можна ознайомитися за посиланням. Основні нововведення цього релізу:

  • Покращені операції пошуку для груп споживачів.
  • Зʼявився новий тип подій ConcurrentContainerStoppedEvent.
  • RecordFilterStrategy тепер підтримує ігнорування порожніх пакетів, що виникають внаслідок фільтрації.

Були випущені одразу декілька версій Spring Modulith 1.3 M1, 1.2.2, та 1.1.7. Основним нововведенням Spring Modulith 1.3 M1 є поява можливості використання @ApplicationModuleTest поза межами папки модуля.

Нові версії Spring HATEOAS 2.2.3 та 2.3.1 містять покращений парсер для виразів заголовків Link за стандартом RFC-8288, а також звичайні оновлення залежностей.

Основною зміною у Spring AMQP 3.2.0-M1 є поява підтримки конфігурації Consistent Hash Exchange. Детальніше про цю та інші зміни можна дізнатися за посиланням.

Реліз Spring Cloud Data Flow 2.11.4, перш за все, спрямований на вирішення таких вразливостей:

  • CVE-2024-37084 — ця вразливість дозволяє зловмиснику, який має доступ до Skipper Server API, використовувати спеціально створений запит на завантаження для запису довільного файлу в будь-яке місце файлової системи, що може призвести до компрометації сервера.
  • PRISMA-2023-0067 — ця вразливість дозволяє зловмиснику надіслати спеціально створений запит, щоб скористатися неправильною валідацією вхідних даних класом StreamReadContraints, що призводить до відмови в обслуговуванні.

З детальним списком змін Spring Integration 6.4.0-M1 можна ознайомитися за посиланням. До найбільш помітних належать:

  • Розподілені реалізації LockRegistry тепер можуть викидати ConcurrentModificationException під час операції unlock().
  • ZeroMqMessageHandler тепер також може прив’язувати порт.
  • Ідентифікатор підписки покращено для адаптерів каналу MQTT v5.
  • ClientSession тепер закривається через SftpSession.

Також варто відзначити релізи, які були більше зосереджені на виправленні помилок, оновленні залежностей та покращенні документації:

Josh Long не перестає тішити нас новими відео із серії Spring Tips. У першому відео він розповідає про використання проксі на базі JDK та CGLIB у Spring та пояснює їхнє застосування.

У другому відео він розповідає про Annotation Processors, а також демонструє кілька корисних прикладів з використанням MapStruct, Manifold та інших.

В останньому відео Josh Long запросив Rob Winch, керівника Spring Security, і разом вони провели майстер-клас зі Spring Security.

На завершення секції про Spring пропонуємо ознайомитися з кількома статтями.

Maciej Walkowiak написав статтю, в якій розповідає, як за допомогою плагіна OpenAPI Generator для Gradle можна генерувати HTTP-клієнти для Spring Boot застосунків.

Наприкінці липня Ollama анонсували нову функцію, яка дозволяє моделям відповідати на задані запити за допомогою сторонніх інструментів. Це робить можливим виконання моделями складніших завдань та взаємодію із зовнішнім світом. Своєю чергою, Christian Tzolov уже випустив статтю, в якій розповідає про те, як використовувати цю нову можливість у поєднанні зі Spring AI.

Christian Tzolov також випустив ще одну статтю, в якій розповів про додавання підтримки Groq в Spring AI та показав приклад використання.

AWS

  • AWS раптово починає процес припинення підтримки деяких сервісів — QLDB (Ledger Database), CodeCommit, Forecast, CloudSearch, S3 Select, SimpleDB та інших. Поки що обмежується створення нових ресурсів, наприклад нового git repository на CodeCommit, але про QLDB вже відомо що сервіс повністю перестане працювати через один рік і дані потрібно якось кудись мігрувати. На жаль і на диво, AWS робить це без офіційного оголошення, натомість користувачів сервісів повідомляють листами або вони просто отримують помилку при створенні нового ресурсу і йдуть розбиратись чому. На AWS Blogs з’явилися декілька блогів про міграцію з вищезгаданих AWS сервісів на аналоги, хоча без інформації про те, що ці сервіси будуть припиняти роботу, блоги виглядають як прості технічні статті й не привертають жодної уваги. Оскільки інформацію доводиться збирати крупинками, то список сервісів може рости.
  • Стали доступні нові версії Coretto для JDK 22, 21, 17, 11 і 8.
  • Lambda SnapStart тепер підтримує Java функції для ARM64.
  • AWS SDK for Java 1.x переходить в maintenance mode в кінця липня і не буде підтримувати ніякий новий функціонал, AWS рекомендує користувачам переходити на версію 2.х.

Azure

  • Серія відео від Azure (1, 2, 3) демонструє міграцію монолітної аплікації на Spring Boot в Azure керуючись Reliable Web App Pattern for Java і його reference implementation. Для цього використовуються такі сервіси, як-от WAF, load balancer, Entra, App Services, Azure DB for PostgreSQL, Azure Cache for Redis для Cache Aside патерну, Key Vault та інші. Окрім хмарних сервісів у відео також звертається увага на dev container, immutable infrastructure та circuit breaker за допомогою resilience4j (в якого, між іншим, зверху GitHub сторінки висить банер про війну росії проти України).
  • Вийшла нова версія Microsoft’s Semantic Kernel for Java 1.2.0 де, серед іншого, є інтеграції з Gemini, OpenTelemetry і Presidio, а також експериментальними інтеграціями з Hugging Face, Redis Vector Store та Azure AI Search. Якщо вам цікаво, як розвивається цей проєкт, то на GitHub можна подивитися sprint board проєкту.
  • Підсумок оновлень Azure SDKs за липень доступний за посиланням.

  • З’явилася Beta версія Hibernate Validator 9.0.0.
  • Нова версія Hibernate 7.0.0.Beta1 вже доступна до використання.
  • Debezium отримав версію 3.0.0.Alpha2.
  • Vert.x 4.5.9 вже доступний.
  • Langchain4j в липні отримав аж два оновлення — 0.32.0 і 0.33.0.
  • Kafka 3.8 вже доступна і має в собі серед іншого різні стабілізаційні зміни, можливість налаштувати рівень компресії gzip/lz4/zstd для продюсерів і брокерів, а ще експериментальні native image і новий Consumer Rebalance Protocol. Нагадаємо, Zookeeper планують видаляти в 4.0.
  • В новій Kafka також є і декілька оновлень для JBOD (just a bunch of disks) — тобто об’єднання декількох різних сховищ даних в одне логічне сховище. Для KRaft моду JBOD вийшов з early access, а для Tiered Storage додали early access підтримку JBOD. Водночас на AWS з’явилася нова стаття про підтримку Tiered Storage для AWS MSK. Tiered Storage дозволяє визначити remote директорії для зберігання логів в додачу до стандартного local, що дозволяє масштабувати storage незалежно від cpu, швидше виконувати resize і broker recovery шляхом зменшення кількості даних які потрібно переміщати в цих операціях.
  • Команда Notion розказує про те, як вони зберігають сотні терабайт даних в Postgresql і Snowflake, на які ліміти вони наштовхнулись і як вони будують свій Data Lake з Debezium, Kafka, Hudi, Spark i AWS S3.
  • Командна Netflix зіштовхнулась з проблемою з нотифікаціями для юзерів через те, що на багатьох платформах, де є Netflix, є свої approval процеси для аплікацій. Як цю проблему вирішували, можна почитати на Infoq.
  • На AWS Blogs виклали статтю про те, як можна створювати uuid v7 в Postgresql за допомогою розширення pg_tle (Trusted Language Extensions for PostgreSQL) на PL/Rust, що дозволяє писати native розширення для бази даних на Rust.
  • AWS Secrets Manager тепер доступний як Agent, що дозволяє аплікації отримувати секретні дані від local HTTP, замість того, щоб звернутися до AWS сервісу.
  • Нова стаття на docker blogs розказує про те, як за допомогою Testcontainers можна інтегрувати Java кодом Hugging Face моделі в GGUF форматі з Ollama.
  • Google URL Shortener перестане працювати в серпні 2025, а до того часу буде показувати попередження під час переходу за посиланням з інформацією про те, що це посилання перестане працювати в майбутньому.
  • Розмова про Vector на foojay.io, де серед іншого говорять про те, як векторизувати датасет Wikipedia розміром у 180GB з 40GB java heap, і трохи думок про Project Panama, Foreign Function & Memory API в Java 22, vector API в Java 23 (вже у восьмому інкубаторі), simd hardware та ін.
  • Розмова про Java в Embedded або у сферах максимально близьких до Hardware, (знову на foojay.io), virtual threads, Spring 3 і Native та ін.
  • Як виглядає Grafana dashboard для моніторингу космічного апарату що якраз ось приземляється на Місяць? Grafana виклали статтю на цю тему, а саме: про те, як Grafana використовувалася в посадці SLIM (Smart Lander for Investigating Moon) на початку 2024 року. Ця стаття є супутником цього відео декількамісячної давності.

Здавалось би, що дно пробито, та знизу постукали.

The Telegraph: британські інженери атомних підводних човнів використовують програмне забезпечення, розроблене в росії та білорусі.

За даними видання, програмне забезпечення мали створити співробітники з Великої Британії, які мають допуск до державної таємниці, але роботу частково передали на аутсорсинг розробникам із сибіру та мінська.

Наразі існують побоювання, що код, який створили російські та білоруські розробники, може бути використаний для розкриття місцеперебування британських підводних човнів.

The Telegraph пише, що компанія, яка залучила до роботи фахівців із рф та білорусі, намагалася це приховати. Наприклад, один зі співробітників пропонував замість справжніх імен білоруських розробників використовувати імена загиблих людей з Великої Британії.

Британське Міноборони розглядає порушення безпеки як серйозну загрозу обороні Великої Британії, тож наразі розпочато розслідування.

Друзі, нам важлива ваша думка! Поділіться в коментарях ідеями, як нам варто покращувати цей дайджест та які новини в ньому вам цікаво читати?

Над дайджестом працювала команда Avenga:

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

👍ПодобаєтьсяСподобалось13
До обраногоВ обраному1
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

стосовно нуллабл типів імхо ! та ? виглядають жахливо а читаються ще гірше.

Краще вже кейворд якийсь.

Жахливо. Але щось робити з nullable треба. Краще пізно, ніж ніколи.

щось робити з nullable треба

От із цим я не дуже погоджуюсь. Я не бачу ні проблем з НПЕ ні з нулами. Це завжди криві руки і вади дизайну, відсутність контрактів у коді і т.д. чи просто тупо баги.

Пропонована нулсейфті це псевдо-нулсейфті, костиль, як вирізані поворотники в бмв. Треба їздить як людина, а не буть їбаньком. Так із кодом. Якщо ти рукожоп, то тобі заважають нуллабл та НПЕ.

це в тебе не достатньо опиту роботи за нулами. Як тільки більш-менш здорова структура данних попадае то там зразу видно як опшинали йй гарно розкладають на частини і як без них задовбешся провіряти чи внутрінні данні вже нуль чи ше трохи ні

це в тебе не достатньо опиту

Ах лол, ну да, недостаньо в мене «опиту» так. Пішитє нам ісчо. А ще раджу навчитись мислю формувать трохи більш не так рагульно.

А опшнали то хороша річ.

Імхо тут найбільш цікаве про дедлок на віртуальних тредах нетфлікса.

По ідеї він фікситься відмовою від synchronized блока на користь ReentrantLock.

якщо є механізм — він має працювати для всіх, ми ж не в js. Думаю в найближчих релізах jdk слід чекати фікс

synchronized + Virtual Threads (VTs) — відома проблема, зокрема це описано в доках, наприклад, docs.oracle.com/...​6D-4857-85B9-E5A27A875AF9. І представники Oracle не раз говорили на конференціях що вони «працюють над цим».
Проблема в тому що більшість відомих бібліотек чи навіть компонентів JDK «не встигають» за «прогресом» і використовують synchronized блок, який може бути «дуже глибоко заритий».
На що конкретно натикались ми при спробі перейти на Spring Boot 3.2.x + VTs — javax.security.auth.Subject де всюди використовуються Collections.synchronizedSet() і що на практиці (перф-тести) нівелює перехід на VTs.

Ще одна статья про JSpecify та nullability www.infoq.com/...​/08/null-restricted-java

Про nullability нещодавно обговорювали на реддіті цю статтю про JSpecify 1.0 www.infoq.com/...​specify-java-nullability

Я висловив думку що adoption буде схожий на підтримку JPMS модулів, не швидким, бо треба буде додати nullness інформацію по перше до стандартної бібліотеки і до більшості популярних бібліотек.

Полегшувати ситуацію буде те, що планується не два, а три типи: null, notnull та unspecified. Unspecified буде щось типу any в Typescript, сумісним як з null так і з notnull.

JSpecify підтримує те ж саме вже зараз на рівні специфікації, проблема тільки в валідаторах, що підтримують цю специфікацію.

В реддіті порадили NullAway, плагін до Error Prone, гуглового annotation processor, що виконує статичну валідацію коду.

Сам ще не дивився на нього.

Дякуємо! Бачили і реддіт і статтю на infoQ — але вже не встигали її в поточний дайджест додати і запланували згадати ї їв наступному

дякую, цікаво та корисно

Підписатись на коментарі