darerror not found
1.01K subscribers
27 photos
23 links
@darerror пишет о всяком и разном. в основном о java да backend прилегающем.
Download Telegram
я постепенно пришла к одной простой мысли: хороший разработчик по природе своей нелинеен.

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

и это естественный ритм, а не лень и не переработка.
так устроена работа с мозгом: она идет неравномерно
47301
🟢я в прайме.

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

мы выкатили релиз, в рамках которого я лидировала важную фичу на бэке: внедрение интеграции со sberid. с учетом сроков и общей размытости требований эта задача стала настоящим испытанием.

еще осенью у меня был запрос усилить знания в oauth2, keycloak и смежных технологиях. как это обычно бывает, подобные вещи настраиваются на старте проекта, а дальше просто поддерживаются. и вот под конец осени мне прилетает эта задача на декомпоз. пришлось погружаться во весь security-флоу проекта, разбираться в коде смежных команд, глубже изучать keycloak и idp.

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

в итоге теперь в нашем приложении интегрированы бейджи «СберСпасибо», «СберПрайм» и другие плюшки, о которых вы точно ни раз слышали. редкий случай, когда результат можно наконец показать наглядно - буквально картинками!
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
58851
окей, первый опыт управления командой «hits different»

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

для меня важно получать опыт, чтобы любые сомнения проверять на практике. точно так я когда-то выбрала backend после экспериментов с фронтендом, мобильной и другими направлениями. здесь та же история - из квартала в квартал спрашивают «куда хочешь развиваться?», а четкого ответа у меня долго не было. спойлер: на 2026 он уже появился.

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

опыт очень понравился. в следующем посте расскажу про книгу «Мама, я тимлид», которую подарили мне издательство «Альпина».

благодаря этому опыту я поняла, что сейчас больше хочется развиваться по твердому карьерному треку - углубляться в архитектуру, писать еще больше кода, узнавать новое, а управление оставить как следующий этап в этом большом путешествии
18104
🟦недавно дочитала «Мама, я тимлид» Марины Перескоковой - очень понятный, практичный труд. автор делится реальными советами по руководству IT-командой на основе своего опыта.

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

закину несколько цитат, которые особенно зацепили:

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


рекомендую каждому заинтересованному!
Please open Telegram to view this post
VIEW IN TELEGRAM
2015
с Рождеством! послушала на одном дыхании очень интересный подкаст от Евгения Сулейманова и Михаила Поливахи

про что он:
⚙️ зачем разработчику контрибьютить в open source
⚙️ зачем разработчику быть спикером
⚙️ как это влияет на рост, видимость, уверенность и качество мышления
⚙️ как выбирать технологии и выстраивать обучение, если не хочется бегать за каждым трендом
⚙️ AI на рынке

посмотреть можно на youtube
Please open Telegram to view this post
VIEW IN TELEGRAM
1614
📚обзор на ч. 2 «Предметно-ориентированное проектирование» от Эрика Эванса (Структурные элементы)

ч.1

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

на этом фоне smart ui выглядит как антипаттерн. вся логика живет в экранах, каждый контроллер сам ходит в базу, валидирует, считает правила, дергает интеграции. код отражает кнопки и формы, а не бизнес. язык предметной области не формируется, изменения становятся дорогими, усложнение ломает систему. при этом smart ui честно хорош для простых задач, админок, коротких проектов и быстрого старта. он просто несовместим с целью ddd - строить модель как носитель знания.

ассоциации стоит ужимать: каждая связь должна быть оправдана поведением, иметь понятную реализацию и не плодить лишнюю связанность.

сущность определяется не набором атрибутов, а непрерывностью существования и идентичностью во времени. она может менять форму, состояние, представление, но оставаться собой. у нее всегда есть идентификатор и четкое определение равенства. объект-значение наоборот существует как описание. важны не «кто», а «какое». адрес, деньги, период, координаты. value object желательно делать неизменяемым, чтобы безопасно передавать и переиспользовать. если изменяемость нужна ради производительности, ее надо изолировать и не делить между владельцами.

не все процессы естественно ложатся в объекты. если операция не является органической частью ни сущности, ни value object, появляется служба. служба не хранит собственного состояния, описывается через язык модели и выполняет конкретную доменную операцию. это не технический сервис, а элемент предметной модели. при этом службами нельзя злоупотреблять, иначе модель теряет поведение.

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

