Обновить

At-least-once. Это не баг провайдера. Это ваша архитектурная проблема

Уровень сложностиСложный
Время на прочтение37 мин
Охват и читатели8.7K
Всего голосов 4: ↑2 и ↓20
Комментарии8

Комментарии 8

Блин. Есть всякие java с соответствующей обвязкой фреймворками \ библиотеками. Ещё и куча требований есть к начинающим программистам: чистый код, всякие архитектурные шаблоны. И то бизнес нос воротит.

А вот пример, за что бизнес платит деньги.

  • Сколько ошибок в проектировании финтех проекта хотите?

  • Да!

Прям полный список антипаттернов...

  1. Откройте для себя Check Constraint в PostgreSQL, чтобы не делать глупых селектов баланса

  2. Откройте для себя Saga и RabbitMQ хотя бы, чтобы не городить велосипеды на PostgreSQL

  3. Перестаньте хранить денежные единицы во float

  4. Откройте для себя представления в PostgreSQL и модуль крона в нем

  5. Откройте для себя уровни изоляции транзакций и понимание их сайд-эффектов

  6. Перестаньте писать спагетти-код

разберём по пунктам:

  1. CHECK constraint есть, balance_non_negative CHECK (balance >= 0) прямо в схеме в статье.

  2. Осознанный выбор в пользу PostgreSQL как единственного источника правды. Unique constraint даёт атомарность которую Saga с RabbitMQ без persistence не даст.

  3. именно про это написан отдельный раздел. NUMERIC(38,18) везде, _validate_amount явно отклоняет float с сообщением "float не допускается".

  4. Представления и pg_cron, вкусовщина, не антипаттерн.

  5. Уровни изоляции, REPEATABLE READ в balance check, NOWAIT на всех блокировках, lock_timeout, явный catch на DeadlockDetected.

  6. Спагетти-код, не понял к чему это.

Такое ощущение, что вы комментировали не читая статью.

  1. Мой косяк. Посмотрел на первый запрос.

  2. "Unique constraint даёт атомарность которую Saga с RabbitMQ без persistence не даст." с чего вдруг? Создаете ключ идемпотентности и вперед. Ключ есть в базе - обрабатываете сообщение, ключа нет - nack. Мало того, при большом объеме транзакций, у вас база просто захлебнется от того количества запросов, которые к ней идут. Это велосипед, причем крайне сомнительный

  3. Зачем вам 18 знаков после запятой, если вы храните в неделимых единицах криптовалюты?

  4. Представления и pg_cron позволяют нормально читать без портяночных запросов в коде

  5. Претензия обоснована. Не увидел.

  6. Как-нибудь поймете

2. Unique constraint в PostgreSQL и есть idempotency key. RabbitMQ без persistence, дополнительная точка отказа. Нагрузка, осознанный трейдофф, PgBouncer и партиционирование в бэклоге.

3. Храним в ETH, провайдер присылает сконвертированное. NUMERIC(38,18), worst case для любого ERC-20 с 18 decimals.

5. REPEATABLE READ, NOWAIT, lock_timeout, statement_timeout, catch на LockNotAvailable, QueryCanceled, DeadlockDetected, всё в коде.

Я же написал, что ваша претензия обоснована по 5-ому пункту

Так и предаствляю владельца бизнеса: всё было хорошо, пришёл какой-то программист, стало плохо, переписал всё, теперь стало ещё хуже и никто не понимает написанный код. true story

Хотел почитать, но слоп слоповый

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации