Wikipedia — общедоступная многоязычная универсальная интернет-энциклопедия со свободным контентом, реализованная на принципах вики.
За март 2022 года сервис насчитывает 5.3 млрд посетителей сайта в месяц [2] или около 170 млн посетителей в день.
Топ 5 стран которые, чаще других посещают Wikipedia [2]:
- Соединённые штаты - 23.99%
- Япония - 5.81%
- Великобритания - 5.48%
- Германия - 5.41%
- Россия - 5.01%
- Регистрация и авторизация
- Чтение статьи
- Поиск статьи по названию по поисковой строке
- Поиск статьи по ключевым словам по поисковой строке
- Создание статьи
- Редактирование статьи
- Месячная аудитория - 5.3 млрд [2]
- Суточная аудитория - 170 млн [2]
- Среднее количество страниц за визит - 3.11 [2]
- Средняя продолжительность визита - 3 минуты 55 секунд [2]
Сводная таблица количества действий пользователя по типам в день [3]
Тип запроса | Количество (разброс) | Среднее количество |
---|---|---|
Регистрация и авторизация | 0-1 | 0.0003 |
Чтение статьи | 1-5 | 3.107 |
Поиск статьи по названию | 0-2 | 0.001 |
Поиск статьи по ключевым словам | 0-2 | 0.001 |
Создание статьи | 0-1 | 0.00000012 |
Редактирование статьи | 0-4 | 0.000094 |
Согласно данным Kiwix [4] весь контент Wikipedia на текущий момент весит 30.9 Гб или 0.03 Тб. Из них примерно 5/6 - статический контент (изображения, видео и др), а оставшиеся 1/6 - текст. Пользователей не считаем, так как их много меньше чем статей и, как следствие, занимают они сравнительно немного места.
- Статический контент - 25.75 Гб или 0.026 Тб
- Текст - 5.15 Гб или 0.0052 Тб
- Общее количество посещений страниц в месяц =
5.3*10^9 * 3.11 = 16483*10^6 pages/day
- Средний вес статьи =
100 Кб
[5]
Таким образом, получаем:
- Суммарная сетевая нагрузка (Гб/сутки) =
16483*10^6 * 100 / (30 * 1024) = 53.7*10^6 GB/day
- Средняя сетевая нагрузка (Гб/сек) =
53.7*10^6 / (24 * 60 * 60) = 621.01 GB/sec
Пользователь сервиса в среднем совершает 3.11 операций.
Следовательно, RPS = 5.3*10^9 * 3.11 / (30 * 24 * 60 * 60) = 6359
Тип запроса | Чтение/запись | RPS |
---|---|---|
Регистрация и авторизация | Запись | 0.6 |
Чтение статьи | Чтение | 6353 |
Поиск статьи по названию | Чтение | 2 |
Поиск статьи по ключевым словам | Чтение | 2 |
Создание статьи | Запись | 0.00024 |
Редактирование статьи | Запись | 0.19 |
Отдельно стоит обратить на условные обозначения, которые можно увидеть на схеме выше, напротив полей таблиц.
- Ключ - Primary key
- Снежинка - Unique поле
- Булавка - Index
Помимо этого, предполагается, что первичный ключ и уникальные поля являются индексами.
Подробнее о том, какие базы были выбраны для реализации логической схемы, указано в пункте 5 (Технологии).
Технология | Область применения | Причины выбора |
---|---|---|
Golang | Backend | Встроенная поддержка многопоточности, легковесность, удобная интеграция с внешними зависимостями |
Gin | Фреймворк для бэкенда | Один из самых быстродейственных web-фреймворков для Go и при этом один из самых поддерживаемых |
Redis | Хранение сессий | Крайне высокая скорость работы с данными сессий |
PostgreSQL | Хранение пользователей, статей и др. | Обширный функционал, эффективная репликация |
HTML + CSS + TypeScript | Frontend | Рабочая связка для написания высокоэффективных веб-сервисов |
React | Frontend | Модульность, быстрый рендеринг, высокая run-time производительность |
HTTPS | Протокол связи между фронтендом и бэкендом | Общепризнанный вариант относительно безопасной передачи данных |
JSON | Метод передачи данных между фронтендом и бэкендом | Удобное чтение и запись, поддержка многими языками |
Для обеспечения балансировки нагрузки будем использовать nginx с использованием схемы L7.
Это позволит равномерно распределить нагрузку и решит проблемы медленных клиентов.
Также nginx имеет внутренние инструменты для настройки SSL терминации.
Алгоритм работы кэширующих прокси: для обеспечения высокого попадания в кэш запрос за одной и той же статьей всегда должен приходить на один и тот же прокси. Будем выбирать прокси по хэшу запрашиваемого url, для обеспечения нормального горизонтального масштабирования будем использовать consistent hashing.