агрегат задает границы согласованности. это группа связанных объектов, которая изменяется как единое целое. у агрегата есть корень, и только он доступен извне. внешние ссылки могут указывать только на root. внутренние сущности живут только внутри агрегата. агрегат определяет транзакционные границы, изоляцию и правила доступа.

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

хранилище инкапсулирует доступ к устойчиво существующим агрегатам. клиент работает с иллюзией коллекции в памяти: добавляет, удаляет, ищет по критериям. хранилище скрывает технологии хранения, упрощает тестирование и изолирует инфраструктуру от модели. важно, что хранилище не управляет транзакциями. фабрика создает новые объекты, хранилище извлекает существующие, даже если технически тоже конструирует экземпляры.

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

вся глава на самом деле про одно: модель - это не диаграмма и не набор классов. это способ удерживать смысл системы в голове команды. архитектура, паттерны, слои и ограничения нужны не ради красоты, а ради того, чтобы знание не размывалось, не утекало и не превращалось в случайный набор экранов, таблиц и костылей
Please open Telegram to view this post
VIEW IN TELEGRAM
971
💻как мы переехали с Oracle на PostgreSQL без даунтайма [часть 1: контекст и работа с кодовой базой]

весной 2025 я начала работать над задачей перевода проекта с Oracle на PostgreSQL.

с чем имеем дело:
1. микросервисная архитектура
2. java, spring boot. в коде и нативные sql-запросы, и hibernate
3. активные бизнес-релизы, команда постоянно выкатывает новые фичи
4. человеко-ресурсы ограничены: я, позже 1-2 разработчика (в зависимости от фазы), 1 devops и 1-2 qa
5. ключевое - никакого даунтайма. пользователь не должен заметить, что под капотом вообще что-то меняется

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

если обобщать, процесс состоит из нескольких крупных этапов:
1. анализ и очистка данных
детальный разбор накопившегося легаси, неиспользуемых таблиц, исторических костылей
2. миграция данных
3. переработка liquibase
4. переработка прикладного кода микросервисов
учет нативных запросов, особенностей ORM, тех самых «так исторически сложилось» и т.д.
5. организационные и процессные вопросы
подготовка инфраструктуры, коммуникация с командами, синхронизация бизнес- и тех-релизов, стратегия веток, взаимодействие с сопровождением и dba, заранее продуманные сценарии проблем и способы их решения. техническая часть - это лишь половина задачи. вторая половина - люди, процессы, ограничения и договоренности.

к чему стремилась: в PostgreSQL есть все исторические данные, поды пишут в нее новые напрямую — и это все без даунтайма.

в этой части я расскажу о работе на уровне кода.

при продумывании перехода важно сразу учитывать различия между базами.
например, в Oracle пустая строка фактически равна null, в Postgresql такого поведения нет. или, например, boolean в виде 0/1 или Y/N становится честным true/false.
мы очень много правили кастомные запросы и clob. было много разных ситуаций.

liquibase правили по принципу: пока не запустится - чиним.
во многих местах хватало массовых правок через ide (например, number(1,0) -> boolean). важно не забывать и про dbms-фильтры в liquibase (например, dbms=oracle), которые легко пропустить.

для запуска скриптов использовали контексты:
• ddl - context="!PREP and !PROD"
• dml - context="!IFT and !PREP and !PROD"

ddl в первом случае накатывался отдельным процессом (через ДБА), а dml фактически не требовался - но к этому я еще вернусь позже.

еще один исторический нюанс - использование sequence в некоторых сервисах. при миграции данных пришлось отдельно продумывать механизм динамического сдвига значений, чтобы избежать коллизий после переключения. мы реализовали это на старте pod-а: проходились по всем sequence микросервиса, сравнивали значения в oracle и postgresql и при необходимости сдвигали их в postgres.

логика сдвига зависела от скорости роста таблицы и объема данных. в ряде сервисов хватало общего коэффициента с запасом (например, x2-x3).
важно, что этот механизм можно было безопасно запускать многократно - при рестарте микросервиса. дополнительно была сделана административная ручка для runtime-сдвига sequence. решение легко тиражировалось между микросервисами - менялась только формула расчета нового значения.

итог: благодаря этим работам кодовая база микросервиса научилась дружить со слоном.

а о стратегии миграции исторических данных поговорю в следующей части.
💎 - жду, очень интересно!
(насыпьте пж алмазов, нужно понимать отклик такого контента)
Please open Telegram to view this post
VIEW IN TELEGRAM
731031
💻как мы переехали с Oracle на PostgreSQL без даунтайма [часть 2: миграция данных]

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

возможные подходы к миграции данных

а) spring batch
классический инструмент для etl-процессов (extract, transform, load).
миграция реализуется на уровне кода: несколько datasource, reader, processor, writer, job, step.

плюсы - гибкость и полный контроль над логикой.
минусы - сложность настройки и поддержки. по сути, это отдельное приложение со своей конфигурацией и жизненным циклом.

б) dblink
прямое подключение к oracle и перенос данных запросами.
рабочий, но достаточно низкоуровневый вариант.

в) ora2pg
утилита для миграции схемы и данных из oracle в postgresql.
хорошо подходит для одноразового переноса, но плохо ложится на сценарии с активной записью и требованиями zero-downtime.

г) fdw и утилиты поверх него (например, ora_migrator)
идея fdw - создание в postgresql «прокси»-таблиц с прямым доступом к oracle.
можно читать данные из oracle как из обычных таблиц postgresql.
утилиты поверх fdw упрощают жизнь: автоматизируют перенос данных, конвертацию типов и рутинные операции. под капотом все равно fdw, но с меньшим количеством ручной работы.

д) cdc (change data capture)
например, oracle goldengate или debezium.
идея - онлайн-репликация данных без остановки системы: изменения (insert / update / delete) сразу летят в postgresql.

плюс - идеально подходит под zero-downtime.
минус - дополнительная инфраструктура и необходимость разбираться в инструменте.

в итоге для нашего проекта остановилась на cdc.

ожидания от cdc-решения были следующие:
1. opensource или free
2. поддержка oracle → postgresql
3. начальная загрузка данных + онлайн-репликация изменений
4. возможность накатываться на уже существующие таблицы
5. поддержка преобразований данных (например, типов)

рассмотренные cdc-решения

oracle golden gate (free)
бесплатная версия умеет реплицировать только oracle → oracle, что сразу делает ее непригодной для нашего сценария.
полную версию я пыталась раскатить отдельно, но опыт оказался довольно болезненным: нормально не завелась ни на linux, ни на macos, ни на windows (пробовали разные версии). плюс очень ограниченное количество материалов вне официальной документации - в основном приходится ориентироваться на коды ошибок и мануалы.

airbyte
есть opensource-версия с активным github и платные расширения.
oracle connector от разработчиков платный, а community-версия сильно ограничена:
• нельзя управлять типами данных на конвейере
• не умеет писать в уже существующие таблицы postgresql
• не поддерживает полноценную онлайн-репликацию

по факту это скорее инструмент для разовой или периодической загрузки (cron / ручной запуск), чем полноценный cdc.

debezium
полноценный opensource с большим коммьюнити и живой экосистемой.
есть ui, но на начало 2025 он выглядел довольно сырым и практической ценности почти не нес - удобнее использовать связку kafka connect ui + kafka ui + http.

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

в следующей части - продолжение
💎 - поддержка!
Please open Telegram to view this post
VIEW IN TELEGRAM
4354
💻как мы переехали с Oracle на PostgreSQL без даунтайма [часть 3: процессы]

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

про организацию релизов

в среднем за один релиз переводился один микросервис (иногда и три). такие релизы мы называли техническими - в них не было ничего, кроме миграционных изменений. они выходили между основными бизнес-релизами.

по веткам использовали следующий подход:
параллельно release-x создавалась ветка postgres-release-x с полностью идентичным кодом плюс доработки под postgresql.
эта ветка не мержилась в master до выхода в прод.

тестовый стенд велся в двух namespace:
• основной - на master
• отдельный - на postgres-ветке

это позволяло не блокировать разработку и тестирование и не тормозить бизнес-релизы из-за миграционных нюансов. cherrypick-и в релизные ветки выполнялись синхронно.

в итоге процесс на тестовом стенде выглядел так:
1. для целевого микросервиса заводилась ветка postgres-release-<version>, в которую вливались все изменения. релизные правки подтягивались через cherrypick
2. микросервис можно было деплоить сразу - ddl накатывался нативно через liquibase
3. во всех postgresql-микросервисах отключались джобы и очереди, чтобы второй namespace не перехватывал события и не писал данные неконсистентно. управление выполнялось через feature flags
4. в окружении задавались оба datasource: oracle и postgres, выполнялась синхронизация sequence
6. временно отключались fk и другие тяжелые структуры через feature flags для проведения миграции данных
7. база подготавливалась к работе с debezium
8. выполнялась миграция данных и последующее тестирование

