Sobes.tech
Middle+
36

Как обработать параллельные операции списания баланса последовательно чтобы избежать двойного списания (race condition)?

Сұралған компаниялар
BetBoom

AI-дан жауап

sobes.tech AI

Чтобы избежать race condition при параллельных операциях списания баланса, нужно обеспечить последовательный доступ к ресурсу. В Node.js это можно сделать несколькими способами:

  1. Использовать транзакции и блокировки на уровне базы данных (например, SELECT ... FOR UPDATE).
  2. Внедрить очередь задач (job queue), которая обрабатывает списания последовательно.
  3. Использовать атомарные операции базы данных (например, операции с инкрементом/декрементом).

Пример с использованием очереди на основе промисов:

const queue = [];
let processing = false;

function processQueue() {
  if (processing || queue.length === 0) return;
  processing = true;
  const {amount, resolve, reject} = queue.shift();

  // Функция списания баланса
  debitBalance(amount).then(resolve).catch(reject).finally(() => {
    processing = false;
    processQueue();
  });
}

function debitBalanceSequential(amount) {
  return new Promise((resolve, reject) => {
    queue.push({amount, resolve, reject});
    processQueue();
  });
}

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