Код: Выделить всё
class Bank {
public:
std::expected add(string account_id, int amount);
std::expected remove(string account_id, int amount);
std::expected transfer(
string source,
string destination,
int amount);
};
Другая цепочка мыслей, которая, по-видимому, преобладает на моем рабочем месте, заключается в создании в конечном итоге согласованной декларативной системы, которая для простоты пропускает эти вызовы API через различные сегменты системы. Например, это может принимать форму следующих шагов:
Код: Выделить всё
std::expected Bank::transfer(
string source,
string destination,
int amount,
string request_id) {
while (true) {
{
auto result = remove(source, amount, request_id);
if (!result.has_value()) {
return std::unexpected(BankError::TransferOutFailed);
}
}
{
auto result = add(destination, amount, request_id);
if (!result.has_value()) {
return std::unexpected{BankError::TransferInFailed);
}
}
return;
}
}
Почему-то я не могу понять, почему транзакционный перевод суммы со счета A на B упростит систему, если будет обеспечен в конечном итоге согласованный механизм. Вот причины, о которых я могу думать:
- Если есть много транзакций, которые не реализуются в другом сегменте, мы можем столкнуться со сценариями, в которых мы эффективно уменьшаем сумму в одном аккаунте, не отображая ее в другом. Уменьшение суммы между двумя учетными записями.
- Нам необходим контроль параллелизма поверх учетных записей, чтобы гарантировать отсутствие одновременных транзакций чтения, в которых наблюдаются неправильные значения из-за незавершенных транзакций.
- Если целевой аккаунт не существует, нам необходимо включить протоколы отката.
Подробнее здесь: https://stackoverflow.com/questions/798 ... ncy-enough
Мобильная версия