на препроде и проде цикл был следующим:
1. подготавливалась инфраструктура
2. заранее накатывались проверенные ddl через ДБА в postgreSQL базу
3. запускался debezium для перелива снепшота и онлайн-изменений
4. микросервис деплоился на postgres-ветке: клиенты начинали работать с новой базой, а debezium в моменте догонял оставшиеся изменения из oracle, включались fk и другие тяжелые структуры

и на начало 2026 я могу сказать, что миграция 10+ микросервисов разной сложности прошла успешно. выбранный подход оказался рабочим: по ходу процесса он донастраивался, оптимизировался и постепенно превращался в хорошо выстроенный процесс. экспертиза не оставалась локальной - команда понимала, что и зачем мы делаем, подход удалось тиражировать от сервиса к сервису, учитывая их особенности и исторические нюансы.

в следующей статье разберу debezium как инструмент и расскажу о его устройстве и тонкой настройке.
💎 - поддержка!
Please open Telegram to view this post
VIEW IN TELEGRAM
5352
как думаете: расширять статью и идти на хабр? насколько интересно читать такие личные истории? чем-то полезно, даже если не ложится в рабочее?

💎- без слов да
Please open Telegram to view this post
VIEW IN TELEGRAM
108842
📚обзор на ч. 3 «Предметно-ориентированное проектирование» от Эрика Эванса (Углубляющий рефакторинг)

ч.1
ч.2

рефакторинг начинает влиять на надежность и «долголетие» системы только тогда, когда опирается не на чистоту кода, а на понимание предметной области. либо узнали что-то новое о бизнесе — код меняется, либо делаем модель точнее.

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

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

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

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

гибкая архитектура продолжает углубленное моделирование. неявные знания становятся явными — «сырье» формирует модель и архитектуру, позволяющую системе реально работать. гибкость не равна усложнению — простые, вдохновляющие архитектуры создаются дисциплинированной работой.

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

логика разделяется по эффектам: чистые функции без побочных эффектов, простые команды для изменений состояния, сложные вычисления — объекты-значения.

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

изменяемую часть процесса стоит вынести в объект — стратегию. это способ выразить правило или политику предметной области. для иерархий используется композит, отражающий операционную симметрию. flyweight — только техническая оптимизация, не шаблон для доменной модели.

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

💎 - спасибо!
Please open Telegram to view this post
VIEW IN TELEGRAM
2311
как думаете: сколько по времени заняла первая сборка spring framework с тестами?
Anonymous Poll
7%
30 секунд
17%
1 минуту 30 секунд
21%
6 минут
19%
15 минут
37%
30 минут
3
пока что еще один вопрос… сколько тестов в spring framework?
Anonymous Quiz
14%
22%
21%
15к
21%
30к
21%
77к
61
📚обзор на ч. 4 «Предметно-ориентированное проектирование» от Эрика Эванса (Стратегическое проектирование)

ч. 1
ч. 2
ч. 3

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

единая доменная модель для большой системы почти всегда недостижима или слишком дорогая. поэтому систему делят на части — bounded contexts.

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

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

extreme programming хорошо поддерживает целостность модели внутри одного контекста, но между контекстами нужны архитектурные решения. варианты: shared kernel, customer/supplier, conformist, anticorruption layer.

anticorruption layer — изоляция своей модели через трансляцию. обычно комбинация фасада и адаптера: фасад упрощает внешний интерфейс, адаптер переводит вызовы и данные. слой может быть двусторонним, если обе системы обмениваются вызовами или событиями. минимальные изменения чужой системы допустимы, но осторожно.

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

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

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

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

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

💎- спасибо за обзор книги!
Please open Telegram to view this post
VIEW IN TELEGRAM
287
тот самый пулл реквест, час которого наступил:

upd: спасибо, мы спасли канал от бедности!
1686
хочу дискуссии и интересного обсуждения.

разработчики,
какой формат собеседования для вас самый идеальный?
8532
Что за CDC и Debezium такие?💻

В предыдущих постах я рассказывала о миграции данных и упомянула Debezium как целевое решение, поэтому хотелось бы рассказать о нём чуть подробнее.
Репозиторий проекта: https://github.com/debezium/debezium

