Дабы сразу не быть закиданным тапками, отмечу, что думаю над сайтом уже года пол. За это время успел написать основные методы api на php (lumen), а сейчас переписываю фронт со второго ангуляра на вью. Но самое главное - я так и не пришёл к понимаю, как правильно делать некоторые вещи. Для этого и пишу вопрос.
Теперь немного о сайте. Функционал типичный, в качестве примера можно рассматривать всем известный пикабу. Нагрузка, допустим, 6 млн просмотров в день.
Основной функционал:
1. Создание постов с тегами
2. Вывод постов по тегам
3. Наличие рейтинга у постов
4. Возможность постраничной выдачи лучших постов (за день/неделю/произвольный период)
5. Лента с горячими постами. Выдаётся тоже страницами.
6. Желательно при полном обновлении страницы скрывать посты, которые пользователь уже видел.
Самым сложным оказалось сделать грамотную ленту с горячими постами. Алгоритм ранжирования взял у реддита:
https://medium.com/hacking-and-gonzo/how-reddit-ra...
Он достаточно прост, но вот правильно внедрить его, у меня пока не хватает знаний. Сейчас остановился на том, что раз в 20-30 минут крон запускает задание по ранжированию постов и проставляет им рейтинг. Допустим, так выглядит первая десятка горячих после выполнения задания:
#5 - 100 (номер поста, индекс горячести)
#1 - 95
#2 - 90
#3 - 85
#4 - 80
#6 (и т.д)
#7
#8
#9
#10
Потом пользователь запрашивает лучшие посты и ему выдают первые пять постов : 5, 1, 2, 3, 4. Пока он их смотрим, отрабатывает задание и мы получаем новый список горячих:
#7 - 120
#8 - 115
#5 - 110
#1 - 95
#2 - 90
#3
#4
#6
#9
#10
Пользователь запрашивает вторую пятерку лучших постов, и ему в ответ приходят посты #3, 4, 6, 9, 10. То есть ему будет отправлено два поста, которые он уже видел, и два поста #7 и #8 он пропустит, т.к. они уже вылезли в топ.
Конечно, можно сохранять посты, которые уже были отданы пользователю, номер сессии. А дальше скулем выгребать первые 1000 горячих постов, посты, которые уже были выданы пользователю, и отдавать первые 20 свежих постов. Но на такие подвиги, мне кажется, не хватит никакой производительности и дискового места.
Также непонятно, как хранить уже просмотренные пользователем посты. Не в скуле же?
Возможно, php и скуль уже устарели и для этой задачи логично использовать NoSQL и какой-нибудь node.js вместо php?
В общем, нужен совет знающего архитектора)