Есть ли у вас опыт написания программ с многопоточностью и асинхронностью?
Приходилось ли писать кастомные аннотации или делать сканирование классов?
Как Tomcat взаимодействует с потоками процессора (hardware threads)? Почему можно обрабатывать 200 запросов на 16 ядрах?
Почему SELECT FOR UPDATE SKIP LOCKED хуже работает в Oracle по сравнению с PostgreSQL?
За что отвечает редирект ASK в Redis Cluster?
Как реализовать распределённую систему, удовлетворяющую всем свойствам CAP? Какие там есть свойства?
Могут ли Entity-сущности наследоваться? Как происходит маппинг в БД?
Зачем нужен Docker Compose? Есть ли плюсы помимо удобства?
На каком этапе создаются прокси (для @Transactional, @Async и т.д.)?
Почему решили выйти на рынок и искать новые предложения?
Какие есть реализации List и чем они отличаются друг от друга?
Чем Kafka отличается от RabbitMQ и за счёт чего Kafka лучше масштабируется?
Что такое нормализация данных в Postgres и зачем она нужна?
Что произойдёт с HashMap, если переопределить hashCode() так, чтобы он всегда возвращал одно и то же значение (например, 42)?
Расскажи про проект в Газпроме.
Как исправить deadlock в задаче с Wallets? Можно ли использовать атомики?
Есть ли опыт работы с брокерами сообщений и с какими? На уровне пользователя или знаешь внутреннее устройство?
Какую коллекцию использовать для таблицы результатов с сортировкой по фамилии и поиском по ключу?
Реализовать перевод средств между двумя счетами. Учитываем, что это production решение Входные параметры: @param fromAccountId уникальный идентификатор пользователя который переводит средства @param toAccountId уникальный идентификатор пользователя кому переводят средства @param amount сумма перевода. Положительное число public void transferMoney(Long fromAccountId, Long toAccountId, BigDecimal amount) { if (amount.compareTo(BigDecimal.ZERO) <= 0) { throw new RuntimeException("Amount must be > 0"); } if (fromAccountId.equals(toAccountId)) { throw new RuntimeException("Account can't be the same"); } Long firstId = Math.min(fromAccountId, toAccountId); Long secondId = Math.max(fromAccountId, toAccountId); Account first = accountRepository.findByIdForUpdate(firstId) .orElseThrow(() -> new RuntimeException("Account not found")); Account second = accountRepository.findByIdForUpdate(secondId) .orElseThrow(() -> new RuntimeException("Account not found")); Account from = fromAccountId.equals(firstId) ? first : second; Account to = fromAccountId.equals(firstId) ? second : first; if (from.getBalance().compareTo(amount) < 0) { throw new RuntimeException("Balance is Less 0"); } from.setBalance(from.getBalance().subtract(amount)); to.setBalance(from.getBalance().add(amount)); accountRepository.save(to); accountRepository.save(from); }
Какие алгоритмы балансировки нагрузки знаешь?