Назад к вопросам
Senior
9
Практическое задание: спроектируйте систему перевода денег между аккаунтами с требованиями: 1000 транзакций/сек, транзакционная корректность, синхронный API.
Компании, где спрашивали
Napoleon IT
Ответ от нейросети
sobes.tech AI
Для системы перевода денег между аккаунтами с требованиями 1000 транзакций в секунду, транзакционной корректностью и синхронным API можно спроектировать следующий подход:
-
Архитектура:
- Использовать реляционную базу данных с поддержкой транзакций (например, PostgreSQL).
- API реализовать на Java с использованием Spring Boot.
-
Транзакционная корректность:
- Каждая операция перевода — это одна транзакция БД, которая:
- Проверяет баланс отправителя.
- Списывает сумму с аккаунта отправителя.
- Зачисляет сумму на аккаунт получателя.
- Использовать уровни изоляции транзакций (например, SERIALIZABLE или REPEATABLE READ) для предотвращения гонок.
- Каждая операция перевода — это одна транзакция БД, которая:
-
Обработка конкурентных запросов:
- Для предотвращения дедлоков и гонок использовать блокировки по аккаунтам в определённом порядке (например, по ID аккаунта).
-
Производительность:
- Использовать пул соединений к базе.
- Оптимизировать запросы и индексы.
- Горизонтальное масштабирование API-сервисов.
-
Пример кода (упрощённо):
@Transactional
public void transferMoney(Long fromAccountId, Long toAccountId, BigDecimal amount) {
Account from = accountRepository.findByIdForUpdate(fromAccountId);
Account to = accountRepository.findByIdForUpdate(toAccountId);
if (from.getBalance().compareTo(amount) < 0) {
throw new InsufficientFundsException();
}
from.setBalance(from.getBalance().subtract(amount));
to.setBalance(to.getBalance().add(amount));
accountRepository.save(from);
accountRepository.save(to);
}
Метод findByIdForUpdate использует SQL-запрос с SELECT ... FOR UPDATE для блокировки строк.
Такой подход обеспечивает атомарность и согласованность операций при высокой нагрузке и синхронном API.