Загрузка

DevLog

Заметки о веб-разработке, архитектуре, оптимизации и инструментах. Пишу о том с чем сталкиваюсь в реальных проектах.

67

статей

11

категорий

616

минут на чтение

Категории Все Битрикс24 (8) C++ (12) Joomla (2) DevOps (7) Kotlin (26) WordPress (3) MODX (2) Laravel (2) PHP (3) OpenCart (1) Плагины (1)

Kotlin: sealed interfaces и when-выражения — паттерн-матчинг как в Rust

Как sealed interfaces из Kotlin 1.5+ вместе с when-выражениями дают мощный паттерн-матчинг, похожий на Rust enum+match, и почему мы перешли на ADT для доменных событий.

Kotlin Sealed Interfaces Pattern Matching when ADT Функциональное программирование

Kotlinx Serialization + Protobuf — быстрая сериализация для микросервисов

Разбираюсь с накладными расходами JSON-сериализации при высоких нагрузках и показываю, как интегрировать Protobuf с kotlinx-serialization в микросервисной архитектуре на Kotlin.

Protobuf Kotlin Сериализация kotlinx-serialization Микросервисы Производительность

Kotlin + gRPC: streaming и двусторонняя связь в продакшене

Реальный опыт использования gRPC streaming в продакшене на Kotlin: server-side, client-side и bidirectional стриминг для системы отслеживания статусов заказов в реальном времени.

gRPC Kotlin Streaming Protobuf Микросервисы Балансировка

Ktor: Server-Sent Events и WebSockets — реальное использование в продакшене

Нужна была real-time уведомления для дашборда. Выбор: SSE или WebSockets? SSE проще (односторонний, HTTP, автопереподключение), WebSockets мощнее (двусторонний). Для уведомлений хватило SSE, но для чата понадобились WebSockets. Рассказываю, как реализовать оба в Ktor и в каких случаях что выбирать.

Ktor SSE WebSockets Kotlin Real-time Server-Sent Events

Flyway vs Liquibase — миграции БД в Kotlin-проекте

Выбор инструмента миграций — кажется мелочью, пока не нужно откатить изменение в продакшене. Flyway — простой SQL-first подход. Liquibase — XML/YAML/JSON с абстракциями и rollback. Мы использовали оба в разных проектах и набили шишки на каждом. Рассказываю, в каком случае что выбрать и как не потерять данные при rollback.

Flyway Liquibase Kotlin Миграции PostgreSQL Spring Boot

Kotlin + PostgreSQL: подводные камни HikariCP в микросервисах

HikariCP — пул подключений по умолчанию в Spring Boot и Ktor. На первый взгляд — configure and forget. На практике — неправильный размер пула убивает производительность, leak detection срабатывает с ложными позитивами, а connection timeout в Kubernetes приводит к каскадным сбоям. Рассказываю, как мы настраивали HikariCP для продакшена и что пошло не так.

HikariCP PostgreSQL Kotlin Connection Pool Spring Boot Ktor Микросервисы

Event Sourcing на Kotlin с Kafka — от концепции до продакшена

Event Sourcing звучит элегантно: храним не текущее состояние, а все события, которые к нему привели. На практике — это другая архитектура мышления, другая модель данных и куча новых проблем: eventual consistency, snapshotting, replay событий. Рассказываю, как мы внедрили Event Sourcing в Kotlin-микросервисе с Kafka и чему научились на ошибках.

Event Sourcing Kafka Kotlin CQRS Eventual Consistency Микросервисы

GraphQL vs REST в Kotlin-микросервисе — когда имеет смысл переходить

У нас был REST API с 30 endpoint'ами. Фронтенд постоянно просил добавить поля, убрать лишнее, объединить запросы. Перевели один микросервис на GraphQL (graphql-kotlin) и получили: фронтенд запрашивает только нужные данные, один запрос вместо 5-7, меньше нагрузки на сеть. Но появились свои проблемы: N+1 в резолверах, сложность кэширования, versioning.

GraphQL REST Kotlin graphql-kotlin API Микросервисы

Kotlin + OpenTelemetry: распределённый трейсинг без слёз

В микросервисной архитектуре с 12 сервисами запрос проходит через 4-5 сервисов. Когда что-то тормозит — непонятно где. Добавили OpenTelemetry: теперь каждый запрос имеет trace ID, и мы видим полную цепочку вызовов с таймингами. Рассказываю, как настроить OpenTelemetry в Kotlin-микросервисе на Ktor и Spring Boot без боли.

OpenTelemetry Kotlin Трейсинг Микросервисы Ktor Spring Boot Jaeger

Arrow.kt: функциональная обработка ошибок вместо исключений — опыт реального проекта

Try-catch по всему коду — это антипаттерн, но альтернативы кажутся сложными. Arrow.kt предлагает Either, Raise, и ValidationError для типобезопасной обработки ошибок. Перешли на функциональный подход в микросервисе с 40+ endpoint'ами и код стал предсказуемым. Показываю реальный до/после.

Arrow.kt Kotlin Either Функциональное программирование Обработка ошибок Raise

Kapt vs KSP — почему компиляция Kotlin-проекта тормозит и как починить

Время сборки Kotlin-проекта выросло с 30 секунд до 4 минут. Причина — kapt и annotation processing. KSP (Kotlin Symbol Processing) призван это исправить, но миграция не тривиальна. Рассказываю, как мы ускорили сборку в 5 раз, заменив kapt на KSP в реальном проекте с Room, Moshi и Dagger.

Kapt KSP Kotlin Компиляция Annotation Processing Gradle

Kotest vs JUnit 5 — какой фреймворк тестирования выбрать для Kotlin

JUnit 5 — стандарт де-факто, но Kotest предлагает Kotlin-native подход: data-driven тесты, поведение через BehaviorSpec, встроенные assertions. Перешли на Kotest в проекте со 1800 тестами и не пожалели. Но есть подводные камни, о которых молчат туториалы.

Kotest JUnit 5 Kotlin Тестирование TDD Assertions

Kafka vs RabbitMQ — выбор брокера сообщений для Kotlin-микросервисов

При росте микросервисной архитектуры встал вопрос: Kafka или RabbitMQ? Оба брокера используются в Kotlin-экосистеме, но выбор между ними — это не про «какой лучше», а про «какая проблема у вас». Рассказываю на опыте реального проекта, где мы переписали messaging-слой с RabbitMQ на Kafka и что из этого вышло.

Kafka RabbitMQ Kotlin Микросервисы Messaging kafka-clients

Koin vs Dagger/Hilt — выбор DI-фреймворка для Kotlin-проекта

Dependency injection — фундамент архитектуры. Koin — лёгкий, на чистом Kotlin, без кодогенерации. Dagger/Hilt — compile-time, от Google, промышленный стандарт. Сравниваю скорость компиляции, runtime overhead, DX и реальный опыт миграции с одного на другой на проекте с 150 зависимостями.

Kotlin Koin Dagger Hilt DI Архитектура Dependency Injection

gRPC vs REST — что выбрать для межсервисного взаимодействия на Kotlin

REST — привычный, универсальный, работает через JSON. gRPC — бинарный протокол, контракты через Protobuf, стриминг из коробки. На реальном проекте с 12 микросервисами сравниваю latency, размер полезной нагрузки, DX и почему выбор протокола зависит не только от производительности.

Kotlin gRPC REST Protobuf Микросервисы Архитектура HTTP/2

Testcontainers: интеграционные тесты для Kotlin-микросервисов без боли

Мокать PostgreSQL в тестах — путь к ложной уверенности. Testcontainers поднимает настоящие контейнеры с БД, Redis, Kafka — и убивает после теста. В статье разбираю настройку Testcontainers с Ktor, Exposed, Flyway, совместное использование тестовых баз данных и ускорение тестов в CI/CD.

Kotlin Testcontainers Тестирование Docker CI/CD PostgreSQL Kafka

Redis: стратегии кэширования в Kotlin-микросервисах — от Cache-Aside до CQRS

