Сервіс - хмарне сховище файлів. Надає можливість зберігати файли, які завантажаються по посиланню. Після завантаження файлу проводить його реплікацію на інші вказані сервери, з яких він стає доступним для завантаження.
На момент публікації записки, запущені 4 сервери:
Три файлові серери в різних локаціях: Франкфурт, Нью-Йорк, Сінгапур, та один головний сервер у Франкфурті.
Однією із головних частин є те, що запит надсилається до найближчого сервера від користувача. Для цього був налаштований гео ДНС Gcore. Нижче наведена мапа, на якій показані зони дії кожного сервера.
На кожному сервері стоїть сервіс Simple CDN Server який працює наступним чином:
- Користувач через головний сервер надсилає посилання для завантаження файлу;
- Головний ервер визначає, який сервер находиться ближче до файлу та дає йому завдання завантажити файл;
- Файловий сервер завантажує та зберігає файл;
- Сервер проводить реплікацію файла на інші сервери;
- Файл стає доступним для завантаження на всих серверах.
В результаті, завантажений файл збережений на всих серверах і швидкість його завантаження менше залежить від розташування користувача завдяки багатьом серверам по світу та Geo DNS, який направляє користувача до найближчого сервера.
Подійно-орієнтована архітектура додатку спроектована із застосуванням принципу чистої архітектури, де програма була поділена на шари, залежніть між якими була організована за допомогою Dependency Injection.
Розробка проводилась по принципу TDD, де перед розробкою функціоналу спочатку розробляються тести для нього, в одночас формуються головні та додаткові, неочевидні вимоги. Для швидкого та ефективного тестування було створені шари-імітації, що дозволило ефективніше тестувати окремі частини додатку. Таким чином, тестуючи сервісний шар, де потрібно протестувати саме сервісний метод без методів адаптерів, які він викликає в собі, сервісний метод викликає натомість функції-заглушки, які повертають результат очікуваного формату, заощаджучи час тестування.
Завантаження файлу відбувається в потоковому режимі за для запобігання ситуацій, коли об'єм файлу перевищує об'єм ОЗУ, що викликає собою збій роботи сервера, що є критичним.
Для автоматичних тестів та розгортання був застосований GitHub Actions. Для контейнеризації був застосований Docker.