Sobes.tech
Назад к вопросам
Senior
9

Практическое задание: спроектируйте систему перевода денег между аккаунтами с требованиями: 1000 транзакций/сек, транзакционная корректность, синхронный API.

Компании, где спрашивали
Napoleon IT

Ответ от нейросети

sobes.tech AI

Для системы перевода денег между аккаунтами с требованиями 1000 транзакций в секунду, транзакционной корректностью и синхронным API можно спроектировать следующий подход:

  1. Архитектура:

    • Использовать реляционную базу данных с поддержкой транзакций (например, PostgreSQL).
    • API реализовать на Java с использованием Spring Boot.
  2. Транзакционная корректность:

    • Каждая операция перевода — это одна транзакция БД, которая:
      • Проверяет баланс отправителя.
      • Списывает сумму с аккаунта отправителя.
      • Зачисляет сумму на аккаунт получателя.
    • Использовать уровни изоляции транзакций (например, SERIALIZABLE или REPEATABLE READ) для предотвращения гонок.
  3. Обработка конкурентных запросов:

    • Для предотвращения дедлоков и гонок использовать блокировки по аккаунтам в определённом порядке (например, по ID аккаунта).
  4. Производительность:

    • Использовать пул соединений к базе.
    • Оптимизировать запросы и индексы.
    • Горизонтальное масштабирование API-сервисов.
  5. Пример кода (упрощённо):

@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.