Lexicon | Java вопросы
13 subscribers
15 photos
14 links
Подготовка к собеседованиям для Java разработчиков.

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

Новые вопросы выходят регулярно.
Download Telegram
Вопрос

Какие методы и статус-коды вы используете для обработки ситуаций, когда клиент делает запросы с устаревшей версией API? Опишите конкретные сценарии и ответы сервера.

Ответ

Для обработки запросов на устаревших версиях API обычно применяется контроль версии через заголовки или URL. При обнаружении устаревшей версии сервер может вернуть 426 Upgrade Required или 400 Bad Request с описанием необходимости обновления. В некоторых случаях используют 301/302 редиректы на актуальную версию API. В ответах желательно указывать рекомендации по обновлению клиента и поддерживать документацию для разных версий API.

#lexicon #собеседование #java #senior #backend #http
Вопрос

Как вы реализуете rate limiting на уровне backend, чтобы предотвратить перегрузку сервиса? Приведите пример конкретного подхода или инструмента и опишите шаги его внедрения.

Ответ

Реализация rate limiting на уровне backend обычно включает выбор подходящего алгоритма (например, Token Bucket или Leaky Bucket) и инструмента (например, Redis для хранения состояния лимитов). Основные шаги — определить порог запросов за единицу времени, внедрить промежуточное ПО (middleware) или фильтр, который учитывает количество запросов от каждого пользователя или IP, и при превышении лимита возвращает соответствующий HTTP-статус (например, 429). Использование распределенного хранилища обеспечивает согласованность лимитов при масштабировании сервиса.

#lexicon #собеседование #java #middle #backend #scalability
Вопрос

Опишите, как вы организуете сбор и анализ метрик из production-приложения для выявления bottlenecks: какие инструменты внедряете, как дашборды и алерты помогают в ранней диагностике проблем?

Ответ

Для сбора и анализа метрик из production-приложения используют инструменты мониторинга, такие как Prometheus или Grafana, которые позволяют получать данные о производительности в реальном времени. Внедряют трассировку и профилирование с помощью APM-систем (например, Elastic APM или Jaeger) для выявления узких мест и hot spots. Дашборды настраивают для визуализации ключевых метрик, а алерты — для оперативного уведомления о проблемах, что обеспечивает раннюю диагностику и своевременное реагирование на деградацию производительности.

#lexicon #собеседование #java #junior #performance
Вопрос

Приведите пример сценария, когда асинхронная коммуникация между сервисами может привести к проблемам целостности данных. Как бы вы решили эту проблему на практике?

Ответ

Асинхронная коммуникация между сервисами может привести к рассогласованию данных, если один сервис обновляет состояние, а другой обрабатывает события с задержкой или ошибками. Такая ситуация возникает, например, при обновлении заказа и списании средств в двух разных сервисах, где сообщения могут быть доставлены некорректно или повторно. Для решения этой проблемы применяют паттерны компенсации (saga), ведут аудит событий и используют идемпотентные операции для предотвращения дублирования и потери данных.

#lexicon #собеседование #java #senior #backend #arch
Вопрос

Объясните, как устанавливается TCP-соединение и какие основные этапы этого процесса.

Ответ

Установка TCP-соединения происходит через процесс трехстороннего рукопожатия (three-way handshake). Сначала клиент отправляет серверу SYN-пакет для инициации соединения, сервер отвечает SYN-ACK пакетом, подтверждая получение и готовность, затем клиент отправляет ACK-пакет для подтверждения. Этот механизм обеспечивает согласование параметров соединения и синхронизацию номеров последовательности перед передачей данных.

#lexicon #собеседование #java #junior #backend #networking
Вопрос

Опишите пошагово, как внедрить в event-driven систему механизм дедлайнов (TTL) для сообщений, чтобы избежать обработки устаревших событий. Какие настройки используете в Kafka или RabbitMQ для этого?

Ответ

Для реализации механизма TTL в event-driven системе необходимо ограничить время жизни сообщений, чтобы устаревшие события не обрабатывались. В RabbitMQ можно использовать свойство TTL на уровне очереди или отдельных сообщений, задавая параметр x-message-ttl или x-expires, после чего сообщения автоматически удаляются. В Kafka можно настроить retention.ms для топиков, что определит время хранения сообщений на брокере, после которого они становятся недоступны для потребителей. Важно также корректно обрабатывать время жизни сообщений на уровне потребителей, проверяя timestamp и игнорируя старые события при необходимости.

#lexicon #собеседование #java #middle #backend #messaging
Вопрос

Какие проблемы могут возникнуть при переопределении equals() и hashCode() в классах с генериками и как вы их решаете на практике?

Ответ

При переопределении equals() и hashCode() в классах с дженериками важно учитывать, что тип параметра во время выполнения подвергается стиранию, поэтому нельзя полагаться на конкретные типы. Также в реализации нужно применять меры для предотвращения ошибок при сравнении null и обеспечивать согласованность между equals() и hashCode(). Практически используют сравнение полей, значимых для идентичности объекта, с учетом возможных null, и включают все эти поля в формирование хэш-кода, часто с помощью встроенных утилит, таких как Objects.equals() и Objects.hash().

#lexicon #собеседование #java #senior #fundamentals
Вопрос

Какие паттерны асинхронного программирования вы используете для эффективного управления потоками и как они помогают избежать проблем с блокировками и конкуренцией?

Ответ

Для эффективного управления потоками применяются паттерны, такие как ExecutorService для управления пулом потоков, Future и CompletableFuture для обработки асинхронных задач с возможностью композиции, а также паттерн Producer-Consumer для разделения задач на производящие и потребляющие. Эти паттерны помогают избежать блокировок благодаря ограничению количества одновременно выполняемых потоков и асинхронному ожиданию результатов без удержания ресурсов. Использование неблокирующих структур данных и механизмов синхронизации снижает риск условий гонки и конкуренции.

