Изучение компонентов высокого уровня целостности платежной системы

Анжела Чжу и Шалини Оруганти

Фон

Миссия Coinbase - создать открытую финансовую систему для всего мира. Миссия команды Coinbase Payments состоит в том, чтобы дать клиентам возможность переводить деньги в криптоэкономику и из нее с помощью восхитительного и безупречного опыта. Coinbase в настоящее время поддерживает более 10 различных способов оплаты в более чем 30 странах, и мы создаем их больше. В этом блоге мы поделимся некоторыми из основных проблем и передовыми практиками для платежных систем с инженерной точки зрения.

Правильность

Платежи - это одна из областей, в которых недопустимы любые ошибки. Обеспечение того, чтобы потоки продуктов и функции работали должным образом, имеют первостепенное значение. Любые ошибки при оплате, связанные с правильностью, вызовут неприемлемое обслуживание клиентов. При возникновении ошибки ее необходимо немедленно исправить. Кроме того, процесс исправления таких ошибок занимает много времени и обычно усложняется из-за различных юридических ограничений и ограничений.

В наших системах мы создали несколько уровней для обеспечения корректности. Они включают в себя модульное тестирование при реализации, производственное тестирование / устранение ошибок для любых обновлений функций или изменений потока, мониторинг различных коэффициентов ошибок, коэффициентов авторизации и коэффициентов успешности; для обнаружения аномалий и настройки предупреждений, чтобы фиксировать все, что может пойти не так, как регресс из-за новых изменений. Тесная поддержка цикла продукта также помогает выявить любые проблемы, связанные с корректностью.

Помимо логической корректности, правильность поведения системы также может быть расширена до того, как обрабатываются исключения. Мы обсудим некоторые из этих концепций в следующих разделах.

Устойчивость

Второй важный аспект корректности - насколько система устойчива к внешним проблемам и ошибкам. Например, одна из наиболее важных концепций в области платежей называется идемпотентность. Это необходимо, потому что если есть инициатива повторной попытки для какой-либо неудачной транзакции, мы должны убедиться, что повторная попытка не приведет к какому-либо двойному списанию.

Обычно система сквозных платежей охватывает клиентскую сторону, серверные службы и внешних партнеров, где платежные транзакции обрабатываются на задней стороне. Все транзакции должны быть максимально атомарными. Но некоторые запросы от клиента к обслуживанию или от внутреннего к внешнему могут быть долгими, особенно в случаях тайм-аута или сбоя, и мы можем подтвердить окончательные результаты (успех / сбой) только через несколько минут или часов. Поэтому в некоторых из этих случаев мы будем инициировать повторные попытки от восходящего потока к нисходящему. Если вся сквозная попытка не обрабатывает повторные попытки должным образом, то есть система идемпотентна, неизбежно возникнет ситуация, когда одна и та же транзакция обрабатывается дважды, что вызывает двойную оплату или двойную выплату.

После обеспечения идемпотентного качества нам также необходимо убедиться, что у нас есть правильный дизайн для автоповтора, обмена сообщениями пользователей и т. Д.

Восстанавливаемость и отслеживаемость

Еще одна важная вещь, которую следует учитывать при наличии нескольких уровней от восходящего к нисходящему, - это запись данных. то есть, как мы проектируем модели данных, запись и распространение данных, чтобы гарантировать, что в случае возникновения каких-либо проблем мы сможем сделать все возможное, чтобы восстановить состояние системы и отследить, что произошло.

Платежи всегда используют как кэшированные данные для ускорения, так и постоянные данные для восстановления. Когда происходит кэширование, важно иметь правильную стратегию, чтобы указать, когда писать на какой уровень данных. Т.е. как мы распространяем данные при временном разногласии, как определять источник истины и как мы проектируем весь процесс восстановления, чтобы обеспечить в конечном итоге согласованность.

Еще один ключ к правильному сбору данных - вести надежный учет, чтобы мы всегда могли отследить, что именно произошло. Это необходимо в различных контекстах, включая финансовый аудит, регистрацию событий, необходимость расследования проблем и т. Д.

Доступность и скорость интеграции

Когда дело доходит до клиентского опыта, первое, что волнует пользователей, - это то, доступна ли им услуга. Но технический стек платежной системы состоит из нескольких уровней. Поэтому мы стараемся добавить как можно больше избыточности путем дублирования критически важных компонентов, чтобы повысить надежность наших систем.

Еще один важный аспект международной платежной системы - географический охват. Скорость, с которой мы можем добавлять новые способы оплаты в новые юрисдикции, имеет решающее значение. Чтобы ускорить интеграцию, важно иметь правильные абстракции и уровни абстракции, которые нужно фиксировать, но при этом скрывать определенные детали. Например, хорошо спроектированная абстракция - это когда она может обрабатывать как push-платежи, так и pull-платежи; использоваться для обозначения внесения и выплаты; начисление и возврат; синхронизировать платежи и асинхронные платежи и т. д.

Ремонтопригодность и масштабируемость системы

Поддержание обслуживаемости и масштабируемости платежных систем имеет первостепенное значение. Принцип KISS гласит: «Везде, где это возможно, следует избегать сложности в системе, поскольку простота гарантирует высочайший уровень принятия и взаимодействия с пользователем». Этот принцип особенно важен при проектировании платежных систем. Любая чрезмерно сложная логика или запутанный код могут вызвать загадочные ошибки в будущем.

Мы также стремимся поддерживать высококачественные модули Runbook и документы, чтобы учесть все аспекты проектирования и компромиссы. По нашему опыту, те же самые варианты дизайна могут стать предметом споров в будущем, и по этой причине документация неоценима. Большинство шаблонов проектирования в наших системах зависимы и взаимодействуют друг с другом. Каждый из этих компонентов имеет решающее значение для завершения системы. Наличие полной документации помогает новым людям понять, освоить и согласовать общие методологии проектирования.

Выше и дальше

Хотя точность важна для создания надежных платежных систем, мы также должны смотреть дальше. Предоставление клиентам возможности перемещать деньги с помощью приятного опыта - это больше, чем просто сделать транзакции безопасными и правильными. Системы сквозных платежей сложны и должны учитывать соответствие требованиям, безопасность, мошенничество и другие факторы. В этом блоге затрагиваются только некоторые базовые и высокоуровневые концепции. Однако в будущем мы поделимся другими статьями, в которых подробно обсуждаются компоненты наших платежных систем.

Если вы заинтересованы в решении сложных технических задач, подобных этой, Coinbase нанимает.