Java Portal | Программирование
13.1K subscribers
993 photos
73 videos
32 files
802 links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
Download Telegram
Учись проектировать через объектно-ориентированные паттерны на Java.

Интерактивный курс от профессора Computer Science Марка Махони.

Освоишь: Composite Pattern, Observer Pattern, Visitor Pattern и другие.

Интерактивный формат, всё по делу:

Курс → https://freecodecamp.org/news/object-oriented-design-patterns-with-java/

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
6🔥4
Инструменты для проектирования архитектуры ПО

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

Инструменты моделирования:

• Enterprise Architect
• Archi
• Structurizr
• Carbide
• StarUML
• Aplas
• GenMyModel
• Gaphor
• Archipeg
• Astah
• Mood

Code-based инструменты

• PlantUML
• Structurizr
• Ilograph
• Graphviz
• Mermaid
• Diagrams

Автоматизированные инструменты:

• Brainboard
• Hyperglance
• Hava
• Archium

Инструменты для создания диаграмм:

• Visio
• Lucidchart
• [Draw.io](http://draw.io)
• Cloudcraft
• isoflow
• Visual Paradigm
• Cacoo
• Cloudviz
• Excalidraw
• CloudSkew
• Figma
• Whimsical
• Miro
• Mural
• Sketch


Полный список: softwarearchitecture.tools

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
6
Алгоритмы Bloom Filter - быстрый поиск при минимальном потреблении памяти

🔸Во многих системах поиска, хранения и обеспечения безопасности данных проверка принадлежности элемента к большому множеству это серьёзная задача. Алгоритм Bloom Filter предлагает эффективное решение этой проблемы: он использует компактные структуры данных и позволяет быстро проверять наличие элемента без необходимости хранить всё множество целиком.

🔸В основе Bloom Filter - битовый массив и несколько хеш-функций. При добавлении нового значения хеш-функции определяют позиции в массиве и устанавливают соответствующие биты в 1. При проверке, если все указанные позиции уже установлены в 1, существует высокая вероятность того, что элемент присутствует во множестве. Этот подход применяется в поисковых системах, кэшах вроде Redis, системах фильтрации спама и сетевых фильтрах.

🔸Если вам нужен эффективный способ для быстрой проверки принадлежности к большим наборам данных, Bloom Filter это лёгкое и высокопроизводительное решение.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍75
Карточки про синхронизаторы Java

Синхронизаторы позволяют управлять потоками более гибко, мощно и безопасно, чем низкоуровневые и примитивные synchronized, wait, notify и join

Примеры использования:

🔸Ограничить количество одновременных действий
🔸Дождаться завершения нескольких потоков
🔸Запустить все потоки одновременно
🔸Обменяться данными между потоками

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
12👍4🔥3
Привет. Вот тебе самые топовые каналы по IT!

⚙️ Free Znanija (IT) — Самая огромная коллекция платных курсов, которые можно скачать бесплатно;

👩‍💻 IT Books — Самая огромная библиотека книг;

💻 Hacking & InfoSec Base — Крутой блог белого хакера;

🛡 CyberGuard — Всё про ИБ;

🤔 ИБ Вакансии— Всё, чтобы найти работу в ИБ;

👩‍💻 linux administration — Всё про Линукс;

👩‍💻 Программистика — Python, python и ещё раз python;

👩‍💻 GameDev Base — Всё про GameDev;

🖥 Coding Base — Мемы, полезные репозитории и инструменты, а так же софт:

😆 //code — Самые топовые мемы по IT:

А так же крутой блог админа: Rahol Jey | тг вайб
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
Как обработать 1 миллион API-запросов в минуту

1. Балансировка нагрузки

Проблема:
Один сервер не выдерживает 1M запросов/мин: перегрузка CPU и памяти, начинается дроп запросов.

Решение:

- Использовать балансировщик нагрузки (NGINX, HAProxy, AWS ELB) для распределения трафика между множеством серверов
- Добавить проверки состояния , чтобы не направлять трафик на нерабочие инстансы
- Настроить авто-масштабирование, чтобы запускать новые инстансы при всплеске трафика

2. Кеширование

Проблема:
Каждый запрос бьет по базе → база становится узким местом (исчерпание соединений, медленные запросы).

Решение:

Добавить уровни кеширования:

- CDN для статических ресурсов (изображения, CSS, JS)
- Redis/Memcached для повторяющихся запросов
- Настроить правила инвалидации кеша, чтобы данные оставались актуальными

> Вместо 1M запросов к базе, возможно, только 100K дойдут после кеширования.

3. Ограничение частоты запросов

Проблема:
Всплеск активности (например, от ботов или злоумышленников) перегружает инфраструктуру → хорошие пользователи получают 503.

Решение:

- Алгоритмы Token Bucket / Leaky Bucket: позволяют короткие всплески, но сохраняют стабильный поток
- Разные лимиты для аутентифицированных и анонимных пользователей
- Возвращать 429 Too Many Requests — корректно и информативно

> Защищает инфраструктуру: один плохой пользователь не портит всё остальным.

4. Асинхронная обработка

Проблема:
Некоторые запросы тяжелые (обработка файлов, аналитика, отправка писем). Если делать их синхронно — ответ замедляется.

Решение:

- Выносить тяжёлые задачи в очередь (Kafka, RabbitMQ, SQS)
- Отвечать сразу с кодом 202 Accepted, обработку запускать в фоне
- Воркеры обрабатывают очередь и выполняют задачи

> Пользователи получают быстрый ответ, тяжёлая работа происходит «за кулисами».

5. Мониторинг и обратное давление

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

Решение:

- Мониторить глубину очередей, задержки при доступе к БД, hit rate кеша
- Применять backpressure: замедлять запросы или отбрасывать нагрузку при приближении к лимитам
- Настроить алерты: Prometheus/Grafana, Datadog, New Relic

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
7👀3👍2
Аннотации в конструкторах Java . декларации и типы

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

@Inject
MyService(FooProcessor processor, BarLogger logger) {
this.processor = processor;
this.logger = logger;
}


В этом примере MyService — это конструктор некоего сервиса, и он помечен аннотацией @Inject. Эта аннотация сообщает DI-библиотеке, что нужно использовать именно этот конструктор для создания экземпляра сервиса.

🔸Аннотации деклараций и конструкторы

В этом посте нас не интересуют сами DI-библиотеки — важно лишь то, что аннотацию @Inject можно ставить на уровне декларации конструктора.

Если взглянуть на определение аннотации @Inject, то оно будет примерно таким:

@Target({METHOD, CONSTRUCTOR, FIELD})
@Retention(RUNTIME)
public @interface Inject {}


Здесь в @Target указано CONSTRUCTOR, что означает, что аннотацию можно применять к конструкторам. Так как @Inject применяется к декларациям, её называют аннотацией декларации

🔸Аннотации типов и конструкторы

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

Пример — создадим следующую аннотацию:

@Target(ElementType.TYPE_USE)
@Retention(RetentionPolicy.RUNTIME)
@interface T {}


Это аннотация @T, которая применяется только к типам (TYPE_USE). Также указана политика RUNTIME, чтобы можно было получить доступ к аннотации во время выполнения.

Теперь применим её к конструктору:

static class Subject {
public @T Subject() {}
}


Код компилируется без ошибок. Обрати внимание: класс Subjectвложенный (static class), не inner, поэтому используется модификатор static.

🔸Извлечение аннотации во время выполнения

Для полноты картины — пример, как извлечь аннотацию типа с конструктора во время выполнения:

void main() throws NoSuchMethodException {
final Class<?> type = Subject.class;

final Constructor<?> constructor = type.getDeclaredConstructor();

final AnnotatedType annotatedType = constructor.getAnnotatedReturnType();

final Annotation[] typeAnnotations = annotatedType.getDeclaredAnnotations();

print("Type annotations are:", typeAnnotations);
}

private void print(String msg, Annotation[] annotations) {
System.out.println(msg);
for (Annotation annotation : annotations) {
System.out.println(annotation);
}
}


Пошагово:

1. Получаем объект Constructor для конструктора класса Subject
2. Через getAnnotatedReturnType() получаем AnnotatedType, представляющий тип возвращаемого значения конструктора
3. Из AnnotatedType извлекаем все аннотации типа
4. Печатаем аннотации

Пример вывода:

Type annotations are:
@TypeAnnotations2.T()


То есть конструктор действительно аннотирован аннотацией типа @T.

В языке программирования Java тело конструктора не должно содержать операторов return с возвращаемым значением. Однако, подобно методу, возвращающему, скажем, объект Foo, конструктор тоже возвращает значение. Результатом вызова конструктора (если он завершается без исключений) является новый экземпляр объекта, тип которого — это тип класса, в котором объявлен данный конструктор.

Таким образом, в объявлении конструктора присутствует использование типа — типа создаваемого объекта. А в Java можно аннотировать любое использование типа. Такие аннотации называются аннотациями типа

Исходный код, использованный в этом посте, можно найти в этом [Gist]

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
4🔥2🤔1
Если вам трудно дается java, это проблема навыков.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22😁91
GIT Шпаргалка

🔸Настройка репозитория

git init                         # Инициализировать репозиторий
git clone <url> # Клонировать репозиторий
git config --global user.name "Name" # Установить имя пользователя
git config --global user.email "email" # Установить email


🔸Базовые команды

git status                      # Проверить статус
git add <file> # Проиндексировать файл
git add . # Проиндексировать все файлы
git commit -m "msg" # Зафиксировать изменения
git commit -am "msg" # Индексация + фиксация
git log # История коммитов
git diff # Показать изменения


🔸Работа с ветками

git branch                     # Показать список веток
git branch -a # Показать все ветки (вкл. удалённые)
git branch <name> # Создать ветку
git checkout <branch> # Переключиться на ветку
git checkout -b <name> # Создать и переключиться на ветку
git merge <branch> # Слить ветку
git branch -d <name> # Удалить ветку


🔸Удалённые репозитории

git remote                     # Показать список удалённых
git remote -v # Показать URL-адреса удалённых
git push <remote> <branch> # Отправить изменения
git pull <remote> <branch> # Получить изменения
git fetch # Забрать изменения без слияния


🔸Отмена изменений

git reset <file>              # Убрать файл из индекса
git reset --hard # Откат к последнему коммиту
git checkout <file> # Отменить изменения в файле
git revert <commit> # Откатить коммит (реверт)


🔸Продвинутые команды

git stash                     # Сохранить изменения во временное хранилище
git stash pop # Применить stash
git rebase <branch> # Перебазировать ветку
git tag <name> # Создать тег
git log --oneline # Краткий лог коммитов


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍7