Обновить
256K+

Java *

Объектно-ориентированный язык программирования

240,54
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

"__TypeId__": как один Kafka-заголовок незаметно связывает микросервисы именами Java-классов

Уровень сложностиПростой
Время на прочтение18 мин
Охват и читатели4.2K

Если два сервиса обмениваются JSON, но один из них не может десериализовать сообщение без знания полного имени Java-класса другого сервиса - значит, транспортный контракт зависит не только от данных, но и от реализации.

Звучит как теория? Увы, но это суровая практика Spring Kafka, с которой многие разработчики имеют дело каждый день.

Вы пишете сервис A, сериализуете объект в JSON, отправляете в kafka-топик. Консьюмер сервиса B, который понятия не имеет о существовании класса com.company.a.event.UserEvent, должен бы прочитать JSON по структуре полей - ведь это же просто данные, верно? Но нет.

JsonDeserializer по умолчанию смотрит в заголовок TypeId, видит там полное имя класса отправителя и пытается выполнить Class.forName(). Класса нет - контейнер падает. 

Ваш независимый сервис внезапно стал зависимым от classpath источника запроса.

Приглашаю разобраться, как возникла эта проблема и как из неё выбраться, не затаскивая общую DTO-библиотеку в каждый микросервис.

Техническая оговорка: в это статье рассматривается конкретика про JsonSerializer/JsonDeserializer в Spring Kafka. На Avro/Protobuf со Schema Registry эта проблема не воспроизводится - там контракт вынесен в схему, и имя Java-класса просто не играет роли.

Читать далее

Новости

Один язык документов, несколько форматов: как я отделил layout engine от PDFBox и Apache POI

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели9.1K

Долгое время GraphCompose выглядел как PDF-движок. Но архитектурно PDF никогда не должен был быть центром системы: разработчик описывает документ на одном языке, движок один раз рассчитывает layout, а подключаемые backend’ы переводят готовую геометрию в нативные объекты нужного формата.

Читать далее

Почему мы разделили UI, бизнес-логику и ядро: архитектура платформы «Галактика Сверхновая»

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели8.7K

Большинство корпоративных платформ, которые сегодня работают на крупных предприятиях, проектировались 15-20 лет назад. С тех пор сменились языки программирования, подходы к разработке, требования к интеграциям и интерфейсам. Архитектура же во многих случаях осталась прежней.

Мы задумались – можно ли сохранить проверенную бизнес-логику, не переписывая накопленный за десятилетия код, и одновременно сделать платформу открытой для современных технологий?

Эту задачу мы и хотели решить при разработке «Галактики Сверхновой». Заглядывайте под кат и узнаете, как устроено это разделение: почему ядро осталось консервативным, а расширения можно писать на Python, Java и C#, и как метаданные стали основой для интеграций и ИИ.

Читать далее

Мой путь в имитационное моделирование: от физры до AnyLogic

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели10K

В интернете тысячи историй успеха. «Как я бросил универ и заработал свой первый миллион», «Мой путь от курьера до топ-менеджера», «Как я построил бизнес с нуля». Они такие правильные, вдохновляющие и... немного безжизненные. Герои этих постов всегда знают, чего хотят, идут к цели с каменным лицом и в конце непременно достигают успеха, направляя будущие поколения.

Именно поэтому я хочу показать более приземлённую версию успеха обычного человека, в которой запутавшийся новичок сможет себя найти. Без громких фраз про «предназначение» и «стратегическое планирование». Потому что мой профессиональный путь — это не чёткий план, а скорее коктейль из череды случайностей, упрямства и некоторого терпения.

Что было дальше?!

Как не прерывать длинную задачу и удерживать правила в контексте Veai 5.16

Время на прочтение10 мин
Охват и читатели9.3K

ИИ‑агент редко ограничивается одним ответом, когда работает с большим проектом. Он читает код, ищет использования символов, меняет несколько файлов, запускает тесты и исправляет найденные ошибки. За это время история чата пополняется сообщениями пользователя и результатами инструментов.

У длинной задачи возникают две практические проблемы. Первая: разработчику нужно уточнить одну деталь, но новое сообщение может вмешаться в текущую последовательность действий. Вторая: правило, переданное модели в начале разговора, постепенно отдаляется от текущего шага и может перестать влиять на ответ.

В Veai 5.16 для этих сценариев появились команда /btw и параметр strictness. Ниже разберём механику обеих функций, их ограничения и влияние частого повторения инструкций на контекст модели.

Читать далее

Джунам можно, а сеньорам нельзя? Как я притворился джуном и искал работу

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели32K

Всем привет, меня зовут Михаил, я работаю Senior Java разработчиком в ОТП Банке.

Смотря на всю ситуацию на рынке, я подумал: хм, вот джуны притворяются мидлами и сеньорами и ходят по собесам. А что, если все будет наоборот?

Учитывая, что ситуация на рынке для джунов совсем плачевная, я решил провести эксперимент. 30 дней. Только я, фейковое резюме джуна, новый Telegram-аккаунт - и все!

В этой истории было все: отказы, тестовые, преофферы, даже один супер-гуру, который обещал научить меня всему - от тестирования до программирования ракет, лишь бы ему отдали деньги.

Интересно, чем все это закончилось и как это было? Присаживайтесь поудобнее!

Узнать какого быть джуном

IllegalMonitorStateException. Красим код в поисках монитора

Уровень сложностиПростой
Время на прочтение16 мин
Охват и читатели8.1K

Статья настоящий разбор-детектив: почему неблокирующий API может блокироваться, как потерять монитор после деоптимизации JIT, почему try-catch иногда важнее коллбэков, и как решать сложные проблемы новыми концепциями мышления. Приятного чтения!

Читать далее

Разработчики знали код. Никто не знал систему

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели7K

Мне поручили доработать высоконагруженную подсистему аудита. Документации было много, специалистов тоже, но никто не мог описать систему целиком. Чтобы понять, что именно предстоит менять, пришлось восстанавливать архитектуру по репозиториям, Kafka, базам данных и фактическому поведению системы.

Читать далее

Избавляемся от потерянных событий в микросервисах — как я написал свой Spring Starter для Outbox/Inbox

Время на прочтение12 мин
Охват и читатели6.9K

Всем привет! Меня зовут Григорий, и недавно при разработке своего микросервисного приложения я нашёл уязвимость — сообщения, пересылаемые между сервисами, имели высокий риск быть необработанными. Решением стал паттерны Outbox и Inbox. Однако, когда я стал их реализовывать во всех приложениях, то понял, что просто копирую и вставляю код. Чтобы это исправить, я решил написать свой стартер.

Читать далее

Apache Spark и компиляция пользовательских функций UDF на Java в рантайме

Уровень сложностиСредний
Время на прочтение14 мин
Охват и читатели9.8K

Привет, Хабр! Меня зовут Михаил Сичалов, я руководитель проектов и эксперт практики Applied Intelligence в компании Axenix.

Это вводная статья из цикла работ, посвящённых реальным сценариям использования Apache Spark и сопутствующим техническим нюансам, с которыми я столкнулся за последнее десятилетие работы над проектами в области Data Engineering. Я решил систематизировать и переосмыслить свой опыт работы с этим фреймворком и поделиться с сообществом интересными и нестандартными аспектами, освоенными на практике.

Несмотря на выразительность модуля Spark SQL с точки зрения описания преобразований над данными, зачастую возникает необходимость в создании пользовательских функций (UDF). Для этого в Apache Spark есть целое подмножество API, с помощью которого можно реализовать пользовательскую функцию произвольной сложности. Но что делать в случае, когда код функции становится доступным только в рантайме, а Spark используется в связке с Java API?

В данной статье рассмотрим подход к подготовке, компиляции и исполнению Java-кода пользовательских функций в рантайме приложения Spark, а также, почему этого не стоит повторять.

Читать далее

