Мы создали 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 слишком медленный, и мы должны использовать что-то другое.
Так как бы вы построили такую систему кредита / баланса? Может быть, вы также знаете о некоторых решениях или примерах с открытым исходным кодом?