Ещё несколько слов о Field Injection:
#Spring #Di
1.
Имеет неоспоримое приемущество над первым (from Constructor
) способом, т.к. статический анализ кода в Idea способен указать на ситуацию, когда Spring не сможет найти нужный бин;2.
Этот способ становится еще более актуальным, когда у тебя ленивые бины, в таком случае ошибка 🪲 будет обнаружена даже не при старте приложения (во время поднятия контекста), а в runtime;3.
При написании тестов обычно стараются не поднимать ApplicationContext полностью, поэтому в тестах, которые проверяют конкретную логику, скорее всего будет лишь необходимый бин. Как следствие, даже хорошо написанные тесты не всегда выявят эту проблему.#Spring #Di
👍6❤4🔥2
Retry
🎯 Область применения:
ex: Проблемы с сетью при обращении к удаленному ресурсу.
ex: Мой сервис отправлял запрос по soap-api и получал в ответ id, после этот id использовался для получения результата первоначального запроса.
Для решения второй проблемы я использовал guava-retrying
🔗 link - содержит конфигурирование бинов и реализацию для абстрактного запроса
desc:
Время задержки между ретраями будет постепенно расти, пока (текущее число фибаначчи)*
#Retry
🎯 Область применения:
1.
Перечень ошибок, которые можно решить повторной отправкой запроса. ex: Проблемы с сетью при обращении к удаленному ресурсу.
2.
Удаленный сервис не умеет возвращать ответ сразу.ex: Мой сервис отправлял запрос по soap-api и получал в ответ id, после этот id использовался для получения результата первоначального запроса.
Для решения второй проблемы я использовал guava-retrying
🔗 link - содержит конфигурирование бинов и реализацию для абстрактного запроса
desc:
1.
Может использовать различные стратегии, я использовал числа Фибоначчи2. multiplier
— множитель для текущего числа 3. maximumTime
— максимальное время ожидание. Время задержки между ретраями будет постепенно расти, пока (текущее число фибаначчи)*
multiplier
> maximumTime, после время ожидания между ретраями будет равно maximumTime4. stopAfterAttempt()
— выбрасывает ошибку после указанного кол-ва попыток#Retry
👍6❤3🔥2
❓Как выбрать библиотеку❓
В посте выше я рассказывал, что использовал библиотеку для реализации работы с ретраями. В этот раз я хотел бы поделиться теми пунктами, на которые, на мой взгляд, стоит обратить внимание в этом деле.
🧾 Рецепт успешного выбора 🧾
#Lib #License #Github
В посте выше я рассказывал, что использовал библиотеку для реализации работы с ретраями. В этот раз я хотел бы поделиться теми пунктами, на которые, на мой взгляд, стоит обратить внимание в этом деле.
🧾 Рецепт успешного выбора 🧾
1. License
— нужно проверить ограничения. Некоторые лицензии несут в себе различные ограничения, например, ты можешь бесплатно ей пользоваться в своем пет проекте, но за использование в корп. продукте придется заплатить и т.д.2. Stars
— кол-во звезд на githab очень хорошо показывает репутацию продукта. Хорошая репа, говорит, что ты встретишь меньше багов и сложностей при подключении библиотеки к своему коду.3. Issues
— также как и звезды, может дать понять, с какими проблемами уже сталкивались другие разрабы и как они смогли их решить.4. Docs
— нужно обратить внимание на кол-во и кач-во документации. Наличие юзкейсов и примеров поможет быстрее разобраться, как пользоваться функционалом доступным в либе.5. Updates
— частота обновлений для некоторых библиотек, наверное, даже важнее всех остальных пунктов. Бессмысленно начинать использовать библиотеку, которую последний раз обновляли три года назад, а технология, с которой эта либа помогает взаимодействовать, за это время обросла новыми фичами.#Lib #License #Github
👍8❤3✍2
PS:
Если библиотека совсем свежая, то стоит еще заглянуть в mvn-repository и перейти в View All, где нужно проверить наличие ***--sources.jar и ***-javadoc.jar. Эти файлы очень помогут легче дебажить и ориентироваться в новом коде.
Если библиотека совсем свежая, то стоит еще заглянуть в mvn-repository и перейти в View All, где нужно проверить наличие ***--sources.jar и ***-javadoc.jar. Эти файлы очень помогут легче дебажить и ориентироваться в новом коде.
👍7❤3 2
Нашел для себя интересную настройку в Intellij Idea, которая позволяет немного кастомизировать то, что вы видите.
🎯 Область применения:
Настройка позволяет визуализировать некоторые группы символов как один.
ex: != ➡️ ≠, >= ➡️ ≥ и тд
PS: Чтобы быстро найти настройку, просто в поиске по настройкам ищем
stackoverflow-link
#intellijideafeature
🎯 Область применения:
Настройка позволяет визуализировать некоторые группы символов как один.
ex: != ➡️ ≠, >= ➡️ ≥ и тд
PS: Чтобы быстро найти настройку, просто в поиске по настройкам ищем
Enable ligatures
🔗 Полезные ссылки:stackoverflow-link
#intellijideafeature
👍7❤5🔥2👎1
This media is not supported in your browser
VIEW IN TELEGRAM
PlantUML — инструмент, позволяющий создавать диаграммы текстом.
Данный инструмент вместе с плагином для Intellij Idea дает возможность генерировать диаграммы в процессе их описания.
🎯 Область применения:
Написание Sequence и других диаграмм (поддерживает более 20 различных типов).
👍 Почему это удобно:
Идея сама предложит вам подключить
🔗 Полезные ссылки:
plantuml code example
PS: Аналитики будут вам завидовать))
PS1: Ниже прикрепил pdf документацию, где можно посмотреть на другие возможности библиотеки
#intellijideafeature #diagram #uml
Данный инструмент вместе с плагином для Intellij Idea дает возможность генерировать диаграммы в процессе их описания.
🎯 Область применения:
Написание Sequence и других диаграмм (поддерживает более 20 различных типов).
👍 Почему это удобно:
Идея сама предложит вам подключить
Markdown
, а GitLab и Сonfluence умеют визуализировать схемы.🔗 Полезные ссылки:
plantuml code example
PS: Аналитики будут вам завидовать))
PS1: Ниже прикрепил pdf документацию, где можно посмотреть на другие возможности библиотеки
#intellijideafeature #diagram #uml
❤9👍3🤩2
На днях посмотрел потрясающий ролик об индексах в PSQL, который дает возможность подсмотреть, как думает DBA.
🧾 Тезисы 🧾
🔗 Полезные ссылки 🔗
pg-utils — github проект с полезными sql запросами
Несколько примеров:
top_tables — поможет найти таблицы, которые нарушают п. 4
low_used_indexes — поможет определить первые в очередь на удаление индексы
indexes_with_nulls — поможет найти разреженные индексы, которые можно сжать, как описано в п. 6
PS: Нужно помнить, что в PSQL нет дефолтных индексов на FK.
PS1: Разреженные индексы — индексы, которые содержат большой процент NULL значений.
#psql #index #db
🧾 Тезисы 🧾
1.
Индекс — это узаконенный костыль 🩼;2.
Решение о создании какого-либо индекса нужно принимать, основываясь на статистике только с прода;3.
Колонки в индексе необходимо перечислять по их селективности в порядке ее убывания;4.
Размер, занимаемый всеми индексами по таблице, не должен превышать 50% от веса самой таблицы;5.
Чтобы индексы не разбухали, их необходимо периодически пересоздавать;6.
Если колонка, по которой необходимо создать индекс, разрежена, то частичный индекс с указанием NOT NULL поможет уменьшить необходимый ему объем памяти;7.
INCLUDE полезно использовать для реализации покрывающих индексов и при отсутствии необходимости делать выборку по колонке.🔗 Полезные ссылки 🔗
pg-utils — github проект с полезными sql запросами
Несколько примеров:
top_tables — поможет найти таблицы, которые нарушают п. 4
low_used_indexes — поможет определить первые в очередь на удаление индексы
indexes_with_nulls — поможет найти разреженные индексы, которые можно сжать, как описано в п. 6
PS: Нужно помнить, что в PSQL нет дефолтных индексов на FK.
PS1: Разреженные индексы — индексы, которые содержат большой процент NULL значений.
#psql #index #db
❤9👍4✍2
Долгое време модель памяти в Java оставалась для меня чем-то непостижимым. Я смотрел видео и читал статьи, но все это не принесло понимания. Но как-то раз, открыв VisualVM, картинка сложилась.
Тогда я и узнал, что...
1. Eden
содержит только что созданные объекты;2. Garbage Collector (GC)
периодически проверяет объекты, и, если объект все еще используется, то перемещает его в активную область Survivor;
3. Survivor
делится на S0 и S1
, которые чередуются в хранении выживших объектов при каждой проверке. Пока одна из областей содержит использующиеся объекты, вторая всегда остаётся пустой;4.
Объекты обладают счетчиком, который фиксирует, сколько раз GC
проверил объект*;5.
Когда счетчик достигнет порогового значения, GC
переместит объект в Old
, а не в Survivor
.*
Max Tenuring Threshold (MTT)
— кол-во проверок GC
-ом, которое должен пережить объект, чтобы оказаться в Old
.Histogram
(скрин 1) наглядно демонстрирует кол-во объектов, переживших n проверок GC;Чтобы лучше визуализировать работу GC, давайте рассмотрим скрин 2 и 3
1*
Запуск GC2*
Eden пустой после сборки мусора 3*
S0 также опустел, а S1 стал активным и принял все выжившие объекты из Eden и S0, за исключением 4*4*
Old пополнился новыми объектами, которые пережили MTT сборок мусораPS: Такая работа с
S0/S1
приводит к тому что:PS1:
Memory Size
зависит от архитектуры приложения и выполняющихся процессов. Алгоритм работы GC основывается на теории Слабой гипотезы о поколениях (или "Высокой детской смертности"), которая подразумевает, что объекты намного чаще умирают/перестают использоваться сразу после их создания.
Тем не менее, ваше приложение может, например, создать все необходимые объекты при старте и продолжать использовать их на протяжении всего времени. В таком случае запуски GC будут только потреблять ресурсы.
#jmm #heap #gc
@polyackov_ot
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤3🤯2
Всем-всем привет
Мой стиль подачи информации еще формируется, поэтому взгляд со стороны очень важен.
Обратная связь от друзей не всегда может быть честной, поэтому я спросил совет у бездушной машины 🙇🏻
Рекомендации и переписанный ботом пост можно посмотреть в комментариях
Как вам такие правки?
Есть ли что-то, что бездушная машина упустила?
🤖 🤖 🤖 🤖 🤖 🤖 🤖 🤖 🤖 🤖 🤖
Мой стиль подачи информации еще формируется, поэтому взгляд со стороны очень важен.
Обратная связь от друзей не всегда может быть честной, поэтому я спросил совет у бездушной машины 🙇🏻
Рекомендации и переписанный ботом пост можно посмотреть в комментариях
Как вам такие правки?
Есть ли что-то, что бездушная машина упустила?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤4🔥3🤩2
В прошедшую пятницу прошел ArchDays
Хотел бы поделиться своими мыслями и впечатлениями, а также тенденциями, которые уже давно волнуют архитектурное комьюнити
1️⃣ Диктатура VS Культура
Почти в каждом выступлении эта тема поднималась по несколько раз, но именно после доклада Петра Туголукова, кажется, все вопросы из зала были связаны с тем, как убедиться, что команды делают работу качественно, не косячат и не замалчивают проблемы. Здесь хочу сказать, что, когда я начинал свое погружение в архитектуру, я задавал такие же вопросы, и этот доклад еще раз помог мне провалидировать мысли и решения, к которым я пришел.
Во всех же вопросах из зала был общий базис в виде недоверия.
@polyackov_ot
Хотел бы поделиться своими мыслями и впечатлениями, а также тенденциями, которые уже давно волнуют архитектурное комьюнити
1️⃣ Диктатура VS Культура
Почти в каждом выступлении эта тема поднималась по несколько раз, но именно после доклада Петра Туголукова, кажется, все вопросы из зала были связаны с тем, как убедиться, что команды делают работу качественно, не косячат и не замалчивают проблемы. Здесь хочу сказать, что, когда я начинал свое погружение в архитектуру, я задавал такие же вопросы, и этот доклад еще раз помог мне провалидировать мысли и решения, к которым я пришел.
Во всех же вопросах из зала был общий базис в виде недоверия.
Недоверие к людям – следствие отсутствия понимания их принципов. Единая культура помогает нам с большей уверенностью полагаться на коллег и делегировать.#arch #archday
@polyackov_ot
❤3👍3✍2🔥2
2️⃣ Устаревание документации
Много вопросов было про то, как бороться с устареванием документации и архитектуры.
Как я понимаю, тенденция ведет нас к принципу "Архитектура as code". А раз это код, значит на него нужно писать Юнит тесты 😁 Их очень воодушевляющий и уже работающий прототип (github) представил в докладе Руслан Сафин.
Следующая неугасающая тенденция – единый язык (DDD). О нем на конференции также говорили много, но Евгений Хренов пошел дальше и представил всем в докладе свою простую и понятную методичку.
Единственный минус, это решение лишает возможности в кулачном поединке с ТехЛидом дать своему детищу имя
Хоть в начале все было очень тухло, и организаторы явно оплошали с таймингами докладов, но конец последней лекции я встретил с восторженным ощущением приятно проведенного времени.
После этого мои мозги работали в режими 50 идей в секунду, генерируя от идеи того, что можно улучшить в текущем проекте, до идей собственного проекта и желания поконтрибьютить в опенсорс))
Буду рад вашим лайкам!
#arch #archday
@polyackov_ot
Много вопросов было про то, как бороться с устареванием документации и архитектуры.
Как я понимаю, тенденция ведет нас к принципу "Архитектура as code". А раз это код, значит на него нужно писать Юнит тесты 😁 Их очень воодушевляющий и уже работающий прототип (github) представил в докладе Руслан Сафин.
Это решение встраивается в GitLab-pipeline и сравнивает application.yaml, yaml конфигурацию K8S и plantUML диаграмму.3️⃣ Единый Язык
Следующая неугасающая тенденция – единый язык (DDD). О нем на конференции также говорили много, но Евгений Хренов пошел дальше и представил всем в докладе свою простую и понятную методичку.
Важно не только качество конкретного имени, но и системность формирования всех именВижу большую ценность, что благодаря предложенному Женей соглашению, можно не задумываться, как выбирать имена для сервисов, сущностей кубера, REST api, Kafka topics и баз данных. Таким соглашением легко могут пользоваться все команды независимо.
Единственный минус, это решение лишает возможности в кулачном поединке с ТехЛидом дать своему детищу имя
super-puper-service-2000
ВердиктХоть в начале все было очень тухло, и организаторы явно оплошали с таймингами докладов, но конец последней лекции я встретил с восторженным ощущением приятно проведенного времени.
После этого мои мозги работали в режими 50 идей в секунду, генерируя от идеи того, что можно улучшить в текущем проекте, до идей собственного проекта и желания поконтрибьютить в опенсорс))
Буду рад вашим лайкам!
#arch #archday
@polyackov_ot
❤4✍3👍3🤔2😢1
Всем привет
Знакомьтесь — это разработчик по имени Пол.
Пол — senior, junior, middle, principle, lead, который возможно еще что-то не знает или, наоборот, так давно в разработке, что уже что-то забыл. Именно к нему мы будем обращаться в попытке что-то объяснить, а, заодно, и разобраться самим.
Пол — это еще и сообщество, которое поможет подсветить пробелы, провести интересный диалог и поделиться личным опытом.
Добро пожаловать!
Знакомьтесь — это разработчик по имени Пол.
Пол — senior, junior, middle, principle, lead, который возможно еще что-то не знает или, наоборот, так давно в разработке, что уже что-то забыл. Именно к нему мы будем обращаться в попытке что-то объяснить, а, заодно, и разобраться самим.
Пол — это еще и сообщество, которое поможет подсветить пробелы, провести интересный диалог и поделиться личным опытом.
Добро пожаловать!
🔥11❤3💯3
Привет, Пол — это мой первый опыт публичных выступлений.
Познакомься, это 15 новых лиц, которые присоединились к нашему комьюнити. И которые готовы вместе с тобой, мной и остальными подписчиками, все-таки, узнать что такое Java)
40 человек в пике, и 15 в онлайне после 5,5 часов. Звучит мощно, и это было действительно супер!
У нас не было плана, но была идея, и, чтобы с чего-то начать и растопить лёд, я спросил следующее:
Эти вопросы помогли мне взаимодействовать и делиться более релевантной для аудитории информацией.
Мы начали от базовых вопросов, затем перешли к TDD, затронули историю развития it и как это привело нас к микросервисам. А какие же микросервисы без DDD, поэтому обсудили еще и его.
Дополнительно попытались разобраться, что такое аналитика к задаче.
Обсудили наболевшее о том, как учиться, и как не выгорать.
Немного поговорили про то, кто такие архитекторы и стекхолдеры.
В самом конце даже успели на примере реальной задачи посмотреть лучшие практики работы с git.
Кажется, вышло продуктивно и полезно. Рад, что получился живой разговор на основе живого интереса. Уверен, что нужно продолжать и дальше, а всем присутствующим большое спасибо
Познакомься, это 15 новых лиц, которые присоединились к нашему комьюнити. И которые готовы вместе с тобой, мной и остальными подписчиками, все-таки, узнать что такое Java)
40 человек в пике, и 15 в онлайне после 5,5 часов. Звучит мощно, и это было действительно супер!
У нас не было плана, но была идея, и, чтобы с чего-то начать и растопить лёд, я спросил следующее:
1) Как можно к вам обращаться?
2) Какой опыт в Java от 0 до 3 ?
3) Что ожидаете от этой встречи?
Эти вопросы помогли мне взаимодействовать и делиться более релевантной для аудитории информацией.
Мы начали от базовых вопросов, затем перешли к TDD, затронули историю развития it и как это привело нас к микросервисам. А какие же микросервисы без DDD, поэтому обсудили еще и его.
Дополнительно попытались разобраться, что такое аналитика к задаче.
Обсудили наболевшее о том, как учиться, и как не выгорать.
Немного поговорили про то, кто такие архитекторы и стекхолдеры.
В самом конце даже успели на примере реальной задачи посмотреть лучшие практики работы с git.
Кажется, вышло продуктивно и полезно. Рад, что получился живой разговор на основе живого интереса. Уверен, что нужно продолжать и дальше, а всем присутствующим большое спасибо
👍10🔥5❤2🤩2👏1
Привет Пол (и привет всем)
Хочу поделиться недавним комментом из Merge Request, который будет интересен и тебе.
Кратко опишу задачу:
Мне нужно было слушать топик в Kafka, где могут быть сообщения, которые моей системе не нужно обрабатывать.
Для этой задачи я реализовал фильтр, давай посмотрим мой код ниже:
На самом деле весь код читать и понимать не нужно, нам интересен фидбек к конкретной строке:
Для начала давай разберемся, что же здесь происходит:
🔸 при конвертации в
🔸 т.к. количество вариантов
Я так и поступил.
Пол и все-все-все, что думаете, стоит ли так помогать GC?
Также мы будем рады увидеть в комментах другие способы оптимизации работы с памятью.
PS: Хотел бы поделиться ссылкой, в ней довольно подробно и с примерами уже описаны оптимизации и String Pool. Думаю, вы сможете за 10-15 минут получить неплохой базис, и, при необходимости, погрузиться в эту тему глубже.
#String
Хочу поделиться недавним комментом из Merge Request, который будет интересен и тебе.
Кратко опишу задачу:
Мне нужно было слушать топик в Kafka, где могут быть сообщения, которые моей системе не нужно обрабатывать.
Для этой задачи я реализовал фильтр, давай посмотрим мой код ниже:
@Bean
public ConcurrentKafkaListenerContainerFactory<String, String> filterNonCurrentSourceSystemResponse(ConsumerFactory<String, String> consumerFactory) {
var factory = new ConcurrentKafkaListenerContainerFactory<String, String>();
factory.setConsumerFactory(consumerFactory);
factory.setRecordFilterStrategy(record -> {
var sourceSystemHeader = record.headers().lastHeader(KafkaConstants.SOURCE_SYSTEM_HEADER);
var sourceSystemHeaderValue = new String(sourceSystemHeader.value());
return !SourceSystemName.isCurrentSourceSystem(sourceSystemHeaderValue);
});
return factory;
}
На самом деле весь код читать и понимать не нужно, нам интересен фидбек к конкретной строке:
new String(sourceSystemHeader.value());
Для начала давай разберемся, что же здесь происходит:
🔸 sourceSystemHeader.value()
возвращает byte[]
🔸 при конвертации в
String
каждый раз будет создаваться новый объект в heap🔸 т.к. количество вариантов
SOURCE_SYSTEM_HEADER
сильно ограничено, возможно, для оптимизации работы с памятью стоит добавить интернирование в String Pool
Я так и поступил.
Пол и все-все-все, что думаете, стоит ли так помогать GC?
Также мы будем рады увидеть в комментах другие способы оптимизации работы с памятью.
PS: Хотел бы поделиться ссылкой, в ней довольно подробно и с примерами уже описаны оптимизации и String Pool. Думаю, вы сможете за 10-15 минут получить неплохой базис, и, при необходимости, погрузиться в эту тему глубже.
#String
🔥6✍2❤2👍2🤔1🗿1