Пол — это Java
153 subscribers
13 photos
2 videos
2 files
26 links
Канал, в котором живет вымышленный на основе реальных событий разработчик Пол, и вместе с ним мы пробуем узнать, что такое Java и не только👨🏻‍💻

@polyackov_ot
Download Telegram
Ещё несколько слов о Field Injection:

1.
Имеет неоспоримое приемущество над первым (from Constructor) способом, т.к. статический анализ кода в Idea способен указать на ситуацию, когда Spring не сможет найти нужный бин;

2. Этот способ становится еще более актуальным, когда у тебя ленивые бины, в таком случае ошибка 🪲 будет обнаружена даже не при старте приложения (во время поднятия контекста), а в runtime;

3. При написании тестов обычно стараются не поднимать ApplicationContext полностью, поэтому в тестах, которые проверяют конкретную логику, скорее всего будет лишь необходимый бин. Как следствие, даже хорошо написанные тесты не всегда выявят эту проблему.

#Spring #Di
👍64🔥2
Retry

🎯 Область применения:
1. Перечень ошибок, которые можно решить повторной отправкой запроса.
ex: Проблемы с сетью при обращении к удаленному ресурсу.
2. Удаленный сервис не умеет возвращать ответ сразу.
ex: Мой сервис отправлял запрос по soap-api и получал в ответ id, после этот id использовался для получения результата первоначального запроса.

Для решения второй проблемы я использовал guava-retrying
🔗 link - содержит конфигурирование бинов и реализацию для абстрактного запроса

desc:
1. Может использовать различные стратегии, я использовал числа Фибоначчи
2. multiplier — множитель для текущего числа
3. maximumTime — максимальное время ожидание.
Время задержки между ретраями будет постепенно расти, пока (текущее число фибаначчи)*multiplier > maximumTime, после время ожидания между ретраями будет равно maximumTime
4. stopAfterAttempt() — выбрасывает ошибку после указанного кол-ва попыток

#Retry
👍63🔥2
Как выбрать библиотеку

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

🧾 Рецепт успешного выбора 🧾
1. License — нужно проверить ограничения. Некоторые лицензии несут в себе различные ограничения, например, ты можешь бесплатно ей пользоваться в своем пет проекте, но за использование в корп. продукте придется заплатить и т.д.
2. Stars — кол-во звезд на githab очень хорошо показывает репутацию продукта. Хорошая репа, говорит, что ты встретишь меньше багов и сложностей при подключении библиотеки к своему коду.
3. Issues — также как и звезды, может дать понять, с какими проблемами уже сталкивались другие разрабы и как они смогли их решить.
4. Docs — нужно обратить внимание на кол-во и кач-во документации. Наличие юзкейсов и примеров поможет быстрее разобраться, как пользоваться функционалом доступным в либе.
5. Updates — частота обновлений для некоторых библиотек, наверное, даже важнее всех остальных пунктов. Бессмысленно начинать использовать библиотеку, которую последний раз обновляли три года назад, а технология, с которой эта либа помогает взаимодействовать, за это время обросла новыми фичами.

#Lib #License #Github
👍832
PS:
Если библиотека совсем свежая, то стоит еще заглянуть в mvn-repository и перейти в View All, где нужно проверить наличие ***--sources.jar и ***-javadoc.jar. Эти файлы очень помогут легче дебажить и ориентироваться в новом коде.
👍732
Нашел для себя интересную настройку в Intellij Idea, которая позволяет немного кастомизировать то, что вы видите.

🎯 Область применения:
Настройка позволяет визуализировать некоторые группы символов как один.

ex: != ➡️ ≠, >= ➡️ ≥ и тд

PS: Чтобы быстро найти настройку, просто в поиске по настройкам ищем Enable ligatures

🔗 Полезные ссылки:
stackoverflow-link

#intellijideafeature
👍75🔥2👎1
This media is not supported in your browser
VIEW IN TELEGRAM
PlantUML — инструмент, позволяющий создавать диаграммы текстом.

