Декілька фактів про наш проєкт

Більшість доступних інструментів для збору даних або коштують надто дорого, або вимагають глибоких технічних знань. Наш клієнт шукав рішення, яке б дозволило його користувачам запускати проєкти без потреби створювати складні внутрішні системи чи залучати дорогих фахівців.
Основна мета – автоматизувати процес, скоротити витрати та зробити дані доступними навіть для тих, хто не має технічних навичок. Ми розробили універсальний інструмент, що дозволяє збирати великі обсяги інформації з мінімальними зусиллями.
Виклики під час розробки додатка для збору даних
Нерівномірне навантаження
Попередні рішення для скрапінгу не використовували AWS ресурси оптимально. Через неправильну організацію віртуальні машини завантажувалися нерівномірно: деякі EC2 інстанси були недовантаженими, тоді як інші – перевантаженими. Такий дисбаланс призводив до зростання витрат, особливо при масштабуванні.
Динамічний контент
Формати сайтів постійно змінюються: контент завантажується динамічно, а структуровані та неструктуровані дані можуть перемішуватися. Це стає проблемою, якщо система не здатна адаптуватися в реальному часі. Ми розробили програму, яка вміє працювати з динамічним контентом і розпізнавати закономірності у змінних структурах.
Високе навантаження на базу даних
Ще одна складність—одночасний запис великої кількості даних. Коли кілька машин одночасно оновлювали одні й ті ж записи, виникали конфлікти. Ми впровадили механізм Optimistic Locking, який контролює версії даних, щоб паралельні записи не перезаписували один одного.
Архітектура нашого рішення

Цей хмарний додаток для збору даних побудований на мікросервісній архітектурі. Такий підхід дозволяє оновлювати чи виправляти окремі частини системи без зупинки всієї роботи. Основний компонент – Mediator, безсерверний додаток, який виступає посередником між Console (веб-інтерфейсом, що використовує користувач) та бекенд-сервісами. Цей інструмент збору даних інтегрований з AWS, що забезпечує гнучкість, масштабованість та високу продуктивність.

Mediator поєднує Console з бекенд-сервісами. Коли ви надсилаєте запит через консоль, Mediator передає його потрібному сервісу та повертає відповідь. Оскільки Mediator працює за безсерверною моделлю, вам не потрібно перейматися адмініструванням серверів чи інфраструктури.

WBalancer (Work Balancer) розподіляє і збалансовує всі завдання в системі. Він перевіряє наявні віртуальні машини (NWorkers) і призначає їм невеликі завдання (чанк). Таким чином, кожна машина отримує стільки роботи, скільки може виконати на даний момент. Якщо машина закінчить раніше або почне працювати повільніше, WBalancer передає завдання іншим машинам.

WRegistry (Worker Registry) контролює роботу NWorkers у системі. Він автоматично запускає, вимикає та перевіряє їх стан, щоб вони завжди були готові виконувати завдання. Це постійне управління дозволяє уникнути збоїв у роботі системи та зменшити час простоїв. WRegistry забезпечує готовність NWorkers до виконання будь-яких завдань, незалежно від навантаження.

CRepository (Code Repository) – це безсерверний додаток, у якому створюються спеціалізовані програмні пакети, відомі як CRunner images. Ці образи виконують конкретні завдання. CRepository бере стандартний шаблон (базовий CRunner image), додає до нього спеціальні модулі для виконання завдання і поєднує все це у повноцінний програмний пакет у вигляді Docker image.

NWorker — це C#-додаток, який керує CRunners всередині віртуальної машини. Його функції включають запуск, зупинку та моніторинг стану CRunners, які безпосередньо виконують операції. NWorker стежить, щоб кожен CRunner був правильно налаштований і працював без збоїв. Він може керувати кількома CRunners одночасно в межах однієї віртуальної машини (AWS EC2 instance), що дозволяє обробляти велику кількість завдань паралельно.

CRunner (Chunk Runner) — це C#-додаток, який виконує окремі завдання. Кожен CRunner отримує конкретний фрагмент роботи (або chunk) і обробляє його. Контроль за виконанням здійснює NWorker – він стежить, щоб CRunner запускався коректно, працював без збоїв і завершував завдання належним чином. Для масштабних проєктів робота ділиться на дрібніші частини, і кілька CRunners виконують їх одночасно. Це значно прискорює обробку великих обсягів даних, оскільки система паралельно працює з багатьма фрагментами.
Технології, які ми використовували в проєкті

C#

Docker

RabbitMQ
AWS

Amplify

AppSync

SNS

Lambda

DynamoDB
