Делаем простой rate limiter на Java!
Иногда нужно ограничить частоту действий: отправку кода подтверждения, вызов команды, обращение к endpoint или повторную отправку формы. Для базового варианта можно использовать очередь с временем последних успешных вызовов.
В этой задаче:
Такой вариант хорошо подходит для понимания идеи sliding window и небольших локальных сценариев.
👉 Java Ready | #задача
Иногда нужно ограничить частоту действий: отправку кода подтверждения, вызов команды, обращение к endpoint или повторную отправку формы. Для базового варианта можно использовать очередь с временем последних успешных вызовов.
В этой задаче:
• храним timestamps действий;
• удаляем устаревшие записи;
• проверяем размер окна;
Такой вариант хорошо подходит для понимания идеи sliding window и небольших локальных сценариев.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍4🔥2
Делаем простой TTL-кэш на Java!
Иногда значение нужно хранить не навсегда, а только короткое время: ответ API, результат вычисления или временную настройку.
Опишем запись кэша:
Создадим хранилище:
Добавим значение с временем жизни:
Теперь достанем значение:
Проверка:
Ожидаемый вывод:
После истечения TTL метод вернёт
👉 Java Ready | #практика
Иногда значение нужно хранить не навсегда, а только короткое время: ответ API, результат вычисления или временную настройку.
Опишем запись кэша:
record Entry<T>(T value, long expiresAt) {}Создадим хранилище:
Map<String, Entry<String>> cache = new HashMap<>();
Добавим значение с временем жизни:
void put(String key, String value, long ttlMs) {
cache.put(key, new Entry<>(
value,
System.currentTimeMillis() + ttlMs
));
}Теперь достанем значение:
String get(String key) {
var entry = cache.get(key);
if (entry == null) {
return null;
}
if (entry.expiresAt() < System.currentTimeMillis()) {
cache.remove(key);
return null;
}
return entry.value();
}Проверка:
put("token", "abc", 1000);
System.out.println(get("token"));Ожидаемый вывод:
abc
После истечения TTL метод вернёт
null, а устаревшая запись удалится из Map.Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍5🔥4👎1
Шпаргалка по Maven!
Например, mvn test запускает тесты, mvn package собирает артефакт, а mvn dependency:tree показывает дерево зависимостей проекта.
На картинке основные Maven-команды, фазы lifecycle, полезные параметры командной строки, локальный репозиторий, Maven Central и популярные плагины: help, dependency, compiler, version, wrapper, Spring Boot и exec.
Сохрани, чтобы не потерять!
👉 Java Ready | #ресурс
Например, mvn test запускает тесты, mvn package собирает артефакт, а mvn dependency:tree показывает дерево зависимостей проекта.
На картинке основные Maven-команды, фазы lifecycle, полезные параметры командной строки, локальный репозиторий, Maven Central и популярные плагины: help, dependency, compiler, version, wrapper, Spring Boot и exec.
Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12👍7🔥6
Разбираем Sequenced Collections!
В Java 21 появился общий API для коллекций, у которых есть понятный порядок элементов: первый, последний и обратный обход. Раньше для этого приходилось помнить разные методы у
👉 Java Ready | #шпора
В Java 21 появился общий API для коллекций, у которых есть понятный порядок элементов: первый, последний и обратный обход. Раньше для этого приходилось помнить разные методы у
List, Deque, LinkedHashMap и других структур.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍7❤6
Статья про E2EE-мессенджер на Spring Boot и WebCrypto!
Автор показывает, как устроить сквозное шифрование так, чтобы сервер передавал сообщения, но не видел их содержимое.
В статье автор показывает:
• как устроена сессия и обмен ключами
• зачем нужен ratchet-подход для сообщений
• какие архитектурные ошибки легко допустить при E2EE
👉 Java Ready | #статья
Автор показывает, как устроить сквозное шифрование так, чтобы сервер передавал сообщения, но не видел их содержимое.
В статье автор показывает:
• как устроена сессия и обмен ключами
• зачем нужен ratchet-подход для сообщений
• какие архитектурные ошибки легко допустить при E2EE
Продолжай читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8🔥5👍3🤝2
Делаем простой HTTP-запрос через HttpClient!
Иногда нужно без сторонних библиотек сходить в API, получить JSON или проверить доступность. Начиная с Java 11 для этого есть встроенный HttpClient.
Сначала создадим клиент:
Теперь соберём request:
Укажем адрес:
Выберем GET-запрос:
И соберём объект:
Ответ можно получить синхронно:
Код статуса лежит отдельно:
Тело ответа можно прочитать так:
Для реального кода почти всегда стоит добавить timeout. Тогда запрос не сможет зависнуть навсегда:
Если запросов много, клиент лучше переиспользовать. Он потокобезопасный и нормально подходит для сервисов, CLI-утилит и фоновых задач.
Такой подход удобен, когда нужно быстро сделать интеграцию без OkHttp, Apache HttpClient и других зависимостей.
👉 Java Ready | #практика
Иногда нужно без сторонних библиотек сходить в API, получить JSON или проверить доступность. Начиная с Java 11 для этого есть встроенный HttpClient.
Сначала создадим клиент:
HttpClient client = HttpClient.newHttpClient();
Теперь соберём request:
HttpRequest request = HttpRequest.newBuilder()
Укажем адрес:
.uri(URI.create("https://api.github.com"))Выберем GET-запрос:
.GET()
И соберём объект:
.build();
Ответ можно получить синхронно:
var response = client.send(request,
HttpResponse.BodyHandlers.ofString());
Код статуса лежит отдельно:
System.out.println(response.statusCode());
Тело ответа можно прочитать так:
System.out.println(response.body());
Для реального кода почти всегда стоит добавить timeout. Тогда запрос не сможет зависнуть навсегда:
.timeout(Duration.ofSeconds(5))
Если запросов много, клиент лучше переиспользовать. Он потокобезопасный и нормально подходит для сервисов, CLI-утилит и фоновых задач.
Такой подход удобен, когда нужно быстро сделать интеграцию без OkHttp, Apache HttpClient и других зависимостей.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤5🔥5
Почему ThreadLocal нужно чистить после использования?
Например, в начале обработки запроса можно сохранить id пользователя:
А ниже по коду достать его без передачи через каждый метод:
Но в серверных приложениях потоки часто переиспользуются пулом.
Если значение не удалить, следующий запрос может попасть на тот же поток и увидеть старые данные.
Поэтому после работы важно очищать
👉 Java Ready | #совет
ThreadLocal удобен, когда значение должно быть привязано к конкретному потоку:private static final ThreadLocal<String> USER_ID =
new ThreadLocal<>();
Например, в начале обработки запроса можно сохранить id пользователя:
USER_ID.set("user-42");А ниже по коду достать его без передачи через каждый метод:
String userId = USER_ID.get();
Но в серверных приложениях потоки часто переиспользуются пулом.
Если значение не удалить, следующий запрос может попасть на тот же поток и увидеть старые данные.
Поэтому после работы важно очищать
ThreadLocal:try {
USER_ID.set(userId);
handleRequest();
} finally {
USER_ID.remove();
}finally нужен, чтобы очистка сработала даже при исключении.Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍2🔥2🤝2
Собираем сортировку задач по зависимостям!
Нужно получить порядок выполнения задач, где одна задача может зависеть от другой. Например, сначала build, потом test, а deploy только после test.
В этой задаче:
Такой подход полезен для пайплайнов, сборки модулей, миграций, очередей обработки и любых сценариев, где порядок нельзя задавать руками.
👉 Java Ready | #задача
Нужно получить порядок выполнения задач, где одна задача может зависеть от другой. Например, сначала build, потом test, а deploy только после test.
В этой задаче:
• описываем граф зависимостей
• считаем входящие связи
• кладём свободные задачи в очередь
Такой подход полезен для пайплайнов, сборки модулей, миграций, очередей обработки и любых сценариев, где порядок нельзя задавать руками.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1🔥1