Приложение реализует pipeline из двух звеньев. Приложение А (producer) считывает информацию из файла, сохраняет их в базу данных и отправляет их в приложение B. Приложение B (receiver) принимает сообщение и формирует текущее состояние игры. Сохраняет текущее состояние в файл. Формат текущего состояния:
match_state: {
'status': 2,
'match_status': 3,
'match_time': '92:08'
}
status (0-prematch, 1-live, 2-ended, 3-failed)
match_status (0-prematch, 1-first half, 2-second half, 3-ended)
match_score: {
“score”: {
“home_score”:1,
“away_score”:2
},
“period_scores”:[
{
“number”:1,
“home_score”:0,
“away_score”:1
},
{
“number”:2,
“home_score”:1,
“away_score”:1
}
]
}
score - счет за весь период
period_scores - счет по периодам,
number - порядковый номер периода (1 - 1st half, 2 - 2nd
half)
Каждое обновление проверяется на валидность:
- Относятся ли данные к текущему событию (event_id)
- Время и счет должны быть не меньше того, что в текущем состоянии. В случае ошибки статус матча меняется на failed и игнорируются новые обновления
Python
- Версия: 3.10
RabbitMQ Server:
- Версия: 3.11.13-management
- Версия выбрана для возможности просмотра интерфейса очередей через веб версию RabbitMQ
Просмотр интерфейса очередей доступен после запускаdocker-compose
по адресуhttp://localhost:15672/
Flake8
- Для проверки соответствия кода PEP8
- Для демонстрации функционала в качестве базы данных выбрана SQLite, также ее создание и нахождение устроено в контейнере producer. При необходимости долговременного хранения записанной информации, база данных должна быть организована в отдельный контейнер (например db) с volume
- В базу данных записываются не все поля пришедшего сообщения. Сделано это для визуального уменьшения "веса" синтаксиса сохранения в БД.
- Вывод receiver выполнен через print в терминал. При дополнительном требовании о формате выходных данных можно поменять метод класса MatchLogger на сохранение в файл, например.
-
Клонируем репозиторий:
git clone [email protected]:Andrey-Kugubaev/BetTest.git
-
Создаем файл .env и добавляем в него параметры:
DB_NAME = logs_fifa.db
DB_TABLENAME = game
RB_CONNECTION = pika.BlockingConnection(pika.ConnectionParameters(host=RB_HOST))
RB_HOST = rabbitmqServer
QUEUE_NAME = fifa_logs_queue
QUEUE_OPTS = {'durable':True}
- файл .env необходимо добавить в директории producer и receiver
-
Устанавливаем
Docker
-
Собираем
docker-compose
docker-compose up -d --build
-
Останавливаем и удаляем контейнеры:
docker-compose down -v