java_iibrary | Unsorted

Telegram-канал java_iibrary - Java Portal | Программирование

12073

Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика Связь: @devmangx РКН: https://clck.ru/3H4WUg

Subscribe to a channel

Java Portal | Программирование

Как опытный Java-разработчик/бэкенд-инженер, ты должен разбираться в отказоустойчивости и паттерне Circuit Breaker. Вот сценарий ненадёжного платёжного шлюза 💳 , чтобы проверить знания кандидата:

Сценарий:

Твоё приложение интегрируется со сторонним платёжным API. При пиковых нагрузках этот API стабильно даёт сбой примерно в 2% запросов. Это приводит к неудачным оплатам и ухудшает пользовательский опыт.

Вопрос:

Как ты спроектируешь интеграцию так, чтобы она была устойчива к этим сбоям и при этом сохраняла хороший UX? Объясни, какие именно паттерны (например, Circuit Breaker или Retry с экспоненциальной задержкой) ты бы применил и почему. Как бы ты обработал возможные дубликаты транзакций, возникающие из-за повторных запросов?

→ Что я оцениваю:

Понимание паттернов устойчивости и отказоустойчивости. Кандидат должен уметь объяснить такие концепции, как повторные запросы, Circuit Breaker (например, с использованием Resilience4j), fallback-механизмы, а также критическую важность идемпотентности при проектировании интеграций с платёжными системами.

В примере показано как реализовать Resilience4j с fallback-методом в Spring Boot

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Принципы проектирования программного обеспечения 👇

[1.] KISS (Keep It Simple, Stupid)
▶Программное обеспечение должно быть максимально простым.
▶Используйте понятный и лаконичный код, избегайте излишней сложности и сосредотачивайтесь на основных функциях.