Redis — не просто key-value хранилище. Pub/Sub, Streams, Sorted Sets, Lua-скрипты — Redis позволяет реализовать сложные паттерны кэширования и event sourcing. Разбираю Cache-Aside, Write-Through, Write-Behind, паттерн Cache Stampede и реальный опыт оптимизации задержки с 80 мс до 5 мс.

Kotlin Redis Кэширование Микросервисы Производительность Архитектура

Логирование в Kotlin: klogging vs SLF4J + Kotlin Logging — что выбрать

Логирование — первая линия расследования при P0-инцидентах. Но в Kotlin есть нюансы: string interpolation, ленивые вычисления, структурированное логирование, correlation ID. Сравниваю klogging, SLF4J + Logback, Kotlin Logging и объясняю, почему формат логов важнее библиотеки.

Kotlin Logging SLF4J Kotlin Logging klogging Logback Observability

Exposed vs jOOQ: SQL DSL для Kotlin — сравнение на реальном проекте

Hibernate/JPA — не единственный вариант. В Kotlin-мире есть Exposed от JetBrains и jOOQ от Data Geekery. Обе библиотеки дают типобезопасный SQL без ORM-магии. Сравниваю DX, производительность, миграции и реальный опыт на проекте с 80 таблицами.

Kotlin Exposed jOOQ SQL Базы данных ORM JDBC

Kotlin Coroutines vs Project Reactor — что выбрать для реактивного бэкенда

Корутины и Reactor — две парадигмы асинхронного программирования. Корутины выглядят как синхронный код, Reactor — как цепочка операторов. В статье разбираю когда какая модель выигрывает, как они соотносятся по производительности и почему выбор фреймворка уже определил ваш стек.

Kotlin Coroutines Project Reactor WebFlux Асинхронность Бэкенд

Ktor vs Spring Boot — выбор фреймворка для Kotlin микросервиса

Два фреймворка, два мира. Spring Boot — монолит экосистемы с тысячей стартёров и аннотаций. Ktor — лёгкий, корутин-нативный фреймворк от JetBrains. Сравниваю DX, производительность, время старта и реальный опыт миграции с одного на другой.

Kotlin Ktor Spring Boot Микросервисы Бэкенд Фреймворки

Kotlin'овые суспензии: приложенное исполнение и загадочный suspend — как я начал понимать

Когда я впервые увидел слово suspend перед функцией в Kotlin, я был уверен, что это какая-то магия компилятора. Оказалось, что за этим стоит принципиально иной подход к асинхронности. В этой статье разбираю, как работают корутины под капотом, зачем нужен Continuation, и почему State Machine — это не страшный монстр, а ваш друг.

Kotlin Корутины suspend Асинхронность State Machine

Kotlin: сериализация — Moshi vs kotlinx.serialization — что выбрать для REST API микросервиса

Обе библиотеки решают одну задачу — превращают JSON в объекты и обратно. Но разница в подходах колоссальная. Moshi использует рефлексию в рантайме, kotlinx — компиляторный плагин. В статье сравниваю производительность, DX и грабли каждой библиотеки на реальном проекте.

Kotlin Сериализация Moshi kotlinx.serialization JSON REST API

Kotlin Flow — от основ до продакшена: практическое руководство

Flow — это реактивные потоки Kotlin, но с корутин-нативным подходом. В статье разбираю горячие и холодные потоки, SharedFlow, StateFlow, backpressure, error handling и реальный опыт использования Flow в production на нагрузке 50K rps.

Kotlin Flow Coroutines SharedFlow StateFlow Reactive Бэкенд

Как я разрабатывал виджет для Android с нуля: Kotlin, Jetpack Glance и архитектура, которая не разваливается через месяц

Я занимаюсь Android-разработкой, и через мои руки прошло немало приложений, где рано или поздно вставал вопрос: а не завезти ли нам виджет? Пользователи просили, продакты настаивали, метрики показывали, что конкуренты с виджетами имеют Retention на 20-30% выше. И каждый раз я откладывал эту задачу в бэклог с пометкой «когда-нибудь потом».

виджеты kotlin