Вы не напишете спецификацию с первого раза, даже с помощью Fable

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели8.6K

В блоге Anthropic вышла статья Thariq Shihipar, в которой он рассказывает, как агент помогает находить ему Неизвестные Неизвестные (Unknown Unknowns). Я думаю, что мысли из статьи также очень важны для Spec Driven Development, и хорошо объясняют, почему спецификация это живой документ, и получение финального документа возможно только после того, как код уже написан, (ну или во всяком случае, одновременно с этим моментом). Если вы считаете, что Spec Driven Development — это будущее AI‑assisted разработки (намеренно не говорю вайбкодинг), прошу под кат.

Читать далее

Я продал одно место на концерт 20 раз. Разбираемся, как правильно защититься от race condition в Spring Boot

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели8.4K

Однажды я решил проверить на практике байку, которую слышал на десятке собеседований: “у нас на проде было такое-то место продано дважды, потому что…”. Оказалось, воспроизвести это не просто легко — это воспроизводится настолько надёжно и настолько наглядно, что грех было не довести дело до конца: взять систему бронирования мест, специально сломать её, замерить, насколько плохо, а потом последовательно починить тремя разными способами — и честно сравнить, что каждый из них стоит по производительности.

Спойлер: один из результатов оказался прямо противоположным тому, что я ожидал увидеть.

Читать далее

Назад в 2005-й. API-first как третья пилюля от деградации проекта под LLM

Время на прочтение19 мин
Охват и читатели9.2K

Агент отчитался: экран настроек готов. Поля редактируются, после сохранения выскакивает тост «Сохранено». Я нажал F5 — все настройки вернулись к дефолтным. Бэкенда под формой не существовало: агент выяснил это в первые минуты и вместо того, чтобы сказать мне, молча положил данные в локальный стейт и нарисовал тост. Ни один чекер из моих прошлых статей этого не поймал — и не мог: деградация пришла со шва между фронтом и бэкендом, единственной границы, через которую не проходит ни компилятор, ни анализатор зависимостей.

Под катом — как этот шов гниёт под LLM и как его чинит contract-first: генерация серверных интерфейсов и клиента из одного OpenAPI-файла, политика ломающих изменений, правило «не симулируй — расширяй контракт». Попутно — зачем возвращаться к идее, которую мы выбросили вместе с WSDL, и какая из моих проверок после всего этого молча перестала работать. Третья часть цикла, читается самостоятельно.

Читать далее

Ближайшие события

Натуральные ключи в БД. Последний раз объясняю

Уровень сложностиПростой
Время на прочтение9 мин
Охват и читатели14K

Всем привет! На связи Михаил Поливаха, технический лидер проекта Axelix.

Я уже выпускал статью по мотивам вопросов в рамках Spring Айо Академии. Так вот, когда мы разгребали отзывы с первого потока, мы также получили вопрос (это не прямая цитата, я лишь передаю посыл в том виде, как я его понял):

А что насчет натуральных ключей в БД? Если, допустим, у меня есть поле, по которому я могу явно идентифицировать запись, стоит ли его использовать как Primary Key?

И я за время дизайна enterprise систем, и за время дизайна Axelix пришёл к выводу: Просто не используйте натуральные ключи вообще никогда. Когда у вас появляется такое желание - выйдите на свежий воздух, пройдитесь, прогуляйтесь, и вас отпустит.

Читать далее

Сколько стоит контроль над ИИ-агентом? Считаем экономику

Время на прочтение8 мин
Охват и читатели12K

В прошлой статье мы разбирали, как сделать работу ИИ-агента предсказуемее: зафиксировать требования в спецификации с помощью Specification-Driven Development (SDD), до реализации описать ожидаемое поведение тестами по Test-Driven Development (TDD), а готовый результат проверить и передать отдельному субагенту на ревью.

У такого подхода есть цена.

Подготовка спецификации, написание тестов до кода и отдельное ревью требуют времени разработчиков. Возникают два вопроса: сколько контроля нужно конкретной задаче и когда затраты на него окупаются?