[2.] DRY (Don't Repeat Yourself)
▶Код не должен дублироваться.
▶Используйте функции и классы для объединения общего кода.
▶Применяйте переменные и константы для хранения значений, которые используются в нескольких местах.

[3.] YAGNI (You Ain't Gonna Need It)
▶Не добавляйте в программное обеспечение функции, которые не нужны.
▶Поддерживайте простоту и удобство сопровождения.

[4.] SOLID
▶ Принцип единственной ответственности – класс должен выполнять только одну задачу.
▶ Принцип открытости/закрытости – классы должны быть открыты для расширения, но закрыты для изменения.
▶ Принцип подстановки Барбары Лисков – объекты дочернего класса должны заменять объекты базового класса без нарушения функциональности.
▶Принцип разделения интерфейса – клиенты не должны зависеть от методов, которые они не используют.
▶Принцип инверсии зависимостей – зависимости должны внедряться в класс, а не быть жёстко закодированными.

[5.] Принцип наименьшего удивления**
▶ Разрабатывайте программное обеспечение так, чтобы оно соответствовало ожиданиям пользователя.
▶ Используйте знакомую терминологию и соглашения, предоставляйте понятные инструкции.
▶ Применяйте четкие и лаконичные сообщения об ошибках.

[6.] Принцип модульности**
▶ Проектируйте программное обеспечение как набор независимых модулей.
▶ Это упрощает понимание, сопровождение и тестирование кода.

[7.] Принцип абстракции
▶ Скрывайте детали реализации от пользователя.
▶ Это делает программное обеспечение более понятным и удобным.

[8.] Принцип инкапсуляции
▶Программное обеспечение должно скрывать внутреннее состояние объекта от внешнего мира.
▶Это повышает устойчивость и удобство сопровождения.

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

[10.] Принцип низкой связности и высокой когезии
▶Связность – это степень зависимости элементов модуля друг от друга.
▶Модуль с низкой связностью имеет мало зависимостей, и его элементы слабо зависят друг от друга.

❗ Когезия – это степень, с которой элементы модуля относятся к одной цели.
▶ Модуль с высокой когезией имеет одну четко определенную задачу, и все его элементы связаны с её выполнением.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Я только что наткнулся на этот репозиторий — и он отличный.
Хотите самостоятельно хостить OAuth 2.0-аутентификацию и не зависеть от Auth0, Clerk, Firebase или Supabase?
Тогда OpenAuth — именно то, что вам нужно.

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

Он работает с любым фреймворком и на любой платформе, а также совместим с любым OAuth 2.0-клиентом.

Главные возможности:

Полная поддержка OAuth 2.0 — его может использовать любой OAuth-клиент.
Гибкое развёртывание: Node.js, Bun, AWS Lambda или Cloudflare Workers.
Нативная поддержка Google, GitHub и других провайдеров, а также локальных сценариев: email и пароль, PIN-код и другие.
Готовый интерфейс, который можно полностью настроить или заменить собственным.
Полный контроль над управлением пользователями: через простой callback success можно реализовать собственную логику создания и поиска пользователей.
Лёгкое хранилище на основе KV, включая Cloudflare KV и DynamoDB.
Типобезопасный API и простая интеграция.


Проект создан командой SST. Сейчас он находится в бета-версии, но уже набрал более 7 000 звёзд на GitHub и активно развивается.

OpenAuth отлично подойдёт тем, кому нужны полный контроль над данными, отсутствие vendor lock-in, предсказуемые расходы при масштабировании и единая аутентификация для нескольких приложений.
Стоит сохранить, особенно если вы разрабатываете SaaS.

https://github.com/anomalyco/openauth

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Сис. дизайн: Балансировщик нагрузки

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

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

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

- Если сервер 1 выйдет из строя, весь трафик будет перенаправлен на сервер 2. Это не позволит сайту стать недоступным.
- Если трафик сайта резко вырастет и двух серверов окажется недостаточно, балансировщик нагрузки позволит корректно решить эту проблему. В пул можно добавить дополнительные веб-серверы, после чего балансировщик автоматически начнёт направлять запросы и на них.

Вертикальное и горизонтальное масштабирование

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

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

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

Ограничения вертикального масштабирования

- Невозможно бесконечно добавлять CPU и память одному серверу.
- Отсутствует отказоустойчивость. Если сервер выходит из строя, сайт или приложение полностью перестаёт работать.

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

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

Эта проблема решается с помощью горизонтального масштабирования и балансировщика нагрузки.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Java Streams: limit(n) превращает бесконечный поток в конечный.

✅ Полезно при работе со Stream.iterate() / generate() — они могут создавать бесконечные потоки
✅ limit(5) означает: «взять первые 5 элементов и остановиться»
✅ Отлично подходит для выборки данных или получения первых N значений

#Java #Streams

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Databasement — это инструмент для управления резервными копиями баз данных через self-hosted веб-интерфейс.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Системный дизайн: Архитектура с одним сервером

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

Обычно всё начинается с простого варианта: все компоненты работают на одном сервере.

Посмотрим, как проходит запрос:
> Пользователь обращается к api.mysite.com через веб-приложение или мобильное приложение.
> DNS преобразует доменное имя в IP-адрес 27.220.30.232.
> Запрос поступает на единственный веб-сервер.
> Сервер выполняет всё самостоятельно:
обрабатывает API-запрос;
выполняет бизнес-логику;
обращается к базе данных.
> Сервер отправляет пользователю HTML-страницу или JSON-ответ для дальнейшего отображения.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

> 💡 Java: Тестируйте граничные случаи: null, пустые коллекции и предельные значения — именно там чаще всего скрываются баги.

✅ Одних тестов счастливого пути недостаточно — они не помогут выявить NullPointerException при отсутствии входных данных.

✅ Пустые списки и коллекции с одним элементом нередко ведут себя иначе, чем коллекции с «обычными» данными.

✅ Явные тесты для null, пустых коллекций, а также минимальных и максимальных значений документируют ожидаемое поведение.

#Testing

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Архитектура Docker

Если вы только начинаете работать с Docker, эта схема может показаться сложной.

Но на самом деле всё устроено довольно просто.

Вы вводите команду, например:

docker run nginx


Docker Client отправляет эту команду Docker Daemon, который выполняет всю основную работу в фоновом режиме.

Если нужного образа (Image) еще нет на вашем компьютере, Docker загружает его из Docker Registry, например из Docker Hub.

После того как образ становится доступен локально, Docker создает контейнер (Container) — запущенный экземпляр этого образа.

Представьте это так:

- Image (образ) = архитектурный проект дома.
- Container (контейнер) = настоящий дом, построенный по этому проекту.

Именно так выглядит базовый поток работы Docker:

Вы
│
▼
Docker Client
│
▼
Docker Daemon
│
▼
Docker Image
│
▼
Docker Container


Когда вы поймете эту последовательность, устройство Docker станет гораздо проще и понятнее.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Создавайте первоклассную документацию для своего API или проекта.

Starlight предлагает всё необходимое: высокую скорость благодаря Astro, встроенную оптимизацию для SEO, доступность и поиск, а также поддержку Markdown, MDX и нескольких языков.

→ http://starlight.astro.build/es

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Масштабирование базы данных и стратегии шардинга — простое объяснение с иллюстрациями

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

1. Горизонтальное масштабирование (Horizontal Scaling)

Добавление новых серверов для распределения нагрузки и увеличения общей производительности без перегрузки одного сервера.

2. Вертикальное масштабирование (Vertical Scaling)

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

3. Стратегии партиционирования (Partition Strategies)

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

4. Шардинг по диапазонам (Range-Based Sharding)

Данные распределяются между шардами по диапазонам значений (например, по цене, дате или идентификатору), что ускоряет поиск по таким полям.

5. Равномерное распределение данных (Even Distribution)

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

6. Неравномерное распределение данных (Uneven Distribution)

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

7. Шардинг по ключу (Key-Based Sharding)

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

8. Масштабирование операций чтения (Scaling Reads)

Создание нескольких реплик базы данных только для чтения (Read Replicas), чтобы обрабатывать большое количество запросов и снизить нагрузку на основную базу данных.

9. Монолитная база данных vs шардинг (Monolith vs Sharding)

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

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

👉 Java Portal

Читать полностью…

Java Portal | Программирование

В PostgreSQL varchar(255) ведёт себя так же, как столбец типа text; единственное отличие — у varchar есть ограничение на длину. Тип varchar(n) всегда работал именно так. Если вы видите в PostgreSQL столбец varchar(255), то зачастую это потому, что разработчик сначала работал с другой СУБД и перенёс свои прежние представления о том, как должен работать varchar(n).

Когда использовать text, а когда varchar?
Если есть бизнес-требование ограничить максимальную длину значения или столбец индексируется с помощью B-tree, стоит рассмотреть varchar(n). Если такого требования нет — используйте text и не думайте, что делаете что-то неправильно.

Более того, в документации PostgreSQL говорится:

Хотя в некоторых других СУБД тип character(n) может иметь преимущества по производительности, в PostgreSQL таких преимуществ нет. Более того, character(n)

обычно является самым медленным из трёх вариантов из-за дополнительных затрат на хранение. В большинстве случаев вместо него следует использовать text или character varying


Почему изменить varchar(n) на text ничего не стоит?
Потому что это всего лишь изменение метаданных. Физическое хранение данных у этих типов одинаковое.
Метаданные хранятся в таблице pg_attribute, поэтому изменение типа сводится к обновлению записи в этой таблице. Сами данные остаются без изменений, поэтому не требуется ни переписывать таблицу, ни менять формат хранения.

А вот с char всё иначе
При миграции с char на text для каждого значения выполняется rtrim, поскольку неявное приведение char к text автоматически удаляет завершающие пробелы.

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

Как PostgreSQL хранит строки. PostgreSQL использует формат хранения переменной длины для всех строковых типов данных.

Данные могут храниться либо непосредственно в строке таблицы (inline), либо с использованием механизма TOAST (The Oversized-Attribute Storage Technique), который отвечает за сжатие и вынесение больших значений за пределы основной таблицы. Обычно TOAST начинает использоваться, когда размер строки превышает примерно 2 КБ.
И varchar(n), и text используют один и тот же механизм хранения, включая TOAST.

Когда действительно стоит использовать varchar(n)?
Используйте varchar(n), когда ограничение длины — это бизнес-правило, которое должна контролировать сама база данных. Например:

country_code   varchar(2),  -- ISO 3166-1
currency_code varchar(3), -- ISO 4217
us_zip_code varchar(5), -- 5 цифр
sku varchar(20), -- ограничения внешних систем


Стоит ли использовать varchar для country_code и currency_code? Конечно. Международные стандарты жёстко определяют длину этих кодов.
Для SKU ограничение длины также может диктоваться внешними требованиями.

Что касается us_zip_code, то на практике нередко возникает необходимость поддерживать расширенный формат ZIP+4. Со временем такие столбцы вообще могут быть переименованы в postal_code, чтобы поддерживать международные почтовые индексы.

В таких случаях varchar одновременно обеспечивает и необходимое ограничение, и достаточную гибкость.
Проще говоря, varchar помогает обеспечить соблюдение бизнес-правил.

Индексируемые столбцы? Рассмотрите varchar(n)
Само по себе индексирование столбцов типа text не является проблемой, однако есть нюанс.
varchar(n) может служить дополнительной защитой для индексируемых столбцов (например, если username используется не просто как отображаемое имя, а для поиска, аутентификации или загрузки профиля).

Почему?

Потому что PostgreSQL не сможет создать запись в B-tree-индексе, если её размер превышает примерно 2704 байта.
На самом деле ограничение распространяется не на исходный размер строки, а на её сжатый размер, поэтому назвать точный предел в символах невозможно: разные строки сжимаются по-разному.

Ограничение длины через varchar(n) позволяет предотвратить ситуацию, когда приложение пытается сохранить значение, которое невозможно проиндексировать.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

💡 Java: sealed types позволяют закрыть граф наследования с помощью permits.

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

✅ Наследоваться от sealed-класса или интерфейса могут только типы, перечисленные в permits.
✅ Каждый разрешённый подтип должен быть объявлен как final, sealed или non-sealed.

При этом non-sealed — это своего рода «точка выхода»: начиная с такого класса, ограничения снимаются, и наследование снова становится открытым для любых потомков.

#JavaDev

👉 Java Portal

Читать полностью…

Java Portal | Программирование

🔍 ТОП-5 ошибок на алгоритмической сессии

Привет, на связи Таня Коровкина из ШОРТКАТ. Ментор по алгоритмам и backend-разработчик

Каждый месяц тысячи разработчиков совершают одни и те же ошибки на алгоритмических интервью 🚩

И продолжают готовиться... не к тому.

Уже сегодня в 19:00 (МСК) проведу вебинар и покажу, что на самом деле оценивает интервьюер и какие ошибки чаще всего приводят к отказу

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

🤘 Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.

Переходи в нашего бота, чтобы получить ссылку на эфир →
@shortcut_sh_bot

Реклама.
О рекламодателе.

Читать полностью…

Java Portal | Программирование

Зачем нужен обратный прокси (Reverse Proxy)?

У вас есть API на Node.js.
Поначалу пользователи отправляют запросы напрямую в приложение, и всё работает отлично.
Но по мере роста проекта появляются новые задачи:

- использовать HTTPS;
- раздавать статические файлы;
- применять ограничение частоты запросов (Rate Limiting);
- масштабировать приложение.

Часть этих задач можно решить прямо в API. Но проблема в том, что тогда ему приходится выполнять две разные роли:
реализовывать бизнес-логику (пользователи, платежи, заказы и т. д.);
решать инфраструктурные задачи (HTTPS, раздача статики, Rate Limiting и т. д.).

По мере появления новых инфраструктурных задач становится логично отделить их от бизнес-логики.
Для этого между интернетом и вашим API добавляют дополнительный слой.
Этот слой называется обратным прокси (Reverse Proxy).

Он принимает входящие запросы и решает, что с ними делать: обработать их самостоятельно или перенаправить в API.
Интернет → Reverse Proxy → Ваш API

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

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

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

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Серия о проектировании систем : Кэш

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

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

> Уровень кэширования

Отдельный уровень кэширования даёт несколько преимуществ:

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

Работа происходит следующим образом:

1. Получив запрос, веб-сервер сначала проверяет, есть ли нужный ответ в кэше.
2. Если ответ есть, сервер отправляет его клиенту.
3. Если ответа нет, сервер обращается к базе данных, сохраняет результат в кэше и отправляет его клиенту.

Такая стратегия называется read-through cache — «сквозное чтение через кэш».

Существуют и другие стратегии кэширования. Выбор зависит от типа и объёма данных, а также от характера обращений к ним.

> Когда использовать кэш?

Кэш особенно полезен, когда данные:

- часто читаются;
- редко изменяются.

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

> Политика истечения срока действия

Рекомендуется задавать срок жизни кэшированных данных.

Без такой политики данные могут оставаться в памяти неограниченно долго.

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

> Согласованность данных

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

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

> Предотвращение сбоев

Один сервер кэша является единой точкой отказа, или SPOF — Single Point of Failure.

Поэтому для повышения отказоустойчивости рекомендуется использовать несколько серверов кэша.

> Политика вытеснения

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

Этот процесс называется вытеснением из кэша.

Самая популярная политика вытеснения — LRU, Least Recently Used, то есть удаление данных, которые не использовались дольше всего.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

💡 Используйте Optional.orElseThrow(), когда отсутствие значения — это ошибка.

✅ orElse(null) → NPE возникает позже, далеко от места поиска значения
✅ orElseThrow() останавливает выполнение в месте возникновения проблемы и выбрасывает понятное исключение
✅ Передавайте Supplier, чтобы в сообщении было указано, какое именно значение отсутствует

#Java #Optional

👉 Java Portal

Читать полностью…

Java Portal | Программирование

⚡️💬 Оригинальный Claude API от $0.40 за 1M токенов

Без VPN, дорогих подписок и подмены модели под капотом.

ClaudeHub — для тех, кто использует ИИ в коде, учёбе, работе, ботах и своих проектах.

выбираете Claude — получаете Claude

Платите только за фактическое использование токенов и быстро начинаете через Telegram-бота.

Подходит для Cursor, Claude Code, Cline, Roo, Continue и любых проектов через API.

🆓 Первые 100 пользователей получают 50₽ на баланс по промокоду: FIRST100

✨ Быстрый старт: @claudehub_bot
🔗 Регистрация: app.claudehub.fun/register
💬 Поддержка: t.me/claudehub_support

Читать полностью…

Java Portal | Программирование

💡 Java I/O: используйте Files.copy(), чтобы скопировать файл одной строкой.

✅ Отлично подходит для резервных копий: data.csv → data.csv.bak
✅ Используйте REPLACE_EXISTING, если целевой файл уже может существовать
✅ Работает с Path, поэтому код переносим между разными ОС

#Java #Files

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Системный дизайн: База данных

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

- один для обработки веб- и мобильного трафика — веб-уровень (web tier);
- другой для базы данных — уровень данных (data tier).

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

Какую базу данных использовать?

Можно выбрать между традиционной реляционной базой данных — RDBMS, или SQL-базой данных — и нереляционной базой данных — NoSQL.

Реляционные базы данных представляют и хранят данные в виде таблиц и строк. С помощью SQL можно выполнять операции JOIN между различными таблицами базы данных.

Нереляционная база данных может быть подходящим выбором, если:

- приложению требуется сверхнизкая задержка;
- данные неструктурированы или не имеют связей;
- требуется только сериализация и десериализация данных — JSON, YAML и т. д.;
- необходимо хранить огромные объёмы данных.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Новый сервис, для конверта документов в Markdown: https://docs.context.dev/api-reference/utility/parse

Достаточно сделать один API-запрос: отправить содержимое файла и получить на выходе Markdown с сохранённой структурой, ссылками и порядком текста.

Сервис поддерживает PDF, Word, Excel, PowerPoint, HTML, CSV, изображения, исходный код и многие другие форматы. Если документ представляет собой скан или фотографию, встроенный OCR автоматически распознает текст.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Rate Limiting ≠ Throttling ≠ Backpressure

Эти три термина часто используют как взаимозаменяемые…

Но на самом деле они решают совершенно разные задачи масштабирования.

Вот самый простой способ их запомнить:

- Rate Limiting → ограничивает количество запросов, которые клиент может отправить.
- Throttling → ограничивает скорость обработки запросов системой, когда она находится под высокой нагрузкой.
- Backpressure → позволяет медленному потребителю сигнализировать быстрому производителю, чтобы тот снизил скорость и не перегружал систему.

Простая шпаргалка

- Rate Limiting = ограничение количества запросов.
- Throttling = замедление обработки.
- Backpressure = управление потоком данных.

Где используется каждый из подходов?

Rate Limiting

Используется в:

- API Gateway
- Публичных API
- Эндпоинтах авторизации
- Защите от злоупотреблений и DDoS-атак

Типичный ответ сервера:

HTTP/1.1 429 Too Many Requests


Throttling

Используется в:

- Фоновых задачах
- Сервисах с высокой нагрузкой на базу данных
- CPU-интенсивных операциях
- Защите зависимых сервисов во время всплесков трафика

Backpressure

Используется в:

- Kafka-консьюмерах
- Reactive Streams
- Событийно-ориентированных архитектурах
- Стриминговых конвейерах обработки данных

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

Пример из реальной жизни

Представьте платформу по продаже билетов на концерт во время старта продаж.

Rate Limiting

Каждый пользователь может отправить не более 100 запросов в минуту.

Throttling

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

Backpressure

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

Самое распространённое заблуждение

- Rate Limiting защищает API от слишком активных клиентов.
- Throttling защищает сам сервис от перегрузки.
- Backpressure защищает потребителей данных от слишком быстрых производителей.

Это не взаимоисключающие механизмы — они часто используются совместно.

Фраза, которую стоит запомнить

- Rate Limiting — *слишком много запросов.*
- Throttling — *обрабатывай медленнее.*
- Backpressure — *я не успеваю, притормози.*

Эти три концепции лежат в основе построения масштабируемых систем, таких как Netflix, Uber, Amazon и событийно-ориентированных архитектур на базе Kafka.

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

👉 Java Portal

Читать полностью…

Java Portal | Программирование

PostgreSQL 19 представляет запросы в графовом стиле.

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

Такой подход полезен для:
• рекомендательных систем;
• управления доступом;
• обнаружения мошенничества;
• графов знаний (Knowledge Graphs);
• предоставления контекста для AI.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

FastAPI с трёхуровневой архитектурой в стиле Java: слои controller, service, crud, schema и model, организованные по аналогии с паттернами Spring Boot. Включает поддержку SQLAlchemy 2.0, авторизации на базе Casbin и Docker.

https://github.com/fastapi-practices/fastapi-best-architecture

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Java: Используйте Deque вместо Stack для реализации стека (LIFO — last in, first out, «последним пришёл — первым вышел»).

✅ Stack — это устаревший класс. Он наследуется от Vector и синхронизирует каждую операцию.
✅ Deque поддерживает те же методы: push, pop и peek.
✅ ArrayDeque работает быстрее, чем Stack.

#JavaDev

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Массивы в Java

Представьте, что вам нужно хранить оценки 100 студентов.

Неужели вы будете создавать 100 отдельных переменных?

int mark1;
int mark2;
int mark3;
...


Конечно, нет.

Именно для этого и существуют массивы. Массив позволяет хранить несколько значений одного типа данных в одной переменной.

Что такое массив?

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

int[] scores = {10, 20, 30, 40, 50};


Каждый элемент определяется своим индексом, который начинается с 0.

Индекс  : 0   1   2   3   4
Значение:10 20 30 40 50


Создание массива

- Объявление

int[] numbers;


- Создание

numbers = new int[5];


- Объявление и создание

int[] numbers = new int[5];


Или можно сразу инициализировать массив:

int[] numbers = {10, 20, 30, 40, 50};


Основные операции

- Доступ к элементу

System.out.println(numbers[2]);   // 30


- Изменение элемента

numbers[1] = 25;


- Получение длины массива

numbers.length


- Перебор массива

for (int i = 0; i < numbers.length; i++) {
System.out.println(numbers[i]);
}


Важные моменты

- Размер массива фиксирован.
- Индексация всегда начинается с 0.
- Все элементы массива должны быть одного типа данных.
- Массивы примитивных типов автоматически заполняются значениями по умолчанию.

Например:

int[] arr = new int[3];


Значения элементов будут такими:

0 0 0


- Совет для собеседований

Что произойдет в этом случае?

int[] arr = {10, 20, 30};

System.out.println(arr[3]);


❌ Будет выброшено исключение ArrayIndexOutOfBoundsException.

Почему?

Потому что допустимые индексы:

0, 1, 2


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

Массивы — одна из самых фундаментальных структур данных в Java.

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

👉 Java Portal

Читать полностью…

Java Portal | Программирование

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

✅ По одной строке на каждый case, выражение возвращает значение, break больше не нужен.
✅ Добавили новую константу в enum, но не добавили соответствующий case? Получите ошибку компиляции, а не тихий баг, который проявится только во время выполнения.

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Spring Boot: Вы можете реализовать оптимистическую блокировку с помощью аннотации @Version.

✅ Идеально подходит, когда:
операции чтения выполняются часто;
операции записи происходят сравнительно редко;
конфликты возникают редко.

❌ Не подходит, когда:
конфликты происходят часто;
требуется строгая последовательная обработка (strict serialization).

#SpringBoot #JavaDev

👉 Java Portal

Читать полностью…

Java Portal | Программирование

НОВИНКА: Устойчивые функции (Durable Functions) в PostgreSQL 🤯

pg_durable
— это расширение PostgreSQL. Состояние рабочего процесса, очередь, повторные попытки и восстановление хранятся в Postgres, и оно использует устойчивость Postgres / высокую доступность / резервное копирование / восстановление.

https://techcommunity.microsoft.com/blog/adforpostgresql/introducing-durable-functions-in-postgresql/4526821

👉 Java Portal

Читать полностью…

Java Portal | Программирование

Основы системного дизайна

Теорема CAP: почему распределённые системы не могут иметь всё сразу

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

Внезапно...

Сетевое соединение между серверами прерывается.

Теперь у системы есть выбор:
Продолжать принимать запросы?

Или отклонять запросы, пока всё не синхронизируется?

Именно эту проблему решает теорема CAP.

Что такое теорема CAP?

CAP означает:

C — Consistency (Согласованность)
Каждый пользователь видит одни и те же данные, независимо от того, к какому серверу подключился.

Пример: Перевод ₹1000. Каждый сервер сразу показывает обновлённый баланс.

A — Availability (Доступность)
Каждый запрос получает ответ.

Даже если один или несколько серверов недоступны.

Ответ может не содержать самых свежих данных.

P — Partition Tolerance (Устойчивость к разделению)
Система продолжает работать, даже если связь между серверами прервана.

В распределённых системах сетевые сбои неизбежны.

Главное правило. Когда происходит сетевое разделение (partition)...

Можно выбрать только одно из двух:
✔️ Согласованность (Consistency)
ИЛИ
✔️ Доступность (Availability)

Гарантировать оба одновременно нельзя.

Partition Tolerance в распределённых системах не опционален — вы обязаны считать, что это случится.

- CP-системы
Выбирают:
✔️ Согласованность
✔️ Устойчивость к разделению

Пример:

Сервер A      ✖️ Сеть ✖️      Сервер B


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

Применение:
- Банковские системы
- Платёжные системы
- Управление запасами

Правильность важнее, чем постоянный ответ.

- AP-системы
Выбирают:
✔️ Доступность
✔️ Устойчивость к разделению

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

Применение:
- Социальные сети
- Ленты новостей
- Каталоги товаров

Доступность важнее немедленной согласованности.

= Реальные примеры =

Банкинг
Неверные балансы недопустимы. Выбирают CP.

Лайки в Instagram
Видеть 1024 лайка вместо 1026 пару секунд — не проблема. Выбирают AP.

Корзина покупок
Многие системы ищут баланс.

Корзина должна оставаться доступной, а важные операции (оплата) — строго согласованными.

Главный вывод. Теорема CAP не говорит: «Выбери любые два».

Она говорит:

Когда происходит сетевое разделение, вы обязаны выбрать между Согласованностью и Доступностью.

Каждая распределённая система делает этот компромисс.

👉 Java Portal

Читать полностью…
Subscribe to a channel