Как построить простую, но надежную систему предоплаченных кредитов API для микросервисного стека? - PullRequest
2 голосов
/ 22 января 2020

Мы создали API-продукт на основе микросервиса со многими различными конечными точками REST. Клиент API должен взиматься по-разному в отношении его использования различных конечных точек. Мы в основном используем spring-boot для наших сервисов с некоторыми компонентами netflix-oss в кластере kubernetes.

Например: создание задания с n задачами через конечную точку задания /jobs должно стоить n * job_creation_credit_cost кредиты. Так что этого нельзя сделать, просто отслеживая http-вызовы в нашем API-шлюзе перед всеми микросервисами.

Мы бы хотели иметь какой-то acquire в каждом микросервисе на основе идентификатора пользователя или client_id (мы используем OAuth2 с OID C и токен JWT), который возвращает, если у пользователя достаточно кредитов выполнить действие и, если да, получить необходимые кредиты для этого действия.

Поскольку мы находимся в контексте API с автоматическим доступом, могут быть тысячи параллельных запросов. Таким образом, шаги приобретения должны быть быстрыми. Также должна быть возможность возврата кредитов, если, например, впоследствии работа не удалась (мы не можем ее выполнить).

У меня были некоторые мысли обо всем этом и я думал о создании центрального микросервиса, который отвечает за кредиты / аудит и в котором хранятся текущие кредитные остатки для каждого клиента. Эта служба должна иметь некоторые конечные точки REST для получения, а также соединение с брокером сообщений, таким как RabbitMQ (поскольку мы уже используем его внутри).

Теперь каждая служба, такая как job-service, может вызывать credit-service по http (все возможные действия) или брокер сообщений (только для оплаты, а не для запроса на приобретение). Этот кредит-сервис должен быть подключен к mongodb и, возможно, также может быть перенаправлен в качестве уровня кэша, чтобы повысить производительность для некоторых действий, где это возможно, чтобы конечные точки http могли отвечать как можно быстрее (так как мы блокирование запроса клиентов).

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

Так как бы вы построили такую ​​систему кредита / баланса? Может быть, вы также знаете о некоторых решениях или примерах с открытым исходным кодом?

1 Ответ

0 голосов
/ 23 января 2020

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

...