Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Modern java for decade-old problems

Modern java for decade-old problems

Mateusz Gajewski

June 25, 2023
Tweet

More Decks by Mateusz Gajewski

Other Decks in Programming

Transcript

  1. Modern Java for decade-old problems co ma do zaoferowania Java

    w 10 letnim projekcie open-source Mateusz Gajewski 🤍 Confitura 2023
  2. Co ja tu robię • Z programowaniem jestem związany całe

    życie, • Wcześniej: • mniejsze firmy, • startup, który stał się korpo ;-), • startupy, • konsulting, • Aktualnie: • Staff Software Engineer w Starburst Data, • @wendigo na Twitterze i Githubie 2
  3. Agenda • Open-source Trino: • Dlaczego akurat Java? • Jakie

    problemy chcemy nią rozwiązać? • 10 lat rozwoju języka i platformy: • Rozwój za czasów Oracle, • Jak ugryźć migrację, • Jakie problemy adresują nowe wydania, • Czy Java ma jeszcze przyszłość? 3
  4. 4

  5. Trino (dawniej PrestoSQL) 5 Skalowalny i wydajny silnik zapytań (MPP)

    Federacja dostępu do danych (Data Mesh, Data Virtualization) Deployment na dowolnej infrastrukturze (cloud, on premise) Uniwersalność zastosowań (ETL, ad-hoc, batch) Aktywne i różnorodne community Otwarty i darmowy kod źródłowy (Apache License 2.0)
  6. Filozofia rozwoju projektu • Pisanie czytelnego kodu, który jest: •

    poprawny obliczeniowo, • bezpieczny i wydajny, • skaluje się na najnowszym hardwarze, • rozwiązuje realne problemy, • Produkt który, łatwo się wdraża: • na różne architektury sprzętowe i systemy, • poprzez brak natywnych zależności, • samowystarczalne artefakty 6 https://trino.io/development/vision.html
  7. 2013: Dlaczego Java a nie np. C++? • Balans: produktywność

    vs wydajność wykonania, • Skalowalność i multiplatformowość, • Ekosystem bibliotek, narzędzi i specjalistów, • Dostęp niskopoziomowy do zasobów, • Kompatybilność wsteczna, • Automatyczne zarządzanie pamięcią, • 10 lat temu nie było większego wyboru ;-) 7
  8. Oracle przejmuje Javę (~2010) Java Enhancement Proposals (https://openjdk.org/jeps/1): 
 •

    Incubator (https://openjdk.org/jeps/11): • Całe moduły zawierające niesfinalizowane API i narzędzia, • Mogą, ale nie muszą być w całości usunięte/zmienione w przyszłości, 
 • Preview (https://openjdk.org/jeps/12): • W pełni wyspecyfikowana, zaimplementowana funkcjonalność języka lub JVMa, • Może stać się finalna i publiczna w przyszłości. 9
  9. Nowy cykl wydawniczy STS (short-term support) co 6 mc-y (10

    wydań w dekadzie) LTS (long-term support) co 2 lata (4 wydania w dekadzie) 10
  10. Dlaczego tylko LTS ma sens? • Wydanie STS ma wsparcie:

    • 6 miesięcy na wydanie, 6 miesięcy na krytyczne błędy bezpieczeństwa, • Wydanie LTS ma wsparcie: • 5 lat na wydanie, 8 lat na krytyczne błędy bezpieczeństwa, • Duże przedsiębiorstwa korzystają tylko z LTSów, • Z doświadczenia: • większa stabilność, • mniejsza liczba regresji (dłuższy okres integracji i testowania) 11
  11. Wielka czwórka projektów 1. Panama (2014): “Uproszczenie interakcji pomiędzy Javą

    a zewnętrznymi (nie-javowymi) API, np. kodem natywnym napisanym w C, C++ itp” 2. Valhalla (2014): “Rozszerzenie modelu obiektowego Javy o obiekty wartościowe (value objects) i typy prymitywne zdefiniowane przez użytkownika, łącząc ze sobą abstrakcje programowania obiektowego z wydajnością charakterystyczną dla typów prymitywnych” 3. Amber (2016): “Odkrycie i wprowadzenie małych, zorientowanych na poprawnie produktywność funkcjonalności języka Java” 4. Loom (2018): “Drastyczne zredukowanie kosztu wytworzenia, utrzymania i monitorowania współbieżnych aplikacji o dużej przepustowości, wykorzystujących w pełni potencjał dostępnych platform sprzętowych” 12
  12. 13

  13. Złożoność projektu Trino (2023) • ~100 modułów w Mavenie, •

    ~800 zależności projektowych, • ~21K pom LOXML ;-) • ~1.5M Java LOC, • ~ 5K commitów, 1K PR, 40 releaseów / rok, 2m40s fast build na M1 Max* * kiedy ściągneliśmy już połowę MavenCentral i wyłączyliśmy wszystkie checki ;) 15
  14. Java target • Runtime target: • Kod skompliowany starszą wersją,

    uruchamia się na nowej, • Możemy testować kompatybilność w przód, • Możemy nadal wspierać wcześniejsze wersje, • Compile target (trudniejsze): • Kod skompilowany nowszą wersją i na niej uruchamiany, • Nowy class format, • Pozwala wykorzystać nowe możliwości języką i API (language level), • Nie ma drogi powrotu :( 16
  15. Najczęstsze problemy • Usunięte lub zmienione funkcjonalności: deprecated/experimental/preview, • Niekompatybilne

    wersje bibliotek: • Nowy class format (ASM, ByteBuddy), • Niedozwolona/nieprawidłowa refleksja (od JDK 16), • Grzebanie w internalach Javy 😑 (Unsafe, ByteBuffer, compiler API itp), • Brak wsparcia dla nowych elementów języka (np. Record class), • Niekompatybilny tooling: • pluginy Maven’a, • infrastruktura testowa (obrazy Docker-owe, Github Actions, Jenkins itp), • wsparcie IDE ;-) 17
  16. Historia LTSów w Trino 18 Nowy compile target & language

    level: • Java 8 - 02.2014 (+6 mc za wydaniem) • Java 11 - 02.2020 (+18 mc za wydaniem) • Java 17 - 11.2021 (+3 mc za wydaniem) • Java 21 - 12.2023 (+3 mc za wydaniem)
  17. Najnudniejszy LTS ever? • prywatne metody w interfejsach, • Process

    API, • słowo kluczowe var (local type inference), • metody fabryczne dla niemutowalnych kolekcji i ich kopiowania, • nowa implementacja klienta HTTP, • jshell 20
  18. Najnudniejszy LTS ever? Pod maską natomiast wielkie porządki: • Konsolidacja

    kodu Javy w jednym repo (296) + nowy build system, • JPMS (200), • Java dla Linux/AArch64 (237, 315) • Wydzielenie API podsystemu GC, Epsilon, ZGC, • Unicode 10, • Zintegrowanie Java Flight Recordera (JFR) (328) • Java-based JIT compiler, • Zunifikowane logowanie w JVMie. 21
  19. 22 TL;DR: Java 11 przygotowała grunt pod innowacje w Javie

    Werdykt: porządne wydanie, ale nie rozwiązało zbyt wiele z naszych problemów
  20. Trudności w migracji do 17 • Dostęp refleksyjny domyślnie zablokowany

    (w JDK 16), • Problem ze starymi bibliotekami: • zmiany w zakresie security: • SecurityManager (deprecated), • Kerberos, • wycofane algorytmy, • Niekompatybilne pluginy Mavena, • Kilka niespodzianek: • zmiana InetSocketAddress::toString (JDK-8225499), • wycofany -XX:+UseBiasedLocking, • strictfp domyślnie, 31
  21. Loom: Virtual threads
 (GA) 34 • Executors.newVirtualThreadPerTaskExecutor() + Thread.ofVirtual().start() •

    Mają sens dla kodu I/O-intensive: • kod musi być Loom-friendly by współpracować ze schedulerem, • synchronized method & synchronized (object) nie są kooperatywne, • można rozwiązać za pomocą ReentrantLock-ów, • ExecutorService implements AutoCloseable, • Brak obsługi priorytetów, thready są zawsze daemon, • Kosztowna obsługa ThreadLocal-i, • -Djdk.tracePinnedThreads=full/short na ratunek
  22. Panama: Foreign Function API
 (3rd preview) 36 ./bin/jextract -- source

    -- output target -l libsnappy -I/opt/homebrew/include \ 
 -I/Library/Developer/CommandLineTools/Library\ SDKs/MacOSX.sdk/usr/include /opt/homebrew/include/snappy-c.h
  23. Więcej dobroci w JDK 21 38 • JEP 440: Record

    patterns, • JEP 441: Pattern matching for switch, • JEP 430: String templates (preview), • JEP 445: Unnamed classed and instance main methods (preview), • JEP 439: Generational ZGC, • JEP 431: Sequenced Collections.
  24. Trudności w migracji do 21 (dotąd) • Wiele niekompatybilnych pluginów

    mavena: • nowy class format (ASM), • zmianami w internalach compiler API, • Kilka niespodzianek: • Zmiana konstruktora DirectByteBuffera: JDK-8299684, • Zmiana reprezentacji Double i Float.toString: JDK-4511638 39
  25. 40 TL;DR: Java 21 to najlepsze wydanie Werdykt: największe wydanie

    rozwiązujące wiele z podstawowych problemów systemów rozproszonych, migracja z 17 bez większych problemów.
  26. 42

  27. Na co jeszcze czekamy? • Loom (projects/loom) - sfinalizowanie incubator

    & preview features: • JEP 453 - Structured concurrency, • JEP 429 - Scoped values, • Valhalla (projects/valhalla): • JEP 401 - Value & primitive objects, • JEP 218 - generics over primitive types & universal generics (draft), • Panama (projects/panama): • Sfinalizowanie Vector API, wsparcie dla obliczeń na GPU, rozwiązanie problemu GCLockera 🙏 • Amber (projects/amber): • Statements before super() • Leyden (projects/leyden): • Pewnie o nim nie słyszeliście ;-)? 43