No description, website, or topics provided.
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
bin
etc
resource/script
src
tests
.gitignore
Dockerfile
composer.json
composer.lock
docker-compose.yml
phpunit.xml
readme.md

readme.md

Тестовое задание PHP (Billing)

Микросервис баланса пользователей

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

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

  • Списание средств
  • Зачисление средств
  • Перевод средств от пользователя к пользователю

При проведении любой из этих операций генерируется событие в одну из очередей.

Основные требования к воркерам:

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

Будет плюсом покрытие кода юнит-тестами.

Решение

В качестве базы данных используется redis. Атомарность всех операций достигается переводом операций на сторону бд (lua скрипты). Выполнения одной операции дважды исключается скриптом resource/script/_operation_check.lua на стороне бд. В качестве системы хранения сообщений так-же используется redis.

Не реализовано

  • Сейчас в случае падения воркера можно потерять сообщение которое он не подтвердил. Оно останется в специальной очереди. Нужно сделать специальный воркер который будет подбирать эти сообщения по истичению таймаута и отправлять их обратно в очередь.
  • Для упрощения задачи считаем что все деньги в одной валюте.
  • Денежные значения всегда задаются и выводятся в колличестве центов. Можно добавить человеческое форматирование.

Запуск тестового скрпта

docker-compose scale worker=5
docker-compose up