Change Data Capture (CDC, захват изменений данных) — это технология, которая позволяет отслеживать и фиксировать изменения в базе данных в реальном времени, а затем передавать эти данные в другие системы. Возможно, в кабанчике про это читали, если не работали напрямую.

Debezium - это CDC-платформа, которая использует все блага Apache Kafka и Kafka Connect для обеспечения надежности, отказоустойчивости и масштабируемости.

Коннектор Kafka Connect отслеживает базу данных, считывает все изменения и публикует их в Kafka-топики. Также Debezium можно запускать через embedded-движок прямо внутри приложения, получая те же события изменений данных без использования Kafka. Ещё один вариант — поставить целый Debezium Server (готовое к использованию приложение). Подробнее об архитектуре

Debezium полезен в ряде следующих сценариев: инвалидация кеша, интеграция, миграция данных, CQRS.

Как же это работает на практике? На примере миграции Oracle -> PostgreSQL.
Oracle фиксирует все изменения в redo log. При первом запуске коннектора Debezium делает initial snapshot — полное считывание состояния таблиц. После snapshot-а коннектор продолжает стримить изменения из redo log, превращая INSERT / UPDATE / DELETE в упорядоченные CDC-события, которые отправляются в Kafka. Далее sink-коннектор или consumer применяет эти изменения к PostgreSQL, воспроизводя операции в том же порядке. В результате Postgres постепенно синхронизируется с Oracle. Важно: Oracle должен быть настроен на архивное логирование

Что доступно сейчас?
Source-коннекторы поддерживают: MongoDB, MariaDB, MySQL, PostgreSQL, Oracle, SQL Server, Db2, Cassandra, Spanner и Vitess + Informix (инкубационный режим).
Sink-коннекторы — JDBC и MongoDB Sink.

Для раската миграции мне понадобились образы Kafka (Kafka, Zookeeper, Kafka UI, Kafka Connect UI) и Debezium Connect. UI мной был проигнорирован умышленно, так как летом 2025 он был сырым и нерабочим. На февраль 2026 репозиторий UI уже архивирован, так как появилась новая платформа с UI: разработка идёт активно, но проект пока на ранней стадии.

Документация у ребят очень подробная и понятная. Примеры конфигураций коннекторов приведу для наглядности в комментариях.
В целом, это инструмент тонкой настройки. И если получится с ним подружиться, то он может помочь сыграть хорошую игру.
Please open Telegram to view this post
VIEW IN TELEGRAM
762
😭как правильно жаловаться на баг? давайте разбираться.

когда задаёшь вопрос на том же Stackoverflow или issue на GitHub с подозрением на баг, важно дать такой код, чтобы другие могли быстро понять и воспроизвести проблему. в англоязычном сообществе это называют MRE / MCVE / MWE / reprex = минимальный, воспроизводимый пример.

код должен быть минимальным, полным и воспроизводимым.


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

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

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

если соблюдать эти три основные правила, люди гораздо быстрее помогут разобраться или создать PR.

также советую к прочтению эту статью.

💎 - полезно, дарреровна
Please open Telegram to view this post
VIEW IN TELEGRAM
32642
⚡️ активно слежу за проектами в экосистеме Java. пару лет назад коллеги рассказывали мне про JPA Buddy, и инструмент сразу заинтересовал. очень быстро он стал хитом: на сегодня у него 5 миллионов скачиваний, его заметили в JetBrains, и он вошёл в продуктовую линейку компании.

после этого ребята из Haulmont начали работать над Amplicode, чтобы расширить возможности интеграций с разными средами и дать всем Spring-разработчикам доступ к современным инструментам. также вместе с компаниями Axiom JDK и Группой Астра они создали и продолжают развивать открытый бесплатный российский форк IntelliJ IDEA Community — OpenIDE.

Amplicode — это плагин для IntelliJ IDEA (Community и Ultimate), GigaIDE и OpenIDE, который ускоряет и упрощает разработку сервисов и web-приложений на Spring. А версия для VS Code позволяет быстро создавать административный интерфейс на React Admin.


подробно о возможностях плагина можно узнать на сайте (правда, советую поставить себе и попробовать - делов на пару минут)
свой отзыв я оставила здесь
Please open Telegram to view this post
VIEW IN TELEGRAM
9951
🃏потихоньку выкладывают доклады прошедшего в октябре joker 2025 (тут делала обзор)

очень рекомендую к просмотру, на днях как раз вышел один из моих личных фаворитов - дуо Сазоновых
543