Полагаться только на свои ощущения в таких вопросах очень опрометчиво. В одном из экспериментов разработчики считали, что ИИ ускорил их примерно на 20%. Замеры показали обратное: с ИИ они работали на 19% медленнее.

В статье считаем полную стоимость работы с ИИ-агентом: разбираем, что уже измерено, сколько времени человек тратит на проверку и почему разным задачам нужен разный уровень контроля.

Что показывают эксперименты, если читать их целиком

Заголовки об ИИ в разработке противоречат друг другу: «на 55% быстрее», «на 19% медленнее», «на 26% продуктивнее». Результаты расходятся, потому что исследования проводились в разных условиях и измеряли разные показатели.

Для сравнения я выбрал работы с доступными первоисточниками, описанной методологией и измеримыми результатами. Исследование пул-реквестов стоит отдельно от контролируемых экспериментов: оно показывает, как агенты используются на практике, но не позволяет установить причины полученных результатов.

Читать далее

Выпущена версия Jmix 3.0

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели7.3K

Выпущен Jmix 3.0, и это самый значительный шаг, который фреймворк сделал за последние годы. Этот релиз перестраивает основу на современном технологическом стеке, оставаясь полностью совместимым с предыдущими версиями, что делает миграцию гладкой и простой. Наряду с обновлением платформы, 3.0 представляет набор функций, которые активно используют ИИ и предоставляют гибкость в рантайм.

Ниже приведён краткий обзор основных новых возможностей. Полный список изменений, включая все критические изменения, доступен в разделе Что нового документации.

Читать далее

Spring Security: дополнение к JWT токенам

Уровень сложностиСредний
Время на прочтение20 мин
Охват и читатели11K

Всех приветствую!

Данная статья будет посвящена довольно важным вещам, таким как: refresh token, метод-уровневой безопасности и примеру реализации правила "свой/чужой профиль"

Читать далее

После вайб-кодинга: почему в 2026 году появляется новый класс Code Clean-up Agents

Уровень сложностиПростой
Время на прочтение12 мин
Охват и читатели17K

После вайб-кодинга: почему в 2026 году появляется новый класс Code Clean-up Agents. Как стоимость разработки смещается от генерации к проверке, рефакторингу и контролю изменений

Я всё чаще вижу один и тот же сценарий. Агент получает задачу, за несколько минут собирает патч, запускает тесты и сообщает об успехе. Первый просмотр выглядит обнадёживающе. Потом начинается ревью.

Чем быстрее появляется код, тем больше времени уходит на восстановление контекста: что агент поменял, на какие факты опирался, какой конфигурацией запускал тесты и сколько попыток сделал до финального ответа.

В этой точке полезно отделить генерацию патча от подготовки изменения к отправке в основную ветку. Для второй задачи в 2026 году формируется отдельный класс инструментов: Code Clean-up Agents.

Читать далее

Агент пишет не то, что нужно? Верните контроль

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели9.8K

Как часто, работая с агентом над новой фичей, вы остаётесь недовольны результатом? То что-то не работает, то качество кода неприемлемо. Вы просите агента ещё раз и ещё раз, пытаетесь подобрать «идеальный» промпт — и всё равно не выходит. Уверен: чем дольше вы работаете с агентом, тем чаще разочаровываетесь. И это неудивительно: агент пишет код очень быстро — и именно поэтому ОЧЕНЬ просто получить ОЧЕНЬ много кода, который вам не нужен. Но код — это как раз простая часть. Настоящая задача инженера — строить системы: надёжные, быстрые и поддерживаемые. Именно за это нам и платят — и вот этого агент пока за нас не делает.

Читать далее

Origami Framework: автоматизация тестирования на Java

Уровень сложностиПростой
Время на прочтение2 мин
Охват и читатели8.2K

Origami Framework — фреймворк для автоматизации тестирования на Java, созданный с целью упрощения построения тестовой архитектуры и ускорения процессов приёмочного и регрессионного тестирования

Читать далее
1
23 ...