Данный инструмент вместе с плагином для Intellij Idea дает возможность генерировать диаграммы в процессе их описания.

🎯 Область применения:
Написание Sequence и других диаграмм (поддерживает более 20 различных типов).

👍 Почему это удобно:
Идея сама предложит вам подключить Markdown, а GitLab и Сonfluence умеют визуализировать схемы.

🔗 Полезные ссылки:
plantuml code example

PS: Аналитики будут вам завидовать))
PS1: Ниже прикрепил pdf документацию, где можно посмотреть на другие возможности библиотеки

#intellijideafeature #diagram #uml
9👍3🤩2
PlantUML_Language_Reference_Guide_ru.pdf
4.3 MB
👍61
На днях посмотрел потрясающий ролик об индексах в PSQL, который дает возможность подсмотреть, как думает DBA.

🧾 Тезисы 🧾
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👍42
Как работает теория поколений в Heap

Долгое време модель памяти в 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* Запуск GC
2* 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
👍73🤯2
heap.pdf
3.1 MB
Краткая выжимка и иллюстрации также доступны в pdf
7👍4
Channel name was changed to «Пол — это Java»
Всем-всем привет

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

Обратная связь от друзей не всегда может быть честной, поэтому я спросил совет у бездушной машины 🙇🏻

Рекомендации и переписанный ботом пост можно посмотреть в комментариях

Как вам такие правки?
Есть ли что-то, что бездушная машина упустила?

🤖🤖🤖🤖🤖🤖🤖🤖🤖🤖🤖
Please open Telegram to view this post
VIEW IN TELEGRAM
👍54🔥3🤩2
В прошедшую пятницу прошел ArchDays
Хотел бы поделиться своими мыслями и впечатлениями, а также тенденциями, которые уже давно волнуют архитектурное комьюнити

1️⃣ Диктатура VS Культура
Почти в каждом выступлении эта тема поднималась по несколько раз, но именно после доклада Петра Туголукова, кажется, все вопросы из зала были связаны с тем, как убедиться, что команды делают работу качественно, не косячат и не замалчивают проблемы. Здесь хочу сказать, что, когда я начинал свое погружение в архитектуру, я задавал такие же вопросы, и этот доклад еще раз помог мне провалидировать мысли и решения, к которым я пришел.
Во всех же вопросах из зала был общий базис в виде недоверия.

Недоверие к людям – следствие отсутствия понимания их принципов. Единая культура помогает нам с большей уверенностью полагаться на коллег и делегировать.

#arch #archday
@polyackov_ot
3👍32🔥2
2️⃣ Устаревание документации
Много вопросов было про то, как бороться с устареванием документации и архитектуры.
Как я понимаю, тенденция ведет нас к принципу "Архитектура 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
43👍3🤔2😢1
Всем привет
Знакомьтесь — это разработчик по имени Пол.
Пол — senior, junior, middle, principle, lead, который возможно еще что-то не знает или, наоборот, так давно в разработке, что уже что-то забыл. Именно к нему мы будем обращаться в попытке что-то объяснить, а, заодно, и разобраться самим.

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

Добро пожаловать!
🔥113💯3
😱62🤩2
Привет, Пол — это мой первый опыт публичных выступлений.

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

40 человек в пике, и 15 в онлайне после 5,5 часов. Звучит мощно, и это было действительно супер!

У нас не было плана, но была идея, и, чтобы с чего-то начать и растопить лёд, я спросил следующее:
1) Как можно к вам обращаться?
2) Какой опыт в Java от 0 до 3 ?
3) Что ожидаете от этой встречи?

Эти вопросы помогли мне взаимодействовать и делиться более релевантной для аудитории информацией.

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

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

Кажется, вышло продуктивно и полезно. Рад, что получился живой разговор на основе живого интереса. Уверен, что нужно продолжать и дальше, а всем присутствующим большое спасибо
👍10🔥52🤩2👏1
Привет Пол (и привет всем)
Хочу поделиться недавним комментом из 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
🔥622👍2🤔1🗿1