#lexicon #собеседование #java #senior #asynchronous
Вопрос

Какие HTTP-заголовки рекомендуете использовать для защиты API при аутентификации и авторизации, и как их правильно настраивать на сервере?

Ответ

Для защиты API при аутентификации и авторизации обычно используются заголовки Authorization с токенами типа Bearer, содержащими JWT или другие схемы аутентификации. Важно правильно настроить CORS-заголовки (Access-Control-Allow-Origin, Access-Control-Allow-Headers) для контроля доступа из браузера. Также стоит применять заголовки безопасности, такие как Strict-Transport-Security для принудительного использования HTTPS и Content-Security-Policy для ограничения источников контента. На сервере необходимо валидировать и парсить заголовки, обеспечивая корректную проверку полномочий и защиту от подделки запросов.

#lexicon #собеседование #java #junior #backend #security
Вопрос

Как организовать мониторинг и логирование в распределённой системе микросервисов? Какие конкретные технологии или подходы вы используете для обнаружения и локализации проблем?

Ответ

Мониторинг в распределённой системе строится на сборе метрик, логов и трассировок с каждого микросервиса для контроля состояния и быстрого выявления аномалий. Применяется централизованное логирование с помощью систем, таких как ELK Stack или Loki, а для трассировки запросов через сервисы используются инструменты OpenTelemetry или Jaeger. Для оповещений на основе мониторинга метрик применяют Prometheus и Alertmanager. Важно обеспечить корреляцию логов и метрик по общим идентификаторам запросов для эффективной диагностики и локализации проблем.

#lexicon #собеседование #java #middle #backend #arch
Вопрос

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

Ответ

Стратегии маршрутизации сообщений в RabbitMQ реализуются через различные типы обменников: direct, fanout, topic и headers. Direct обменник отправляет сообщение в очередь, совпадающую с точным routing key; fanout рассылает сообщение во все привязанные очереди, реализуя широковещательную рассылку. Topic обменник позволяет направлять сообщения согласно шаблонам routing key, что удобно для гибкой фильтрации, а headers маршрутизирует сообщения по значениям заголовков. Выбор типа обменника зависит от бизнес-логики: direct для точечных сообщений, fanout для уведомлений всем подписчикам, topic для тематической маршрутизации и headers для сложных условий.

#lexicon #собеседование #java #middle #backend #messaging
Вопрос

Какие потенциальные проблемы могут возникнуть при использовании raw types в Java и как этого избежать с помощью generics? Приведите пример кода и объясните.

Ответ

Использование raw types в Java приводит к потере типовой безопасности, что может вызвать ClassCastException во время выполнения. Generics позволяют определять типы параметров, обеспечивая проверку типов на этапе компиляции и исключая необходимость ручных кастов. Например, List<String> гарантирует, что список содержит только строки, тогда как List без параметров может содержать любые объекты, приводя к ошибкам. Чтобы избежать проблем с raw types, рекомендуется всегда использовать параметризованные типы и избегать необобщённых коллекций.

#lexicon #собеседование #java #senior #fundamentals
Вопрос

Какое поведение и жизненный цикл у Spring-бина с областью видимости singleton? Приведите пример, когда это предпочтительно.

Ответ

Spring-бин с областью видимости singleton создаётся один раз при старте контейнера и существует в течение всего времени жизни приложения. Все запросы к такому бину возвращают одну и ту же инстанцию, что обеспечивает экономию ресурсов и состояние, если оно требуется. Такой scope подходит для безсостоянийных сервисов или компонентов, где общий доступ к ресурсам безопасен и желателен. Например, бины-сервисы, реализующие логику бизнес-процессов, часто объявляют singleton для повышения производительности.

#lexicon #собеседование #java #junior #spring #injection
Вопрос

Как в Spring Boot настроить профили, чтобы автоматически выбирать конфигурацию базы данных для разных окружений? Расскажите, какие файлы properties или yaml для этого используются и как их приоритет определяется.

Ответ

Для настройки профилей в Spring Boot используют файлы application-{profile}.properties или application-{profile}.yaml, где {profile} — имя профиля, например, dev или prod. Профиль активируется через свойство spring.profiles.active, которое можно задавать в основном application.properties, переменных окружения или аргументах командной строки. Spring Boot загружает сначала основной application.properties, затем перекрывает его значениями из файла активного профиля, определяя приоритет конфигураций. Это позволяет удобно переключать настройки базы данных и другие параметры для разных окружений.

#lexicon #собеседование #java #middle #spring_boot #backend
📘 Разбор опроса

Анализ плана выполнения SQL-запроса

Вопрос: Что показывает explain plan для анализа производительности запроса?

Правильный ответ: План выполнения и операции СУБД

Explain plan показывает последовательность операций СУБД (сканирование, индексы, соединения) для оптимизации запроса.
👍1
Вопрос

Как ты объяснишь основное различие между checked и unchecked исключениями в Java, и почему важно это различие при проектировании API?

Ответ

Checked исключения требуют обязательной обработки или декларации с помощью throws, что обеспечивает явное управление ошибками на этапе компиляции. Unchecked исключения не требуют явного перехвата и обычно сигнализируют о проблемах, которые можно считать программными ошибками. При проектировании API важно различать эти типы исключений для балансировки контроля над ошибками и удобства использования, обеспечивая правильное информирование пользователей API о возможных ошибках.

#lexicon #собеседование #java #junior #java_errors #backend
👍1