Skip to content

Backend Development Stack

Anton Lamtev edited this page Mar 10, 2020 · 6 revisions

Выбор стэка технологий для backend на Java

Что нужно

Обязательно

  1. HTTP сервер (обработка клиентских запросов)
  2. HTTP клиент (запросы к сторонним сервисам, например, к Github)
  3. База данных
  4. Драйвер для базы данных
  5. Формат данных для взаимодействия с клиентом
  6. Сериализация/десериализация
  7. Система сборки проекта и управления зависимостями

Опционально

  1. Dependency Injection
  2. ORM (если выберем реляционную модель данных)

Требования

  1. Актуальность (использование в "кровавом" энтерпрайзе)
  2. Отсутствие многословности (минимум boilerplate кода)
  3. Способность эффективно утилизировать железо
  4. Простота использования
  5. Наличие опыта работы хотя бы у части участников (желательно)
  6. Open-source + лицензия, позволяющая свободно использовать в рамках некоммерческого проекта

Кандидаты

HTTP

  1. Spring Boot over servlet container (classic)
    • Классика: RestController'ы, thread and connection per request model. Потоки большую часть времени спят
    • просто, проверено временем
    • из коробки есть многое: DI, FasterXML Serialization/Deserialization
    • Spring Data
    • скучно
    • не очень модно в эпоху неблокирующих технологий
  2. Spring Boot Webflux
    • Functional endpoints
    • Reactor Netty
    • Все плюсы предыдущего варианта
    • Реактивно
    • Non-blocking
    • Минимум 2 участника проекта работали с этим
    • Использует Reactor - популярную и удобную реализацию Reactive Streams
    • Spring Data поддерживает R2DBC
    • декларативно
    • возможно сложновато?
  3. Vert.x
    • Интересная идея
    • Non-blocking
    • Есть реактивный драйвер для SQL
    • Колбэки
    • Абсолютно новая технология для всех участников команды
    • Классно сочетается с Kotlin coroutines. Но опыта работы с колтином почти нет
    • Kotlin далеко не стандарт в энтерпрайзе
  4. Play framework with Akka Streams
    • Очень круто
    • Тоже куча интеграций с БД
    • На Java очень многословно и неудобно
    • Scala на приличном уровне владеет лишь 1 разработчик
    • Сложно!
  5. One-nio
    • Очень быстро
    • Есть сериализация
    • Слишком низкоуровниево для нашего проекта. Придется много вещей делать самим
  6. Netty
    • По сути то же, что и one-nio
  7. Reactor-Netty
    • Добавлен Reactor, что облегчает вручную связать с R2DBC
    • Все равно многое придется делать самим

БД

Предварительно, будет что-то реляционное, потому что кажется, что предметная область вполне ложится на реляционную модель.

  1. PostgreSQL
    • Почти все участники работали с ним
    • Активно используется в индустрии
    • Любые драйверы существуют
  2. MySQL
    • По функциональности +- то же самое

Драйвер

  1. JDBC (classic)
    • Проверено временем
    • скучно
    • blocking
  2. ADBA
    • Уже не в моде
  3. R2DBC
    • Reactive Streams
    • Non-blocking
    • r2dbc-pool
    • уже stable
    • поддержано Spring Data
  4. Vert.x Reactive
    • Хорошо с Vert.x
    • Пока preview
  5. Vert.x JDBC
    • Stable
    • JDBC =(

Формат данных

  1. JSON
    • Наверное остановимся на этом. Повсеместно используется. На фронте вообще стандарт
  2. XML
  3. Protobuf

Сериализация/Десериализация

  1. FasterXML Jackson
    • По бэнчмаркам для JSON -- очень быстро
    • Spring default
  2. GSON
    • Медленнее
  3. Protobuf
    • Излишне для нас
  4. HTTP framework preinstalled solution
    • в one-nio своя быстрая реализация. Но пока нет причин так глубоко закапываться

Система сборки проекта и управления зависимостями

  1. Maven
    • декларативно
    • некогда стандарт де факто
    • длинющий xml
  2. Ant + Ivy
    • прошлый век
  3. Gradle
    • декларативно + императивно
    • kotlin / groovy
    • удобно
    • становится все более популярным

Summary

Надо выбирать

  • Java 14 (выходит уже в марте)
  • Spring Boot Webflux over Reactor-Netty
    • Functional endpoints
  • Lombok
  • R2DBC
    • Spring Data
    • pool
  • PostgreSQL
  • JSON
  • FasterXML Jackson
  • Gradle

Потому что это актуально, производительно, идеально сочетается друг с другом, декларативно, немногословно, есть опыт работы с этим. Соответствует всем предъявляемым требованиям.

Ближайший конкурент - традиционный Spring Boot, но это слишком скучно и уже не модно.

Vert.x - интересный вариант, но с ним никто из команды не работал. Плюс некоторые современные фичи еще пока на стадии preview.

Clone this wiki locally