RU

Как опубликовать внутренний API из DMZ, если соединения в LAN запрещены: пять подходов, которые мы проверили

Как опубликовать внутренний API из DMZ, если соединения в LAN запрещены: пять подходов, которые мы проверили Все пять схем мы собирали на  NEOM…

APIDMZАрхитектураБезопасностьHAProxyKafkaActiveMQ ArtemisWSO2NeoflexJava
Habr
RU

Платёж списывается дважды. Найдите причину в коде, который прошёл ревью

Платёжный сервис прошёл ревью, тесты зелёные, в базе один успешный платёж — а с карты списали деньги дважды. Причём в двух…

идемпотентностьдвойное списаниеплатёжный сервисраспределённые системыSpring BootJavaPostgreSQLретраиконкурентные запросымикросервисная архитектура
Habr
RU

Senior Java — это кто? Почему одинаковый title ещё не означает одинаковую работу

Две вакансии называются Senior Java. В одной ищут Spring/PostgreSQL/Kafka backend, в другой JMM, GC, lock‑free и low latency. А в&nbs…

JavaSenior JavaJava DeveloperbackendseniorityIT-рекрутментнайм в ITвакансиитехническое лидерство
Habr
RU

Робот доставщик дороже автомобиля, мокрая трава и открытый JDWP

Мы продали клиенту робота‑доставщика с интеграцией и пообещали запустить его в парке. Вскоре выяснилось: передать клиенту робота и передат…

робототехникаLinuxинформационная безопасностьреверс-инжинирингROSSLAMIoTкомпьютерные сетиJavaоблачные технологии
Habr
RU

Go сделали скучным — и после нейросетей это выстрелило

Go двадцать лет дразнили языком для дураков. Без дженериков, без перегрузок, без нормальных перечислений, без магии. Синтаксис учится за выходные, в…

golangязыки программированиягенерация кодаLLMобратная совместимостьдженерикимногопоточностькомпиляторыJavaPython
Habr
RU

Бэкенд без лишних граблей: 13 статей о PostgreSQL, микросервисах и коде

Что общего у раздувшегося индекса, неудачно нарезанных микросервисов и лишнего std::move ? Все они выглядят безобидно, пока не доходят до продакшена…

бэкенд-разработкапроектирование системPostgreSQLбазы данныхмикросервисная архитектураC++Javaоптимизация производительности
Habr
RU

Producer-Consumer на Java, Go и Rust: одна задача и три уровня решения

Три уровня решения задачи производителя и потребителя: BlockingQueue в Java, каналы в Go и очередь без блокировок на Rust. Разбираемся, какой уровен…

JavaМногопоточностьGolangRustПаттерны проектированияПотоки и блокировкиСтатьи
Tproger
RU

Как я случайно напечатал инфляцию в Discord‑боте и переделал ставки в тотализатор

Всё, что ниже — из живого пет-проекта: бот начисляет участникам голосовых каналов баллы лояльности (LP), а на эти баллы люди устраивают пари в стиле…

JavaSpring BootJDADiscord-ботPostgreSQLконкурентностьидемпотентностьтотализаторигровая экономикатранзакции
Habr
RU

Разработчику нужно знать семь языков. Python, Go и Java в этот список не входят

Бывает так: код хороший, задачи закрыты, к технической части претензий нет. Но и повышения тоже нет. Или идею не взяли. А на интервью — отказ без вн…

GolangJavaPythonCEOCTOкарьера программистафакапы
Habr
RU

Конвертация docx на сервере: LibreOffice headless против Apache POI, и где каждый ломается

Задача звучит безобидно: «нам нужно на бэкенде превращать .docx в .html (а иногда .html в .pdf )». В тикете это одна строчка. На практике конвертаци…

конвертация документовApache POILibreOfficedocx в htmlUNO APIheadless LibreOfficeJavaKotlinJODConverterhtml в pdf
Habr
RU

Одно лишнее if — и объект уезжает в кучу: как C2 решает, каким аллокациям не быть

Пара new в горячем методе может вообще не попасть в кучу — а после безобидного if внезапно вернуть аллокации обратно. Разби…

JavaJVMHotSpotC2Escape Analysisскалярная заменаJIT-компиляцияаллокации памятиоптимизация производительностиJMH
Habr
RU

[Перевод] Пересекая реку Стикс: Spring Boot 3.5 и проблема зомби-зависимостей

Недавно я разбирал истории CVE, связанные с завершением поддержки Tomcat 8.5 , и решил посмотреть на Spring Boot 3.5. Я задался тем же вопросом прим…

JavaSecuritySpringjdkрелизный циклaxiomaxiom jdkбезопасностьsecurity-патчиобновление безопасности
Habr
RU

От клика до железа: хроника одного запроса. Часть 2

В первой части мы заставили кнопку на веб-странице запустить локальный exe-файл через расширение Chrome и Native Messaging Host. Теперь усложним зад…

Chrome Native Messagingрасширения ChromeJavaJavaScriptGraalVMconnectNativeService WorkerManifest V3Native ImageWindows
Habr
RU

Как мы заменили 30-минутный polling на IMAP IDLE и построили маленькую распределённую систему

Когда-то наш почтовый загрузчик был обычным методом с @Scheduled . Раз в 30 минут он подключался к ящикам, искал новые вложения и запускал их обрабо…

JavaSpring BootIMAP IDLEdistributed systemsPostgreSQL leasesidempotencybackpressurevirtual threadsconcurrencyat-least-once delivery
Habr
RU

Приложение простояло 918 мс, а сборщик мусора отработал за одну: разбираемся, куда ушло остальное

Секундная пауза в Java‑приложении легко выглядит как проблема сборщика мусора, хотя сам GC может отработать за миллисекунду. Разберём…

JavaJVMточки безопасностиsafepointсборщик мусорапаузы JVMпрофилирование Javaasync-profilerJFRпроизводительность приложений
Habr
RU

Вам не нужны микросервисы

Какое‑то время назад, проработав 3 года на позиции Java Middle+‑ разработчика на крупном монолитном легаси‑проекте (естественно, моду…

Spring Modulithмодульный монолитмикросервисыархитектура приложенийJavaSpring Bootгексагональная архитектураперевод PDF
Habr
RU

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

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

Javaspring frameworkkafkaмикросервисы__TypeId__TYPE_MAPPINGSJsonSerializerJsonDeserializer
Habr
RU

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

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

GraphComposeJavadocument generationlayout enginePDFPPTXPDFBoxApache POIopen sourcebackend
Habr
RU

ИИ-агент собрал сам себя: эксперимент с LangChain4j и уроки для Java-разработчиков

LLM по документации LangChain4j собрала клона себя — мультиагентного кодера. Он починил баги, прошёл 11 тестов и показал, почему workflow быстрее su…

JavaИскусственный интеллектФреймворки и библиотекиOpenAIСтатьи
Tproger
RU

Один фреймворк для Android и iOS: звучит круто, работает?  Нет

Почему единый кроссплатформенный фреймворк для автотестов Android и iOS не работает на практике и когда стоит разделить его на два отдельных проекта…

JavaТестированиеAndroidGitРаспознаваниеiOSРаботаSwiftHRGitLabKotlinФинтехQAПриложениеdevСерверБиблиотекиТестирование приложений и сайтов плюсИнфраструктураСтатьи
Tproger