Серверная часть написана на go 1.13 Хранение и кэширование данных реализовано в памяти приложения.
Клиентская часть находится в папке web, одностраничник, написана на HTML5 + Bootstrap + Jquery, отдается сервером golang, но отделить ее небольшая проблема.
git clone https://github.com/Delgus/def-parser.git
cd def-parser
docker-compose up --build
на http://localhost:8080 откроется приложение
make build
./app
APP_HOST= # хост сервера
APP_PORT=8080 # порт сервера
CACHE_EXPIRATION=4h # время хранения информации о сайте в кэше
CACHE_CLEAN_INTERVAL=2h # интервал с которым очищать старый кэш
MIN_PARSE_INTERVAL=1s # минимальный интервал между запросами к WebAdvisor
MAX_PARSE_INTERVAL=5s # максимальный интервал между запросами к WebAdvisor
PARSE_CLIENT_TIMEOUT=30s # таймаут для клиента парсера, сколько ждать ответа от WebAdvisor
POST /api
Params:
url
- обязательный
Response:
{
"statement_id": 1
}
POST /result
Params:
statement_id
- обязательный
Response:
{
"sites":[
{
"host":"delgus.com",
"status":"complete",
"safe":"Безопасно",
"categories":["Технические и деловые форумы"]
},
{
"host":"github.com",
"status":"complete",
"safe":"Безопасно",
"categories":["Технические и деловые форумы"]
}
]
}
status:
complete
- если уже обработан сайт,
progress
- если сайт еще в обработке
Для непрерывной доставки до клиента результата по обработке используются Server Side Events.
Необходимо подписаться на ресурс /events/{statement_id}
eventSource = new EventSource(`/events/2`);
eventSource.onmessage = function (event) {
// update page
}
Сообщения приходят в формате JSON
{
"host":"delgus.com",
"status":"complete",
"safe":"Безопасно",
"categories":["Технические и деловые форумы"]
},
SPA на jquery. Не бейте меня ногами, я больше backend, чем front)))
Архитектурно заложена возможность горизонтально масштабироваться.
Сейчас схематично архитектура выглядит вот так
Но она легко преобразуется в
Всего лишь необходимо реализовать интерфейс QueueInterface
для работы с RabbitMQ, StoreInterface
для работы с MySQL, CacheInterface
- для работы с Redis и возможно придется реализовывать свой NotifyInterface
для оповещения клиентов